面向对象三要素(2/2)
多态
多态
1.继承和实现关系 2.有方法的重写 3.父类引用指向子类对象 (父类名 对象名 = new 子类名();
成员变量: 编译看左边,执行看左边 提示:根据多态前提3:有父类引用指向子类对象,左为父类,右为子类。 成员方法:编译看左边,执行看右边
看不懂吗?如果你看不懂,那就去代码吧?
public class Animal {
//动物类 public int age = 40 ; public void eat() {
System.out.println("动物吃东西"); } public class Dog extends Animal {
///狗继承动物类 public int age =20 ; public int weight = 10 ; @Override public void eat() {
System.out.println("够吃骨头"); } public void playGame() {
System.out.println("狗拿耗子"); } public class AnimalDemo {
//测试类 public static void main(String[] args) {
Animal a = new Dog(); System.out.println(a.age);
System.out.println(a.weight);
}
System.out.println(a.weight);
在这个上看着没事,但是在软件上就可以看见已经报红了。 为什么?不是都是Dog类的属性嘛?为什么age可以用weight不能使用呢?
这就是上面说的成员变量编译看左边,执行看左边,父类中没有weight这个属性自然它就报错了。执行看左边怎么说呢?
"D:\idea2019\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" "-javaagent:D:\idea2019\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=59673:D:\idea2019\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\IDEA\jihe\out\production\集合;D:\IDEA\jihe\lib\javax.transaction.jar;D:\IDEA\jihe\lib\javax.servlet.jar;D:\IDEA\jihe\lib\javax.jms.jar;D:\IDEA\jihe\lib\javax.servlet.jsp.jar;D:\IDEA\jihe\lib\javax.servlet.jsp.jstl.jar;D:\IDEA\jihe\lib\javax.persistence.jar;D:\IDEA\jihe\lib\javax.ejb.jar;D:\IDEA\jihe\lib\javax.annotation.jar;D:\IDEA\jihe\lib\javax.resource.jar com.Text.AnimalDemo
40
进程已结束,退出代码 0
这是上面那段代码去除输出weight之后的结果可以看成为啥执行也要看左边了吗? 再看看成员方法:
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Dog();
System.out.println(a.age);
a.eat();
a.playGame();
}
}
同样,a.playGame这个方法也是用不了的,父类中没有这个方法。拿去它输出是什么结果呢?
"D:\idea2019\IntelliJ IDEA 2019.3.3\jbr\bin\java.exe" "-javaagent:D:\idea2019\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=62025:D:\idea2019\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\IDEA\jihe\out\production\集合;D:\IDEA\jihe\lib\javax.transaction.jar;D:\IDEA\jihe\lib\javax.servlet.jar;D:\IDEA\jihe\lib\javax.jms.jar;D:\IDEA\jihe\lib\javax.servlet.jsp.jar;D:\IDEA\jihe\lib\javax.servlet.jsp.jstl.jar;D:\IDEA\jihe\lib\javax.persistence.jar;D:\IDEA\jihe\lib\javax.ejb.jar;D:\IDEA\jihe\lib\javax.annotation.jar;D:\IDEA\jihe\lib\javax.resource.jar com.Text.AnimalDemo
40
狗吃骨头
进程已结束,退出代码 0
这就是成员方法:编译看左边,执行看右边 为什么会出现这样的情况呢? 因为成员方法有重写,成员变量没有。
多态的好处: 1.提高了程序的扩展性 2.定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作 多态的弊端: 不能使用子类的特有功能
多态中的转型 向上转型 —> 由子到父,父类引用指向子类对象 父类名 对象名 = new 子类名() 向下转型 —> 由父到子,父类引用转为子类对象 子类名 新的对象名 = (子类名)对象名