学习笔记(四)多态
来源:互联网 发布:淘宝是怎么赚钱的 编辑:程序博客网 时间:2024/05/19 18:48
《Java编程思想》整理的一些学习笔记,有不对的地方,欢迎指出。
1.个人理解多态:假设编写一个方法,它仅接受基类作为参数,虽然向上转型使得我们可以用导出类当作基类使用,但是我们不去使用导出类对象,仅仅和基类打交道,这样我们就不用在导出类里重写这个方法,省去大量不必要的代码。由于导出类重写基类方法,然后用基类引用指向导出类对象,调用方法时候会进行动态绑定。Java中所有的方法都是通过动态绑定实现多态,动态绑定是自动发生的,编译器不需要任何特殊的信息就可以进行正确的调用。可以通过利用final声明方法,来关闭动态绑定。
2.抽象类里面可以有常量和变量,有抽象方法和非抽象方法。Java接口中只能有常量,不可以有变量。抽象类里面的抽象方法在子类中必须实现,不然会使子类也变成抽象类。即一个类包含一个或多个抽象方法,该类必须被限定为抽象的。当我们想创建抽象类的对象时,编辑器会报错。
3.初始化顺序。首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法;最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法;
4.如果基类中没有缺省构造器,只有带参构造器,子类构造器中必须调用基类构造器。
5.构造器工作粗略过程:分配对象空间,将空间内存初始化为二进制的零,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
然后执行属性值的显式初始化(这里有一点变化,一会解释,但大体是这样的)。接着执行构造器
,最后将变量关联到堆中的对象上。构造器中要避免调用其他方法,在构造器中唯一能够安全调用的那些方法是基类中的final方法(也适用于private方法,它们自动属于final方法)。因为这些方法不会被覆盖。
6.编译期间只是进行语法分析,检查是否有语法错误,而运行期间则是在分配内存。二者的区别在于在编译时可能不会出现错误,但在运行时可能会出现栈满等错误。继承要求在编译期间就知道确定的类型,因为我们不能在运行期间决定继承不同的对象。而组合则比较灵活,因为它可以动态选择类型。
7.如果想进行向下转型,在进入运行期时仍然会对其进行检查,以便保证它的确是我们希望的那种类型,如果不是则会返回一个ClassCastException(类转型异常)。这种方法成为“RTTI”。如下例:
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
- 学习笔记(四)多态
- 学习笔记(四)
- 学习笔记(四)
- 学习笔记(四)
- 学习笔记(四)
- 学习笔记(四)
- 学习笔记(四)
- java学习笔记<四>多态
- C#学习笔记(四)
- 数据库学习笔记(四)
- Duwamish7学习笔记(四)
- J2ME学习笔记(四)
- Java学习笔记(四)
- C#学习笔记(四)
- GWT学习笔记(四)
- dojo学习笔记(四)
- C++学习笔记(四)
- ant学习笔记(四)
- poj3254 Corn Fields
- 电脑加加速程序(TSKILL清理进程批处理CMD)
- 第十五周oj刷题——Problem A: 长方柱类【C++ 类定义】
- HTTPS 客户端发送请求(三)
- SQL Server DBA三十问
- 学习笔记(四)多态
- 集合
- OGRE 1.7以上版本实现鼠标查询(非CEGUI)
- Hive Join
- JAVA类加载和初始化
- 黑马程序员--我的基础测试题及答案
- ECMAScript 6 中的 String 新特性
- 双边滤波原理与C++实现
- leetcode--Kth Largest Element in an Array