学习笔记(四)多态

《Java编程思想》整理的一些学习笔记,有不对的地方,欢迎指出。
1.个人理解多态:假设编写一个方法,它仅接受基类作为参数,虽然向上转型使得我们可以用导出类当作基类使用,但是我们不去使用导出类对象,仅仅和基类打交道,这样我们就不用在导出类里重写这个方法,省去大量不必要的代码。由于导出类重写基类方法,然后用基类引用指向导出类对象,调用方法时候会进行动态绑定。Java中所有的方法都是通过动态绑定实现多态,动态绑定是自动发生的,编译器不需要任何特殊的信息就可以进行正确的调用。可以通过利用final声明方法,来关闭动态绑定。
2.抽象类里面可以有常量和变量,有抽象方法和非抽象方法。Java接口中只能有常量,不可以有变量。抽象类里面的抽象方法在子类中必须实现,不然会使子类也变成抽象类。即一个类包含一个或多个抽象方法,该类必须被限定为抽象的。当我们想创建抽象类的对象时,编辑器会报错。
3.初始化顺序。首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法;最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法;
4.如果基类中没有缺省构造器,只有带参构造器,子类构造器中必须调用基类构造器。
5.构造器工作粗略过程:分配对象空间,将空间内存初始化为二进制的零,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
然后执行属性值的显式初始化(这里有一点变化,一会解释,但大体是这样的)。接着执行构造器
,最后将变量关联到堆中的对象上。构造器中要避免调用其他方法,在构造器中唯一能够安全调用的那些方法是基类中的final方法(也适用于private方法,它们自动属于final方法)。因为这些方法不会被覆盖。
6.编译期间只是进行语法分析,检查是否有语法错误,而运行期间则是在分配内存。二者的区别在于在编译时可能不会出现错误,但在运行时可能会出现栈满等错误。继承要求在编译期间就知道确定的类型,因为我们不能在运行期间决定继承不同的对象。而组合则比较灵活,因为它可以动态选择类型。
7.如果想进行向下转型,在进入运行期时仍然会对其进行检查,以便保证它的确是我们希望的那种类型,如果不是则会返回一个ClassCastException(类转型异常)。这种方法成为“RTTI”。如下例:

class A{
public void a(){
System.out.println("A");
}
}
public class C extends A{
public void a(){
System.out.println("a");
}
public void b(){
System.out.println("b");
}
public void c(){
System.out.println("c");
}
    public static void main(String[] args){
    A a = new C();
    A b = new A();
    ((C)b).b();                   //编译没错,运行时出现异常
    ((C)a).b();                   //向下转型成功,输出b
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值