Java面向对象(基础)笔记
方法重载
- 方法名:必须相同
- 参数列表:必须不同(不同体现在个数或者顺序,参数名没有要求)
- 返回类型:没有要求
方法中可变参数
使用细节
代码
public class Main {
public static void main(String[] args) {
T t = new T();
// 1. 可以数组传入
int[] a = {1, 2, 3};
System.out.println(t.sum(a));
// 2. 正常多个参数也可以
System.out.println(t.sum(1, 2, 3, 4));
// 3. 0个参数也可以
System.out.println(t.sum());
System.out.println(t.sum(2.1, 1, 0));
}
}
class T {
public int sum(int... nums) {
int res = 0;
for (int i = 0; i < nums.length; ++i) {
res += nums[i];
}
return res;
}
// 可变参数有且只能有一个并且必须放在最后
public double sum(double a, int... nums) {
double res = a;
for (int i = 0; i < nums.length; ++i) {
res += nums[i];
}
return res;
}
}
变量作用域
全局变量(可以不用赋值)、局部变量(必须赋值)
使用细节
构造器细节
构造器并不是完成对象的创建,而是完成对象的初始化。
创建对象流程
注意属性初始化分三步走:默认初始化,显示初始化,构造器初始化
this关键字
本质
使用细节
- this关键字可以用来访问本类的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问成员方法的语法:this.方法名(参数列表)
- 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)
- this 不能在类定义的外部使用,只能在类定义的方法中使用
访问修饰符(记忆)

super关键字
使用细节
- 隐式super:当创建子类对象时,不管使用子类的那个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去显示地指定父类的某个构造器进行初始化,否则编译不会通过。
- super 在使用时,必须放在构造器第一行(super只能在构造器中使用)
- 当子类对象试图访问父类的属性或者方法时,按照继承关系,逐级向上查询,一旦存在因为访问权限问题无法访问的情况(不能访问父类的private属性或者方法),直接报错,不会再向更上一级进行查询访问。

继承链方法查找顺序
- 如下图所示,当子类中使用this.方法名或者直接方法名时,会从子类逐级向父类查找,但是如果使用super.方法名,访问顺序就跳过当前类,直接从父类开始查找。
super与this的比较
- super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
- this()和super()都指的是对象,所以,均不可以在static环境中使用
qa:为什么在构造器中不能同时this()和super()?
嗯。它们俩个都要求放在首行,所有不能同时使用了。但想想哦,它们是否需要同时出现呢?在构造器同级用this()调用时,最后肯定有一个“出口”,(总不能用this()循环调用闹着玩bug吧)那么,这个构造器“出口”中肯定没有this(), 它的首行其 实有一个隐式super(),指向上级父层构造器,当然你也可以指定成调用带参构造器(如super(int i))。 或者也可以这么看,当构造器中this()时,就会先进行同类构造器间的调用,如果没有this()时,就会默认有一个隐式super(),对上级父类构造器调用。
方法重写
注意事项
方法重载和重写的区别

多态
需要了解编译类型和运行类型的区别。
多态中属性的值看编译类型,方法的执行看运行类型。
注意事项

isinstanceOf操作符
判断的是一个对象的运行类型是不是xx类型或者xx类型的子类型。
动态绑定机制
见笔记[Java动态绑定机制 ](

浙公网安备 33010602011771号