Java学习笔记Day12:多态

多态

向上转型:父类引用子类对象
父类只能调用父类自己的方法,不能调用子类所特有的方法

运行时绑定(多态)

  • 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 重写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值