目录
4.2.1 if if-else if-else if - else
Java基础知识点总结归纳,超级全面!(2021版)_java复习基础-CSDN博客
1、JVM、JRE和JDK
2、IDEA使用
(1)IntelliJ IDEA中右键新建时,选项没有Java class的解决方法和具体解释:
IntelliJ IDEA认为这个文件不是 项目/模板 ,虽然项目或者模板其实也是一个文件夹,但是你要让IntelliJ IDEA知道这是一个可以创建Java class类的文件(项目 / 模板):请File—>Project Structure—>Modules。选择刚才的包,单击Sources。添加到源中
(2)运行流程:我用的JDK11
3、数据类型 运算符
3.1 基本数据类型
数值类型
浮点类型:默认小数点是双精度double,所以float=1.0会报错,需要指定是单精度float f=1.0f或F
字符类型:使用符号标识文字char c = '@';
布尔类型:true false
基本数据类型之间的转换:
byte不能转char,因为char无负数
3.2 引用数据类型
即可以被引用的数据类型
String s = “abc”; 但要注意int i = 10不称为引用数据类型,应为后者10直接写在了i的地址中,而s中写的是abc的地址,算是一种引用。
3.3 运算法
4、流程控制
4.1 顺序执行
代码出现的先后顺序和语法的先后顺序
4.2 分支执行
4.2.1 if if-else if-else if - else
4.2.2 switch
这是一种等值判断
i = 10,匹配到第一个,接下来就是从输出分支1开始顺序执行,输出分支2 分支3;若i=20,输出分支2 分支3;因为没有写break;都不匹配直接全跳过,可以在最后加上default。
4.3 重复执行
4.3.1 while
while(true){
循环代码;
}
先判断再执行,直到()中为false才结束
4.3.2 do...while
do {
循环代码;
}while(true)
先执行再判断,直到()中为false才结束
4.3.3 for
还有一种 for 的写法:
4.3.4 break continue
break:跳出整个循环
continue:跳过本循环
break 跳出总上一层循环,不再执行循环(结束当前的循环体)
continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
5、面向对象
5.1 类和对象
等号左边声明了一个变量,右边创建了一个对象,然后将对象赋值给了变量,可用下图表示:
5.2 属性
5.3 方法
5.3.1 方法中的参数
1、不传参数
2、基本的传参,考虑传参个数,顺序,类型
3、存在可变参数(即,有好几个参数但数目不定,类型相同)
5.3.2 变量作用域
输出10,因为传的是形参,test()执行结束后,该函数内部的i就释放了,对main中的i没有影响!
5.3.3 静态static
- 被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。
- 在该类被第一次加载的时候,就会去加载被static修饰的部分,而且变量只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。
- static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!(这句话在单例模式中再一次深刻体现出来!)
- 被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。
1、使用方法
2、静态 和 非静态 的关系
(1)先有类 再有对象!!!
使用时,对象也能访问静态属性和方法——原因先有类 再有对象!!!
class中定义方法时:
非静态方法可以调用静态属性和方法——原因非静态的方法时面向对象的,使用时一定是对象打点访问,而有对象就是有类了。
静态方法可能调用非静态属性或方法吗?—— 不能。因为使用类调用时,未必有对象。
(2)代码块
类被第一次加载的时候(创建对象就会加载类,或是直接使用类名调用静态函数或属性),就会去加载被static修饰的部分(注意只有第一次加载类才会调用),但“代码块执行1”不会输出,因为不是静态的。“代码块执行1”在每次创建对象时,会自动调用。
5.4 包
5.4.1 package
5.4.2 import
import是用来导入其他包中的类的
5.5 构造函数
在使用new创建对象时,也就是在构建对象,需要调用一个构造函数,所以上图中划横线的()就是在调用构造函数,是一个无参数的构造函数。
若有参数,在new时需要传参;
!代码块,是在构造对象之前执行的
5.6 继承 Extends
5.6.1 基本语法
1、当父类和子类中存在名字一样的属性时:super & this
默认,this省略。
当父类和子类中存在一样方法时,方法重写。
2、父类对象是在每个子类对象创造前创建
所以,创建对个子类对象时,每个对象都会链接到一个父类对象上(只是这样说,实际是内存分配的问题)
运行结果:其实是因为在调用子类的构造函数Child2()时,JVM默认执行的第一条指令不是输出child这一行,而是隐藏了的 super(); 这一行的含义是调用父类的构造函数。
所以如果父类自己定义了构造函数,且有参数时,需要在子类的构造函数中显式的使用super方法构建父类对象,传入合适的参数。
5.6.2
5.7 多态
三种Person对象的创建都可以,因为子类已经继承了父类。通俗说就是把子类当做父类用
但是使用p1或p2来调用子类中特有的函数或属性就不对了,因为这两个对象是Person,不具备子类特有的内容
所以 —— 多态语法其实就是对对象的使用场景进行了约束!
—— 一个对象可以使用的功能取决于引用变量的类型!
5.8 方法重载
1、构造函数也存在方法的重载!
2、如果想要在一个构造函数中调用其他构造函数,使用关键字 this:
3、基本数据类型在匹配方法时,可以在数值不变的情况下,扩大数据精度
此时输出:bbb
如果把方法1删了,那么输出sss(找不到匹配的类型,逐步扩大精度,byte是4bit,short是16bit,int是32bit);再把方法2也删了,输出iii(byte不能转char)。
注意这是对于基本数据类型而言,如何是类对象找不到合适的,会向前找父类。ex没截图。P54中
5.9 方法重写
父类和子类有一样的方法(注,方法一样说明参数也一样哦!要不然不是一个方法),怎么办?
当然也能像属性一样使用super:
方法重写的要求:子类父类方法相同,名一样,返回值类型一样,参数列表一样。
所以构造方法可以重写吗?—— 不能,名字就不一样。
易错点:
创建对象:
CCC ccc = new CCC(); System.out.println(ccc.sum()); 输出:20
DDD ddd = new DDD(); System.out.println(ddd.sum()); 输出:40
CCC ccc = new DDD(); System.out.println(ccc.sum()); 输出:40
根据上面两句高亮的话,ccc是CCC类型,所以可以使用sum,但是具体如何用,看ccc是什么对象,是DDD对象,所以实际运行的是DDD中的sum。
(方法:编译看左,执行看右)
如果删去DDD中的sum呢?输出:20
原因——上面图中没有高亮的两句话。ccc在使用属性变量时能使用什么属性仍然看类型,因为是CCC类型,所以可以使用变量i,但如何使用和方法的规则不同了,变量的使用不看对象,在哪里声明在哪里使用!即因为调用的是父类的sum,而父类的sum中的 i 是在父类中声明的,所以i=10,结果为20。同样在没删子类sum时,执行的是子类的sum,子类sum中的 i 是在子类中有声明的,默认是 this.i 哦(若子类没有声明,继承父类的i=10),所以i=20,结果为40.
如果父类子类改为:
CCC ccc = new DDD(); System.out.println(ccc.sum()); 输出:30
因为——方法直接或间接调用都是:能不能用看类型,怎么用看对象!
所以sum执行的是CCC中的,但是因为ccc是DDD对象,getI()仍是先从子类找起,子类有,所以执行的是子类的getI(),此时getI中的 i 也是this.i,即子类声明的 i=20。
5.10 递归
求等差数列:
5.11 访问权限
函数内定义的变量只在该函数内{ }起作用,在函数内找变量,先看自己函数内有没有,包括参数。
对于class的属性:
4中权限依次增大
public
所以main方法需要是public,又因为main方法不需要创建类对象就能调用执行,所以必须加上static,如果取消,可以发现main无法直接执行了,需要创建对象来调用。
default
默认,当前包下,这与父包子包无关,必须是当前路径
protected
子类可以访问,即使是不同包的子类也能。
指的是子类class内部可用,但若是在又在另一个class中创建了该子类对象,再用对象访问protected,不可行:下图自己悟吧,所有类默认继承Object类。
public
5.12 内部类

5.13 单例模式
在上面1和2的情况下,会考虑将构造函数设置为private,禁止随意创建对象。
所以又写了一个public的static的创建对象函数,可以在main中使用类名直接调用来创建对象,
但如果是这样的: