做网站都需要买什么/电商推广方案
对象村的优质生活—继承与多态
覆盖的意思是由子类重新定义继承下来的方法以改变或延伸此方法的行为
1.继承的运行方式
了解继承
在设计继承时,你会把共同的程序代码放到某个类中,然后告诉其它的类说此类是它们的父类。当某个类继承另一个类的时候,也就是子类继承自父类。
2.继承层次的设计
(1)找出具有共同属性和行为的对象
*用继承来防止子类中重复出现的程序代码
(2)设计代表共同状态与行为的类
(3)决定子类是否需要某项行为(也就是方法的实现)有特定不同的运作方式
(4)通过寻找使用共同行为的子类来找出更多抽象化的机会
(5)完成类的继承层次
*当你调用对象引用的方法时,你会调用到与该对象类型最接近的方法。换句话说,最低阶的会胜出。"最低阶"的意思是在层次树的最下方。
3.继承树的实用设计
(1)“是一个"与"有一个”
当一个类继承自另外一个类时,我们会说这是子类去继承父类。若你想知道某物是否应该要继承另一物时,则可以用"IS-A"测试来检验。
eg:三角形是一个多边形—IS-A
澡盆是一个浴室----Has-A
(2)IS-A测试适用于在继承层次的任何地方。如果你的继承层次树设计得很好,那么所有的子类都应该通过任何一个上层父类的IS-A测试。
如果类Y继承类X,且类Y是类Z的父类,那么Z应该能通过IS-A X的测试。
*继承概念下的IS-A是个单向的关系!
子类可以继承父类的成员。这包括了实例变量和方法。
父类可以通过存取权限决定子类是否能够继承某些特定的成员。
任一类的成员包含有自己定义出的变量和方法再加上从父类所继承下来的任何东西。
4.存取权限
private default protected public
左边是最受限制的,而越往右边限制程度越小。
public 类型的成员会被继承
private 类型的成员不会被继承
5.继承使用的时机
(1)当某个类会比其父类更具有特定意义时使用继承
eg:美国短毛猫是一种特定品种的猫,所以从猫中扩充出美国短毛猫是和合理的。
(2)在行为程序(实现程序代码)应该被多个相同基本类型所共享时,应该考虑继承
eg:方形、圆形、三角形都需要旋转和播放声音,因此将这些功能放在它们的父类上面是很合理的,并且这样也比较好维护和扩充。
(3)若两者之间不能通过IS-A测试就不要应用继承关系。一定要确定子类是父类一种更特定的类型才可以。
6.要点
(1)子类是extends父类出来的
(2)子类会继承父类所有public类型的实例变量和方法,但不会继承父类所有private类型的变量和方法。
(3)继承下来的方法可以被覆盖掉,但实例变量不能被覆盖掉
(4)使用IS-A测试来验证继承结构的合理性
(5)IS-A是单方向的,河马是动物,但动物不一定是河马
(6)当某个方法在子类中被覆盖过,调用这个方法会调用到覆盖过的版本
(7)如果类Y extends 类X,且类Y是类Z的父类,那么Z应该能通过IS-A X的测试
7.继承的意义
通过继承设计的过程你可以累计面向对象的经验值。通过提取出一组类间共同的抽象性,你能够排除掉重复的程序代码而将这个部分放在父类中。如果有共同的部分需要修改,
就只会有一个地方要修改,且这样的改变会应用到所有继承此行为的类。修改之后只需要重新编译就行,不用修改子类。
(1)避免了重复的程序代码
(2)定义出共同的协议
继承让你可以确保某个父型之下的所有类都会有父型所持有的全部方法,也就是说,你会通过继承来定义相关类间的共同协议
当你定义出一组类的父型时,你可以用子型的任何类来填补任何需要或期待父型的位置。
8.多态的运行
创建对象时引用对象的类型必须相符
eg:Dog myDog = new Dog();
多态下,引用与对象可以是不同的类型
eg:Animal myDog = new Dog();
运用多态时,引用类型可以是实际对象类型的父类
public class Animal {public static void main(String[] args) {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();for(int i=0;i<animals.length;i++){animals[i].eat();animals[i].roam();}}
}
参数和返回类型也可以多态
public class Vet {public void giveShot(Animal a){a.makeNoise();}
}
public class PetOwner {public void start(){Vet v = new Vet();Dog d = new Dog();Hippo h = new Hippo();v.giveShot(d);v.giveShot(h);}
}
通过多态,你就可以编写出引进新型子类时也不必修改的程序
9.遵守合约:覆盖的规则
(1)参数必须要一样,且返回类型必须要兼容
子类对象得保证能够执行父类的一切
(2)不能降低方法的存取权限
10.方法的重载(overload)
重载的意义是两个方法的名称相同,但参数不同。重载与多态毫无关系。
重载版的方法只是刚好有相同名字的不同方法,它与继承或多态无关。重载的方法与覆盖方法不一样。
(1)返回类型可以不同
(2)不能只改变返回类型
(3)可以更改存取权限
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;setUniqueID(numString);}
}