多态的概述和讲解

来源:互联网 发布:linux中的which 编辑:程序博客网 时间:2024/05/03 19:43
/*多态:同一个对象(事物),在不同时刻体现出来的不同状态。多态的前提:A:要有继承关系。B:要有方法重写。其实没有也是可以的,但是如果没有这个就没有意义。动物 d = new 猫();d.show();动物 d = new 狗();d.show();C:要有父类引用指向子类对象。父 f =  new 子();用代码体现一下多态。多态中的成员访问特点:A:成员变量编译看左边,运行看左边。B:构造方法创建子类对象的时候,默认访问父类的构造方法,对父类的数据进行初始化。C:成员方法编译时期:参阅引用型变量所属的类是否有调用的方法,如果有,编译通过,如果没有,编译失败。运行时期:参阅对象所属的类中是否有调用的方法。编译看左边,运行看右边。D:静态方法编译看左边,运行看左边。(静态和类相关,算不上重写,所以,访问还是左边的)由于成员方法存在方法重写,所以它运行看右边。*/class Fu {public int num = 100;public void show() {System.out.println("show Fu");}public static void function() {System.out.println("function Fu");}}class Zi extends Fu {public int num = 1000;public int num2 = 200;public void show() {System.out.println("show Zi");}public void method() {System.out.println("method zi");}public static void function() {System.out.println("function Zi");}}class DuoTaiDemo {public static void main(String[] args) {//要有父类引用指向子类对象。//父 f =  new 子();Fu f = new Zi();System.out.println(f.num);//找不到符号//System.out.println(f.num2);f.show();//找不到符号//f.method();f.function();}}

100
show Zi
function Fu

/*  多态的好处:A:提高了代码的维护性(继承保证)B:提高了代码的扩展性(由多态保证)多态的体现父类的引用指向了自己的子类对象父类的引用也可以接受自己的子类对象多态的弊端:不能使用子类的特有功能。 现象:子可以当父用,父不能当子用。我就想使用子类的特有功能?行不行?行。怎么用呢?A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)B:把父类的引用强制转换为子类的引用。(向下转型)对象间的转型问题:向上转型:Fu f = new Zi();向下转型:Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。*/
class Fu {public void show() {System.out.println("show fu");}}class Zi extends Fu {public void show() {System.out.println("show zi");}public void method() {System.out.println("method zi");}}class DuoTaiDemo4 {public static void main(String[] args) {//测试Fu f = new Zi();f.show();//f.method();//创建子类对象//Zi z = new Zi();//z.show();//z.method();//你能够把子的对象赋值给父亲,那么我能不能把父的引用赋值给子的引用呢?//如果可以,但是如下Zi z = (Zi)f;z.show();z.method();}}

/*ClassCastException:类型转换异常一般在多态的向下转型中容易出现*/class Animal {public void eat(){}}class Dog extends Animal {public void eat() {}public void lookDoor() {}}class Cat extends Animal {public void eat() {}public void playGame() {}}class DuoTaiDemo {public static void main(String[] args) {//内存中的是狗Animal a = new Dog();Dog d = (Dog)a;//内存中是猫a = new Cat();Cat c = (Cat)a;//内存中是猫Dog dd = (Dog)a; //ClassCastException}}

/*看程序写结果:先判断有没有问题,如果没有,写出结果多态的成员访问特点:方法:编译看左边,运行看右边。继承的时候:子类中有和父类中一样的方法,叫重写。子类中没有父亲中出现过的方法,方法就被继承过来了。*/class A {public void show() {show2();}public void show2() {System.out.println("我");}}class B extends A {/*public void show() {show2();}*/public void show2() {System.out.println("爱");}}class C extends B {public void show() {super.show();}public void show2() {System.out.println("你");}}public class DuoTaiTest4 {public static void main(String[] args) {A a = new B();a.show();B b = new C();b.show();}}



0 0
原创粉丝点击