多态:
同一个实体同时具有多种形式
编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定
如果编译时类型和运行时类型不同,就出现多态
例:
1 class Preson{ 2 } 3 class Teacher extends Preson{ 4 } 5 6 public class Demo { 7 public static void main(String args[]){ 8 //这行代码就会产生多态 9 Preson p = new Teacher(); 10 } 11 }
实现多态的机制:
父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的真正实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法
多态的作用:
把不同的子类对象当作父类类型来看,可以屏蔽不同子类对象之间的差异,写出通用代码,做出通用编程,以适应需求的不断变化
继承关系式多态产生的前提
例:
1 //鸟类 2 class Brid{ 3 public void eat() { 4 System.out.println("一般鸟类都吃虫子"); 5 } 6 7 } 8 //麻雀 9 class Sparrow extends Brid{ 10 public void eat(){ 11 System.out.println("我要吃虫子"); 12 } 13 } 14 //老鹰 15 class Eagle extends Brid{ 16 public void eat(){ 17 System.out.println("我是空中霸主,我要吃肉"); 18 } 19 } 20 //觅食 21 class Foraging{ 22 /*public void feed(Sparrow sparrow){ 23 sparrow.eat(); 24 } 25 public void feed(Eagle eagle){ 26 eagle.eat(); 27 } 28 */ 29 /** 30 *上面这两个方法可以改进为下面这一个方法 ,利用多态可以达到一样的效果 31 */ 32 //直接把父类(鸟类)传进去 33 public void feed(Brid brid){ 34 brid.eat(); 35 } 36 } 37 public class TestDemo { 38 public static void main(String[] args) { 39 Foraging foraging = new Foraging(); 40 41 Sparrow sparrow = new Sparrow(); 42 /** 43 * 这行代码就体现了多态 44 * 45 * 运行时根据实际的类型寻找它实际类型的方法 46 */ 47 foraging.feed(sparrow); 48 49 Eagle eagle = new Eagle(); 50 foraging.feed(eagle); 51 52 /** 53 * Eagle eagle = new Eagle(); 54 * 55 * Dog eagle = new Eagle(); 56 * 57 * Sparrow sparrow = new Sparrow(); 58 * 59 * Dog sparrow = new Sparrow(); 60 * 61 * 62 * 也可以改变声明类型,功能的实现也不会变 63 */ 64 65 } 66 }
分类:
分类时多态,方法重载
运行时多态,方法重写
静态方法不能被重写,但能被子类继承。
因为方法的重写和对象有关,而static修饰的方法和对象无关
引用类型转换:
向上转型:小--------->大 (子类---------->父类)自动转换
把子类对象赋给父类变量
向下转型:大--------->小(父类----------->子类)强制转换
把父类对象强制转换成子类对象
强转之前一般都要先判断(instanceof)
对象类型的判断:instanceof
格式:对象 instanceof 类
表示判断对象是否属于这个类的类型
返回结果:Boolean型
ps:若要用来判断的对象与该类型没有继承关系,就不能使用instanceof
多态时方法的调用:
当一个引用类型的变量若声明为父类的类型,但实际上引用的是子类的对象(多态情况)
此时该变量不能在访问子类中自己特有的字段和方法
若子类重写了父类的方法,那么此时通过变量访问到的方法,实际上是子类的方法
组合:
一个类里包含另外一个类的引用,这种关系我们可以称为包含关系,也可称为”has a“的关系