多态
向上转型:父类引用子类对象
父类只能调用父类自己的方法,不能调用子类所特有的方法
运行时绑定(多态):
- invokespecial:构造方法
- invokevirtual:实例方法
- invokestatic :静态方法
重写(override):方法名相同、参数列表相同、返回值相同
注意事项:
1.方法不能是private
2.子类方法权限一定要大于父类方法权限
3.重写的方法不能是静态的方法
重载(overload):方法名相同、参数列表不同、返回值不做要求
发生多态的条件:运行时多态
-
继承-》父类需要引用子类对象(向上转型)
-
通过父类引用去调用子类和父类同名的覆盖方法
class对象在方法区
class是和类型一一对应的,一张方法表
向上转型发生的时机:
-
直接赋值
-
方法传参
-
方法返回
向下转型:父类给子类
- 类型转换异常:ClassCastException
- 向下转型时必须发生过向上转型
- a instanceof b ==》 b是a的实例
Animal animal=new Bid();
if(Animal instanceof Cat){
Cat cat=new Animal();
}
1.重写和重载的区别?
从概念、范围、限制回答
2.this和super的区别?
构造方法内是否可以发生运行时绑定?
class B {
public B() {
func();
}
public void func() {
System.out.println("B.func()");
}
}
class D extends B {
private int num = 1;
@Override
public void func() {
System.out.println("D.func() " + num);
}
}
public class Test {
public static void main(String[] args) {
D d = new D();
}
}
// 执行结果 D.func() 0
D.func() 1
-
构造 D 对象的同时, 会调用 B 的构造方法.
-
B 的构造方法中调用了 func 方法, 此时会触发动态绑定, 会调用到 D 中的 func
-
此时 D 对象自身还没有构造, 此时 num 处在未初始化的状态, 值为 0
ctrl+o 重写