【110】Java——《Head First Java》笔记(第7-8章)
一、继承
问:继承的作用是什么?
答:1、防止子类出现重复的程序代码。2、定义出共同的协议。问:继承如何判断?
答:IS-A测试(确保子类是父类的一种更特定的类型)问:子类继承父类什么东西?
答:成员(实例变量、方法)
注意:public类型成员会被继承,但是private类型成员不会被继承,
-
问:子类如何调用父类?
答:使用super关键字public void roam() { super.roam(); super.a; }
二、多态
问:多态的作用是什么?
答:1、可以用父类做为方法的参数、返回类型或数组的类型,通过这个机制,加入新的子类时,不用重写或修改处理这些类型的程序。
//引用类型可以是实际对象类型的父类
Animal[] animals = new Animal[5];
animals [0] = new Dog();
animals [1] = new Cat();
animals [2] = new Wolf();
animals [3] = new Hippo();
animals [4] = new Lion();
//参数和返回类型都可以是多态
class Vet {
public void giveShot(Animal a){
a.makeNoise();
}
}
class PetOwner{
public void start(){
Vet v = new Vet();
Dog d = new Dog();
Hippo h = new Hippo();
v.giveShot(d);
v.giveShot(h);
}
}
问:多态的局限性?
答:子类中那些非继承于父类的方法,无法直接使用,必须先进行强制转换。
Object o = new Dog();
Dog d = (Dog) o;
d.roam();
若你不确定它是否是Dog类型,你可以使用instanceof这个运算符来检查,若是类型转换错了,你会在执行期间遇到ClassCastException异常并且终止。
if(o instanceof Dog){
Dog d = (Dog) o;
}
问:子类继承父类什么东西?
答:成员(实例变量、方法)
注意:public类型成员会被继承,但是private类型成员不会被继承。
问:子类如何调用父类?
答:super
三、过载/重载(overload)
问:重载的规则是什么?
答:1、返回类型可以不同。2、不能只改变返回类型。【返回类型应该是父类返回类型的子类】3、可以任意更改存取权限。4、参数种类和顺序必须不同。
四、覆盖/重写()
问:覆盖的规则是什么?
答:1、参数必须要一样。2、返回类型必须要兼容。【不论父类声明的返回类型是什么,子类必须要声明返回一样】3、存取权限必须相同。【不能覆盖掉一个公有的方法并将它标记为私有】
五、抽象(abstract)
-
抽象类
抽象类不可被初始化。
抽象类一定要被继承。
抽象类里面包含抽象方法和非抽象方法。
-
抽象方法
抽象方法一定要被覆盖。
抽象方法没有方法体。
若有抽象方法,则其类必须为抽象类,非抽象类中不可拥有抽象方法。
抽象方法的意义:就算无法实现出方法的内容,但还是可以定义出一组子类共同的协议。
继承树结构下第一个具体类必须要实现出所有的抽象方法。
六、终极对象(Object)
-
常用方法
equal(Object o)【建议覆盖】
hashCode()【建议覆盖】
toString()【建议覆盖】
getClass()
-
两个作用
作为多态让方法可以应付多种类型的机制。
提供在Java执行期间对任何对象都有需要的方法的实现程序代码。
java.lang.Object
七、接口(interface)
实现某接口的类必须实现它所有的方法,这些接口方法自带public、abstract,但可以不用写。
类可以实现多个接口
八、如何判断设计类、子类、抽象类还是接口?
类——若新的类不能通过其它类的IS-A测试,就另写一个不继承其它类的类。
子类——只有在需要某类的特殊化版本时,以覆盖或增加新的方法的方式来继承现有的类。
抽象类——当你需要定义一群子类的模板,又不想让程序初始化此模板时使用。
接口——如果想要定义出类可以扮演的角色。
九、对象声明、创建、赋值过程
Dog myDog = new Dog();
声明引用变量
Dog myDog是要求JVM在栈空间分配空间给引用变量,并将此引用变量命名为myDog,此引用变量将永远被固定为Dog类型。
注意:区分引用与引用变量,引用是引用变量里存的指向对象的地址。
创建对象
Dog();是要求JVM分配堆空间给新建的Dog对象。
连接对象和引用变量
将新的Dog赋值给myDog这个引用变量,换言之即设定遥控器。
十、其它碎片知识
继承的层次不要太深。
没有私有类,但有内部类。
-
三种方法防止某个类被做出子类:
存取控制:不标记私有,也不标记为公有,这样的非公有类,只能被同一个包的类作出子类。
使用final修饰符,表示它是继承树的末端,不能被继承。
让类只拥有private的构造程序。
-
final针对类、实例变量、方法:
类——不可被继承
属性——不可被更改(常量)
方法——不可被覆盖
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。