第8章 多态

  1. 多态机制得以实现的前提是后期绑定,即在运行时根据对象的类型进行绑定,所以后期绑定也叫做动态绑定或运行时绑定。
  2. java中除了static方法和final方法(private方法属于final方法)之外,其他所有方法都是后期绑定。因为static方法由类名调用,final方法不能被覆盖,这两种方法都不需要在运行时判断究竟是谁在调用它们,它们的调用者是前期确定的。
public class Test11 {
    public static void main(String[] args) {
        SuperClass11 sub = new SubClass11(); // 向上转型
        SubClass11 sub2 = sub.method1(); // method1调用父类的,而method2调用的是自己的,神奇!
        /* 输出结果:
        父类方法1执行
        子类方法2执行
         */
    }
}

class SuperClass11 {
    public SuperClass11() {

    }
    // 调用method2,返回一个SubClass11对象
    public SubClass11 method1() {
        System.out.println("父类方法1执行");
        return method2();
    }
    // 返回一个SubClass11对象
    public SubClass11 method2() {
        System.out.println("父类方法2执行");
        return new SubClass11();
    }
}

class SubClass11 extends SuperClass11 {
    public SubClass11() {

    }
    // 重写父类method2
    @Override
    public SubClass11 method2() {
        System.out.println("子类方法2执行");
        return new SubClass11();
    }
}
  1. 只有非private方法才可以被覆盖,所以在子类中,对于父类的private方法,最好采用不同的名字。
class PrivateOverride {
    private void m() {
        System.out.println("父类m方法执行!");
    }

    public static void main(String[] args) {
        PrivateOverride sup = new Derived();
        sup.m(); // 父类m方法执行!
    }
}

class Derived extends PrivateOverride {
    public void m() {
        System.out.println("子类m方法执行!");
    }
}
  1. 只有方法调用是多态的,如果直接访问某个域,这个访问就将在编译期进行解析。
  2. 编写构造器时有一条有效准则:“用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法”。在构造器内唯一能够安全调用的是父类的final方法(private方法也是final方法),因为其不能被覆盖,而若是调用了可以被覆盖的方法,并且子类已经将该方法重写,此时调用的就是子类的方法,但是此时子类中的成员变量还没有初始化,若子类该方法中使用了成员变量,调用该方法将会导致灾难(成员变量未初始化时默认0值或null)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值