一、继承
1 概念
子类继承父类,即子类继承父类的方法和实例变量,子类可加入自己的方法和实例变量,也可以覆盖继承自父类的方法,但实例变量无法覆盖;
其中,覆盖指由子类重新定义继承下来的方法以改变或延伸此方法的行为;
子类是extends父类出来的;
举例:
public class Doctor{
// 一个实例变量
boolean worksAtHospital;
// 一个方法
void treatPatient(){
}
}
public class FamilyDoctor extends Doctor{
//新加实例变量
boolean makeHouseCalls;
// 新加方法
void giveAdvice(){
}
}
public class Sugeon extends Doctor{
// 覆盖父类的方法
void treatPatient(){
}
// 新加方法
void makeIncision(){
}
}
2 设计继承层次
a 找出具有共同属性和行为的对象
b 设计代表共同状态与行为的类
c 决定子类是否需要让某项行为(即方法)有特定的运作方式
d 通过寻找使用共同行为的子类来找出更多抽象化的机会
e 完成类的继承
3 注意
3.1 当调用对象引用的方法,Java虚拟机会调用到与该对象类型最接近的方法,即最低阶的方法;
3.2 若子类中继续引用父类的方法,再加上额外的行为,可在父类中设计所有子类都适用的功能实现,通过super关键字取用父类,如:
public void roam(){
super.roam();
// my own roam stuff
}
3.3 父类可通过存取权限决定子类是否能继承某些特定的成员,权限有private、default、protected、public,越往右限制程度越小,存取权限控制谁可以接触什么,如public类型的成员会被继承,private类型的成员不会被继承;
3.4 大部分继承深度不会超过两层;
3.5 只有内部类,没有私有类概念,即类不能标记为私有,但有三种方法防止某个类被作出子类,一是存取控制,不标记公有的类只能被同一个包的类作出子类;二是使用final修饰符,表示其是继承树的末端,不能被继承;三是让类只拥有private的构造程序;
二、多态
运用多态时,引用类型可以是实际对象类型的父类,参数和返回类型也可以是实际对象类型的父类;
通过多态,可编写出引进新型子类时也不必修改的程序;
Animal myDog = new Dog();
class Vet{
public void giveeShot(Animal a){
a.makeNoise();
}
}
class PetOwner{
public void start(){
Vet v = new Vet();
Dog d = new Dog();
Hippo h = new Hippo();
v.giveShot(d); // 执行Dog的makeNiose()
v.giveShot(h); // 执行Hippo的makeNiose()
}
}
三、覆盖
1 概念
若只想防止特定的方法被覆盖,可将该方法标识上final修饰符;将整个类标识成final,表示没有任何的方法可以被覆盖;
2 覆盖规则
参数必须要一样,且返回类型必须要兼容;
不能降低方法的存取权限;
四、方法的重载
1 概念
重载是两个方法的名称相同,但参数不同,故重载与覆盖没有关系;
2 重载规则
返回类型可以不同;
不能只改变返回类型;
可更改存取权限;
public class Overloads{
String uniqueID;
public int addNums(int a, int b){
return a + b;
}
public double addNums(double a, double b){
return a + b;
}
public void setUniqueID(String theID){
uniqueID = theID;
}
public void setUniqueID(int ssNumber){
String numString = "" + ssNumber;
setUnique(numString);
}
}