1,继承
次级类会继承上级类的方法,也就是说子类自动获得父类的功能。 子类中可以选择覆盖父类的方法以适应相应需求
实例变量无法被覆盖掉是因为不需要, 它们并没有被定义成特殊的行为
继承的实例
public class Doctor{
boolean worksAtHospital;
void treatPatient(){}
}
public class FamilyDoctor extends Doctor{
boolean makeHouseCalls;
void giveAdvice(){ //给出诊断 }
}
public class Surgeon extends Doctor{
void treatPatient(){}
void makeIncision(){}
}
Surgeon 有一个实例变量
FamilyDoctor 有两个实例变量
Doctor 有一个方法
Surgenon 有三个方法
FamilyDoctor 有两个方法
一,java子类可以继承父类所有的属性变量。private也能被继承但是不能被访问;可以通过public的Setter与Getter方法在父类调用。
二,子类继承父类时,需要注意以下三点:
1、在子类继承父类的时候,子类必须调用父类的构造函数。
2、如果父类有默认构造函数,子类实例化时自动调用,但如果父类没有默认构造函数,即无形参构造函数,子类构造函数必须通过super调用父类的构造函数。
3、在java的继承当中子类是不可以继承父类的构造函数,只能调用父类的构造函数。
2.设计继承
1.找出具有共同行为和属性的对象(即类和方法)
2.设计代表共同行为状态的类
3.决定子类是否需要覆盖父类的方法
4.通过寻找使用共同行为的子类来找出更多抽象化的机会
5.完成类的继承层次
子类可以扩充父类的方法 例
void run() {
super.run();
//add other action
}
IS——A 测试来辅助完成继承的设计
当调用对象的引用方法时,你会调用到与该对象继承层次最接近的方法
3.继承的意义
减少了重复代码, 提高了可维护性 某些情况下可以只动父型就可以完成项目需求的修改
规定了一份合约,便于多态的实现(当你定义一组父型时,你可以用子型的任何类来填补父型的位置)
4.多态
运用多态的例子
Animal [] animals = new Animal[4];
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new Worf();
animals[3] = new Taiger();
for( int i=0; i < animals.length; i++){
animals[i].eat(); //会调用不同的动物自己独特的的吃的方式
}
参数和返回类型也可以多态
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 ); //会执行Dog的makeNoise
v.giveShot( h ); //会执行Hippo的makeNoise
}
}
关于继承的思考
1.可以通过继承来覆盖设计不好的类, 用新的方法来覆盖之前父类不适宜的方法
2.控制类防止被继承的方法 一.权限控制(设定为private 或者默认权限) 二.使用final修饰的类不能被继承(是为了确保方法都是自己所写的版本)三.让类的构造函数私有(private)
3.可以只用final来标识类中的方法而不标识整个类 这样就可以防止方法被覆盖(不想方法被覆盖时)
5.覆盖的规则
编译器会寻找引用类型的来决定你是否可以调用该引用的特定方法,但在执行期间Java虚拟机寻找的是存在堆上的对象
参数必须一样,返回类型要兼容
不能降低方法的存取权限(权限必须相同或者更高)
6.方法的重载
方法的重载
意义是方法的名称相同但是参数不同所以,重载和多态毫无关系
重载可以有一个方法的不同参数版本
1.重载的返回类型可以不同
2.不能只改变返回类型
3.可以更改存取权限