面向对象——多态

来源:互联网 发布:vc源码 文件管理器 编辑:程序博客网 时间:2024/05/18 01:20
/*多态:可以理解为事物存在的多种体现形态。人:男人,女人动物:猫,狗。猫 x = new 猫();动物 x = new 猫();1,多态的体现父类的引用指向了自己的子类对象。父类的引用也可以接收自己的子类对象。2,多态的前提必须是类与类之间有关系。要么继承,要么实现。通常还有一个前提:存在覆盖。3,多态的好处多态的出现大大的提高程序的扩展性。4,多态的弊端:虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。5,多态的应用6,多态的出现代码中的特点(多态使用的注意事项)第二个问题:如何使用子类特有方法。*//*动物,猫,狗。*/class Cat extends Animal{public void eat(){System.out.println("吃鱼");}public void catchMouse(){System.out.println("抓老鼠");}}class Dog extends Animal{public void eat(){System.out.println("吃骨头");}public void kanJia(){System.out.println("看家");}}class Pig extends Animal{public void eat(){System.out.println("饲料");}public void gongDi(){System.out.println("拱地");}}//-----------------------------------------class DuoTaiDemo2 {public static void main(String[] args) {//Animal a = new Cat();//类型提升。 向上转型。//a.eat();//如果想要调用猫的特有方法时,如何操作?//强制将父类的引用。转成子类类型。向下转型。///Cat c = (Cat)a;//c.catchMouse();//千万不要出现这样的操作,就是将父类对象转成子类类型。//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。//多态自始至终都是子类对象在做着变化。//Animal a = new Animal();//Cat c = (Cat)a;/*毕姥爷 x = new 毕老师();x.讲课();毕老师 y = (毕老师)x;y.看电影();*/function(new Dog());function(new Cat());}public static void function(Animal a)//Animal a = new Cat();{a.eat();/*if(a instanceof Animal){System.out.println("haha");}else */if(a instanceof Cat){Cat c = (Cat)a;c.catchMouse();}else if(a instanceof Dog){Dog c = (Dog)a;c.kanJia();}/*instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)  */}}
/*基础班学生:学习,睡觉。高级班学生:学习,睡觉。可以将这两类事物进行抽取。*/abstract class Student{public abstract void study();public void sleep(){System.out.println("躺着睡");}}class DoStudent{public void doSome(Student stu){stu.study();stu.sleep();}}class BaseStudent extends Student{public void study(){System.out.println("base study");}public void sleep(){ System.out.println("坐着睡");}}class AdvStudent extends Student{public void study(){System.out.println(" adv study");}}class  DuoTaiDemo3{public static void main(String[] args) {DoStudent ds = new DoStudent();ds.doSome(new BaseStudent());ds.doSome(new AdvStudent());//BaseStudent bs = new BaseStudent();//bs.study();//bs.sleep();//AdvStudent as = new AdvStudent();//as.study();//as.sleep();}}

class Fu{static int num = 5;void method1(){System.out.println("fu method_1");}void method2(){System.out.println("fu method_2");}static void method4(){System.out.println("fu method_4");}}
class Zi extends Fu{static int num = 8;void method1(){System.out.println("zi method_1");}void method3(){System.out.println("zi method_3");}static void method4(){System.out.println("zi method_4");}}class  DuoTaiDemo4{public static void main(String[] args) {//Fu f = new Zi();////System.out.println(f.num);////Zi z = new Zi();//System.out.println(z.num);//f.method1();//f.method2();//f.method3();Fu f = new Zi();System.out.println(f.num);f.method4();Zi z = new Zi();z.method4();/*在多态中成员函数的特点:在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。在运行时期:参阅对象所属的类中是否有调用的方法。简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。在多态中,成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类)。在多态中,静态成员函数的特点:无论编译和运行,都参考做左边。*///Zi z = new Zi();//z.method1();//z.method2();//z.method3(); }}




/*需求:电脑运行实例,电脑运行基于主板。*/interface PCI{public void open();public void close();}class MainBoard{public void run(){System.out.println("mainboard run ");}public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。{if(p!=null){p.open();p.close();}}}class NetCard implements PCI{public void open(){System.out.println("netcard open");}public void close(){System.out.println("netcard close");method();}}class SoundCard implements PCI{public void open(){System.out.println("SoundCard open");}public void close(){System.out.println("SoundCard close");}}/*class MainBoard{public void run(){System.out.println("mainboard run");}public void useNetCard(NetCard c){c.open();c.close();}}class NetCard{public void open(){System.out.println("netcard open");}public void close(){System.out.println("netcard close");}}*/class DuoTaiDemo5 {public static void main(String[] args) {MainBoard mb = new MainBoard();mb.run();mb.usePCI(null);mb.usePCI(new NetCard());mb.usePCI(new SoundCard());}}


原创粉丝点击