[Thinking in JAVA] 多态和继承的这潭深水

1.父类中的private方法是不能被子类覆盖的,即隐藏了final关键字。如果子类中有和父类同名的方法,且父类的方法是private,那这两个方法只是名字相同,并没有任何关系。


2.面向对象的三个特征:封装,继承,多态。


3.Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定(即动态绑定)。

    JAVA中所有方法都是通过动态绑定实现多态。


4.只有普通的方法调用可以是多态的,如果直接访问某个域,这个访问在编译期进行解析。

   即Base base=new Sub();    base.field的值是Base类中的field的值(假定是public的)。

   如何避免这种尴尬:

            把域设置为private,只提供get/set方法。


5.静态方法不具备多态性。因为静态方法是与类,而并非与单个的对象相关联的。


6.如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,那调用的就是子类的那个方法,这将招致灾难。

   因为此时子类的成员尚未被初始化,如果在那个方法中用到了成员,那基本类型会有默认值(如int型是0),而对象类型是null,所以可能会引发空指针错误。

  如代码

class Demo {
   public void haha(){
	   System.out.println("haha");
   }
}
class Base {
	public Base() {
        this.tt();
	}
	void tt() {
	}
}
class Sub extends Base {
	private Demo demo=new Demo();
	public Sub(){}
	void tt() {
         demo.haha();
	}
}
public class A {
	public static void main(String args[]) {
         Sub base=new Sub();
         base.tt();
	}
}
会报错:

Exception in thread "main" java.lang.NullPointerException
at test.Sub.tt(A.java:18)
at test.Base.<init>(A.java:9)
at test.Sub.<init>(A.java:16)
at test.A.main(A.java:23)

那如何避免这种情况呢?记住编写构造函数的一条有效的准则:

用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法。在构造器内唯一能安全调用的方法是基类的final方法(和private方法)。


7.协变返回类型

   在子类重写父类的方法时,可以修改返回类型。 比如父类的方法return Base类的对象,那子类的方法中可以return Sub类的对象。


8.在不知道该用继承还是组合时,首选组合。因为组合更灵活,它可以动态选择类型,相反,继承在编译时就需要知道确定类型。使用组合可以在运行时改变引用的类型,但我们不能再运行期间决定继承不同的对象,因为它要求在编译期间完全确定下来。


9.向下转型与运行时类型识别

   比如    (Sub)base,把声明为父类对象的引用转换为子类对象的引用,会在运行时进行类型检查,这种在运行期间对类型进行检查的行为称作运行时类型识别(RTTI)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值