标签:java 存在 必须 console highlight 转换 编译 圆形 etl
多态:让一个对象表现出多种类型,写出通用的代码,最大限度的屏蔽各个子类之间的差异性。
c#举例:
1 将父类的方法标记为虚方法 ,使用关键字 virtual,这个函数可以被子类重新写一个遍。 2 3 //真的鸭子嘎嘎叫 木头鸭子吱吱叫 橡皮鸭子唧唧叫 4 RealDuck dk = new RealDuck(); 5 MuDark mk = new MuDark(); 6 XpDark xk = new XpDark(); 7 RealDuck [] dks = { dk,mk,xk}; 8 for (int i = 0; i < dks.Length; i++) 9 { 10 dks[i].Jiao(); 11 //调用的仍然是父类的方法,因为表现出来的类型是父类的,所以只能调用父类的方法,但是这个函数在 12 //子类中被重写了,所以此时就不再调用自己的了,而调用重新写的方法,具体调用哪个子类重写的方法, 13 //取决于dks[i]装的是谁的对象. 14 } 15 16 public class RealDuck 17 { 18 public virtual void Bark() 19 { 20 Console.WriteLine("真的鸭子嘎嘎叫"); 21 } 22 } 23 public class MuDuck : RealDuck 24 { 25 public override void Bark() 26 { 27 Console.WriteLine("木头鸭子吱吱叫"); 28 } 29 } 30 public class XPDuck : RealDuck 31 { 32 public override void Bark() 33 { 34 Console.WriteLine("橡皮鸭子唧唧叫"); 35 } 36 } 37 38 39 //如果不用虚方法,则必须使用里氏转换法 40 如: for(int i = 0; i < dks.Length; i++) 41 { 42 if(dks[i] is MuDark) 43 { 44 (MuDark)dks[i].Jiao; 45 } 46 } 47 48 关于虚方法需要注意以下几点: 49 1.虚方法在父类中必须有实现,哪怕是空实现(这点和抽象方法以及接口中的方法不同) 50 2.虚方法子类可以重写(override),也可以不重写
Java多态举例:
多态要注意 的细节: 1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。 2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。 3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。 4. 多态情况下,不能访问子类特有的成员。 总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。 编译看左边,运行不一定看右边。 编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。
/* 多态的应用: 1. 多态用于形参类型的时候,可以接收更多类型的数据 。 2. 多态用于返回值类型的时候,可以返回更多类型的数据。 多态的好处: 提高了代码的拓展性。 需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。 */ //图形类 abstract class MyShape{ public abstract void getArea(); public abstract void getLength(); } class Circle extends MyShape{ public static final double PI = 3.14; double r; public Circle(double r){ this.r =r ; } public void getArea(){ System.out.println("圆形的面积:"+ PI*r*r); } public void getLength(){ System.out.println("圆形的周长:"+ 2*PI*r); } } class Rect extends MyShape{ int width; int height; public Rect(int width , int height){ this.width = width; this.height = height; } public void getArea(){ System.out.println("矩形的面积:"+ width*height); } public void getLength(){ System.out.println("矩形的周长:"+ 2*(width+height)); } } class Demo { public static void main(String[] args) { /* //System.out.println("Hello World!"); Circle c = new Circle(4.0); print(c); Rect r = new Rect(3,4); print(r); */ MyShape m = getShape(0); //调用了使用多态的方法,定义的变量类型要与返回值类型一致。 m.getArea(); m.getLength(); } //需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。 public static void print(MyShape s){ // MyShpe s = new Circle(4.0); s.getArea(); s.getLength(); } // 需求2: 定义一个函数可以返回任意类型的图形对象。 public static MyShape getShape(int i){ if (i==0){ return new Circle(4.0); }else{ return new Rect(3,4); } } }
标签:java 存在 必须 console highlight 转换 编译 圆形 etl
原文地址:https://www.cnblogs.com/qicao/p/8934104.html