Java基础部分
Java是一种一次编译,到处运行的语言 Java是一种面向对象的编程语言 Java有一个很大的优势在于有自动回收垃圾的机制
为什么要为JDK设置环境变量
在cmd中可以在任何地方调用JDK指令
JDK、JRE、JVM
JDK是Java开发工具包 JRE是Java运行环境 JVM是Java虚拟机 JDK=JRE+java开发工具(javac.exe(编译)、java.exe(运行)) JRE=JVM+核心类库
Java的关键字和保留字
Java中有很多关键字,保留字是指以后的版本可能会用到(goto和const) 在Java中变量的名字不能关键字或者保留字
Java的数据类型
Java是一种强类型语言
强类型和弱类型
强类型语言:是指强制要求为变量设置类型,在编译前就把数据类型进行确定 弱类型语言:是指是在编译后确定数据类型,没有明显的类型,随着环境的不同,自动变换类型。var a=10;编译前无法确定它的类型。
一共有两种。一种是基本类型,另一种是引用类型
基本类型包括:
byte、short、int、long、float、double、char、boolean
注意:
- Java中char的范围和c语言中char的范围有区别Java中char占用两个字节,范围是0–65535。
- 1byte=8bit;
- long a=12; float b=12;这两种情况不会报错,是因为自动提升的原因
自动提升以及强制转换
自动提升
基本类型中容量小的和容量大的一起运算时,会发生自动提升现象 注意:float的范围比long的还要大。是因为它们底层的存储结构不同。float/double使用科学计数法来存储,而long使用普通的二进制来存储,也就是说一个存的是多少次方,而一个是只有多少位。
强制准换
是指在大容量向小容量转换时发生的,在强制转换时会有精度损失
注意:类型转换都是基本类型之间的,String不能和基本类型之间进行转换,但是包装类可以和String进行转换
有byte、short、char的混合运算时结果都为int类型
引用数据类型包括
String、Array、Interface
Java文件的执行过程
Java的核心
- JVM
- 垃圾回收机制:自动监测对象是否超过作用域(可达性分析和引用计数),进行回收
Java为什么能够跨平台
Java语言的运行依赖于JVM,不同的操作系统有不同的JVM
JVM的组成
类加载子系统、运行数据区(内存)、执行引擎、本地接口库,本地方法库
运行时数据区包括:堆、JVM栈、程序计数器、方法区、本地方法栈
JVM栈:用来存储局部变量、对象引用 堆:存放对象实例,用来存储新创建的对象以及数组 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。有个静态域,用来存储被static修饰的静态方法属性或方法。
运算符
short s=2;
s=s+2;
s+=2;
System.out.println("hello" instanceof String);
&:逻辑与
&&:短路与
|:逻辑或
||:短路或
^:异或。相同为0不同为1
!:非
<<左移,相当于*2
>>右移,相当于/2
&与运算,都1为1
|或运算,有1为1
^异或运算 110^011=101==>5
~取反运算 ~6=7 (补码)0110<==>(补码)1001==>0111(源码)==>7
int a=a>60?a:0;
- 运算符优先级
流程控制
- 顺序结构
- 分支结构 :if……else…… switch( ) case:
- 循环结构:for、where
数组
数组是一种能存储相同数据类型,但是需要占用连续空间数据结构。需要注意的是:长度一旦确定,就不能再进行修改。
注意:数组的索引是从0开始的而数据库库的索引是1开始的,在连接数据库时需要注意。
二维数组
就是两个一维数组组成的数组栈中的引用指向堆,堆中存的也是一个引用
算法中数组的应用
- 数组元素的赋值(杨辉三角、回形数等)
- 求数值型数组中元素的最大值、最小值、平均数、总和等
- 数组的复制、反转、查找(线性查找、二分法查找)
- 数组元素的排序算法(稳定性)A和B相等排序后,A和B的次序不变(应用:商品首先根据销量排序,再根据价格排序,就需要排序的稳定性)
oop–万物皆对象
在Java中将功能结构封装在类中,通过类的实例化来调用具体功能结构
主流编程语言要么是面向过程(强调考虑怎么做),要么是面向对象(强调谁来做)。程序员从面向过程的执行者转化成了面向对象的指挥者
举个栗子:把大象装进并冰箱
类:是指对一类事物的概括。 对象:是指存在的一个真实个体
对象一般通过new来创建。类名 对象名 = new 类名(); 如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰
A a=new A();
A b=a;
oop三大特性
- 封装:将属性或方法封装起来,给外界流出访问他的接口,不展现具体细节
- 继承:一个子类继承一个父类,能够直接调用父类的非私有属性和方法,通过set、get也能访问私有属性。
- 多态:分为运行时多态(overload)和编译时多态(override),多态的三个必要条件 :1.要有继承(实现implements) 2.要有重写(overWrite&overRide) 3.父类引用指向子类对象
封装
将方法和属性进行私有化,对实现细节进行隐藏,只暴露出供外界使用的接口
封装的体现:将属性进行私有化,然后通过set和get对属性进行设置和获取
继承
Java是单根继承,一个子类只能继承一个类。但是可以实现很多个接口
说明:所有的子类都会直接或间接继承Object类
多态
重载 System.out.println()方法就是典型的重载方法,其内部的声明形式如下:
public void println(byte x)
public void println(short x)
public void println(int x)
public void println(long x)
public void println(float x)
public void println(double x)
public void println(char x)
public void println(double x)
public void println()
public int A(int i);
public double A(int i);
public int A(int i);
public double A(double i);
对象的内存解析
对象数组的内存解析
成员变量(属性)和局部变量
形同点:
- 定义变量的格式相同
- 都是先声明后使用
- 都有相应的作用域
不同点:
- 属性定义在类下,局部变量定义在方法,构造器等内部
- 属性可以用权限修饰符,局部变量不可以用权限修饰符
- 属性加载到堆中,局部变量加载到栈中
- 属性有默认初始值,局部变量没有初始值
对象数组
引用类型:无论是系统提供的还是用户自定义的,在调用时都需要进行实例化来使用
Students []stu=new Students[20];
int n=sc.nextInt();
for(int i=0;i<n;i++){
stu[i]=new Student();
}
Java中参数传递
Java只有值传递
- 当传递类型是基本类型时,传递的就是参数真实的值,在方法中对值进行修改,不影响本身的值
- 当传递类型时引用类型时,传递的就是地址的值,在方法中进行修改数据时,会影响本身的值
不是说只要传递的参数是引用类型的就会修改数据的值,他的大前提是传递前后两个引用指向的是同一块内存。
举个栗子:
String s="hello";
Test test=new Test();
test.change(s);
System.out.println(s);
匿名内部类
就是没有名字的一种嵌套类,一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。
假设当前有一个接口,接口中只有一个方法
public interface Interface01 {
void show();
}
为了使用该接口的show方法,我们需要去创建一个实现类,同时书写show方法的具体实现方式
public class Interface01Impl implements Interface01{
@Override
public void show() {
System.out.println("I'm a impl class...");
}
}
如果实现类Interface01Impl全程只使用一次,那么为了这一次的使用去创建一个类,未免太过麻烦。我们需要一个方式来帮助我们摆脱这个困境。匿名内部类则可以很好的解决这个问题。
我们使用匿名内部类
public static void main(String[] args) {
Interface01 interface01 = new Interface01() {
@Override
public void show() {
System.out.println("这里使用了匿名内部类");
}
};
interface01.show();
}
构造器constructor
构造器非为默认构造器和默认构造器,系统会提供一个默认构造器。 构造器与非构造器之间是重载关系
想要调用另一个类的方法,就需要将类实例化成对象然后调用类里面的方法和属性
this关键字:指向本地的属性、方法和构造器
- 在类的构造器中,可以使用this()调用本类的其他构造器,在用this进行调用构造器时必须放在第一行
marry(Girl girl){
System.out.println("I Love girlA");
}
marry(Boy boy){
System.out.println("I Love boyA");
boy.marry(this);
}
this.name = name;
Java常用的方法解释
compare()方法
- 当前对象和传入对象相同,返回0
- 当前对象大于传入对象,返回正数
- 当前对象小于传入对象,返回负数
|