Java学习笔记(十一)面向对象---多态(请简述java面向对象的三大特性)

网友投稿 244 2022-06-21


父类的引用指向了自己的子类对象。

父类的引用也可以接受自己的子类对象。

1|1代码体现

abstract class Animal { public abstract void eat(); } class Cat extends Animal { @Override public void eat() { System.out.println("eat fish"); } } class Dog extends Animal { @Override public void eat() { System.out.println("eat bone"); } } class Monkey extends Animal { @Override public void eat() { System.out.println("eat banana"); } } public class Demo { public static void main(String[] args) { /* Animal c = new Cat(); function(c); */ function(new Cat()); /* Animal d = new Dog(); function(d); */ function(new Dog()); /* Animal m = new Monkey(); function(m); */ function(new Monkey()); } public static void function(Animal a) { a.eat(); } }

运行结果

eat fish eat bone eat banana

2|0多态的前提

必须是类与类之间有关系。要么是继承关系,要么实现。 存在复写关系。

3|0多态利弊

3|1利处

多态的出现大大地提高了程序的拓展性。

3|2弊端

提高了拓展性,但是只能使用父类的引用访问父类中的成员,不能预先访问子类的成员(因为子类这时还不存在)。

4|0多态-示例

abstract class Student { public void eat() { System.out.println("eat rice"); } public abstract void study(); } class StudentToDo { public void Do(Student s) { s.eat(); s.study(); } } class StudentClass1 extends Student { @Override public void eat() { System.out.println("eat steak"); } @Override public void study() { System.out.println("study English"); } } class StudentClass2 extends Student { @Override public void study() { System.out.println("study Chinese"); } } class StudentClass3 extends Student { @Override public void study() { System.out.println("study Japanese"); } } public class Demo2 { public static void main(String[] args) { StudentToDo std = new StudentToDo(); std.Do(new StudentClass1()); std.Do(new StudentClass2()); std.Do(new StudentClass3()); } }

运行结果:

eat steak study English eat rice study Chinese eat rice study Japanese

5|0多态的出现 代码中的特点(多态使用的注意事项)

5|1多态中成员函数的特点

在编译时期,参阅引用类型变量所属的类中是否有调用的方法,如果有编译通过,如果没有编译失败。 在运行时期,参阅对象所属的类中是否有调用的方法。 简单总结:成员函数在多态调用时,编译看左边,运行看右边。

class Fu { void method1() { System.out.println("Fu_Method_1"); } void method2() { System.out.println("Fu_Method_2"); } } class Zi extends Fu { @Override void method1() { System.out.println("Zi_Method_1"); } void method3() { System.out.println("Zi_Method_3"); } } public class Demo3 { public static void main(String[] args) { Fu f =new Zi(); f.method1(); f.method2(); //f.method3(); 对于引用类型f所属的类Fu中没有method3()方法,所以编译会不通过。 } }

运行结果:

Zi_Method_1 Fu_Method_2

5|2多态中成员变量的特点

无论编译还是运行,都参考左边(引用型变量所属的类)

class Fu { int num = 1; } class Zi extends Fu { int num = 2; } public class Demo4 { public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.num); //参考左边 Zi z= new Zi(); System.out.println(z.num); } }

运行结果:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:简单看看ThreadPoolExecutor原理
下一篇:javaSE学习笔记(15) ---缓冲流、转换流、序列化流
相关文章

 发表评论

暂时没有评论,来抢沙发吧~