第一章 继承
1.1 概念
1.1.1 继承的范围
在java中,子类可以继承父类的所有的方法和属性变量,private也能被继承但是不能被访问,可以通过public在父类中调用,子类继承父类的一切东西.
<Thinking in JAVA>中说到,子类对象拥有父类对象的完整拷贝。 实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构。private限制访问方式只能在类的内部,这仅仅是一个访问控制,实际上子类对象拥有父类对象的一切。
1.1.2 继承时的注意事项
子类初始化时一定要调用父类的构造方法,如果父类有默认构造函数或者无参构造函数时,子类实例化时会自动调用,子类继承了父类的各种属性,而构造方法相当于把父类给实例化出来,如果子类实例化的时候不调用父类的构造方法,相当于子类压根既没有父亲。当调用父类的构造方法时,会从顶级父类中一级一级的向下调用,抽象类是例外,因为抽象类是没有构造方法的,无法实例化。
构造函数不可以被继承,只能调用。
1.1.3 重写、重构与重载
重写就是在子类中将父类的成员方法的名称保留,重写成员方法的实现内容、更改成员方法的存储权限,或者修改成员方法的返回值类型(j2SE5.0的新功能)。
如果其它都不变,只改变方法的实现内容时,这种特殊的重写方式被称为重构。重写父类方法时,方法只能从小到大。
重载是方法的参数的类型或者个数不同,目的是为了让方法名相同而形参不同的方法同时存在。
1.1.4 对象类型的转换
将子类对象转换为父类对象称为向上转型,将父类对象转换为子类对象称为向下转型,将子类对象转换为父类对象可以直接转,但是将父类对象转换为子类对象需要加上强转,因为父类对象范围大,子类对象范围小,大转小没事,小转大就会有问题。
可以用instanceof操作符判断对象类型,当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生classcastexception异常。
1.2 例子
1.2.1 关于向上或向下转型后使用对象中元素的问题
输出结果为12。
虽然new了一个B对象a,但是声明为父类A类型,所以调用a.i的时候实际上是访问了父类的属性值,事实上当将父类声明为private时,编译会报错,因为声明类型为A时,java虚拟机就会认为实例化对象为一个A类型的对象,这情况下只能访问A中的成员变量和方法。
所以如下代码也会报错,因为A中没有nihao函数,具体如下
如果修改为声明为B则会输出-6,具体如下
1.2.2 关于instanceof的使用问题
输出为 yes1 yes2
自己的对象instanceof自己的类是yes,子类对象instanceof父类输出yes,父类对象instanceof子类会是false。
1.2.3 多态
在1.2.1例子中我们了解到,当用父类对象指向子类对象时,我们调用不管是类还是属性都得父类中有才行,如果没有就会报错,跟子类中有没有没关系,但是如果能在子类中重写父类的方法,那么当父类对象指向子类对象时,我们调用父类的方法,实际上调用的是子类中被重写的方法,我们称这个为多态。
在下面的例子中,B类继承了A类并重写了A类中name方法,这样我们在test2中,用指向子类的父类对象调用name方法时,调用到的是重写的方法。
1.2.4 多次继承后的属性问题
可以看出,继承后使用的属性为父类的属性,而不是同名的爷类的属性。
第二章 接口
2.1 抽象类简介
在java语言中抽象类不可以实例化对象。
抽象方法没有方法体,除非它被重写,而承载这个抽象方法的抽象类必须被继承。
如果声明一个抽象的方法,就必须将这个抽象的方法定义为抽象类。
抽象类被继承要实现所有的抽象方法,就是必须名字、返回值、参数列表都相同。
抽象类的属性必须是非常量。
抽象类虽然是特殊的类,但是也具备类的特性,所以可以继承别的抽象类。
在抽象类中所有的子类都要对抽象方法进行覆盖,所以每个子类都要重写这个方法,比较麻烦,如果能让哪些需要重写的重写,不需要重写的不管就好了,所以接口便出现了。
2.2 接口
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。
接口中定义的方法必须被定义为public或abstract形式,其它修饰权限不被java编译器认可,即使不讲方法声明为public形式,它也是public。
接口中的属性必须被public、final、static修饰,关于final的详细解释可以看https://blog.youkuaiyun.com/lwj_199011/article/details/52385926
在java中可以将类向上转型为父类对象,也可以转型为抽象父类对象,或者向上转型为该类实现接口,都可以。
继承接口需要实现接口中的所有方法。
2.3 例子
2.3.1 接口中的常量
可以看出,接口中的字段必须是final且static的
第三章 多态
3.1 多态的概念
1.多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
2.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
3.2 例子
class A
{
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("A and A");
}
}
class B extends A
{
public String show(B obj)...{
return ("B and B");
}
public String show(A obj)...{
return ("B and A");
}
}
class C extends B{}
class D extends B{}
class E
{
public static void main(String [] args)
{
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); //①
System.out.println(a1.show(c)); //②
System.out.println(a1.show(d)); //③
System.out.println(a2.show(b)); //④
System.out.println(a2.show(c)); //⑤
System.out.println(a2.show(d)); // ⑥
System.out.println(b.show(b)); //⑦
System.out.println(b.show(c)); //⑧
System.out.println(b.show(d)); //⑨
}
}
(三)答案
① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D
参考链接:
一个比较好的多态讲解 https://www.cnblogs.com/mz-lover/p/4786337.html
一个比较好的关于多态的例子 https://www.cnblogs.com/1693977889zz/p/8296595.html