欢迎光临散文网 会员登陆 & 注册

java多态的理解

2020-11-29 15:57 作者:小垃圾kiki  | 我要投稿

java多态

如果放在生活中多态就是比如做一件事情,不同人有不同的实现方式。

但是在java这里指的多态,它设定了限制,必须是多个子类继承同一个父类实现方法的重写。

同时创建的对象的时候new出来的子类同时指定父类引用。(这样就造成了生成的对象只能调用和父类共有的方法,不能调用子类特有的方法)。


多态是同一个行为具有多个不同表现形式或形态的能力。

Animal am = new Cat();语句在堆内存中开辟了子类(Cat)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。

执行强转语句Cat ct = (Cat)am;之后,ct(栈里面声明的Cat类型的变量)就指向最开始在堆内存中创建的那个Cat类型的对象了。

多态存在的三个必要条件

  • 继承

  • 重写

  • 父类引用指向子类对象

Parent p = new Child();

成员变量 编译看左边(父类),运行看左边(父类) 成员方法 编译看左边(父类),运行看右边(子类)。动态绑定 静态方法 编译看左边(父类),运行看左边(父类)。

(静态和类相关,算不上重写,所以,访问还是左边的) 只有非静态的成员方法,编译看左边,运行看右边

多态的弊端:多态后不能使用子类特有的属性和方法。

如果我们非要想用也是可以的

那我们就可以把这个父类引用指向了子类对象的家伙am再强制变回Cat类型。


package com.lky.h1;

class Animal {
   int num = 10;
   static int age = 20;
   public void eat() {
       System.out.println("动物吃饭");
   }

   public static void sleep() {
       System.out.println("动物在睡觉");
   }

   public void run(){
       System.out.println("动物在奔跑");
   }
}
class Cat extends Animal {
   int num = 80;
   static int age = 90;
   String name = "tomCat";
   public void eat() {
       System.out.println("猫吃饭");
   }
   public static void sleep() {
       System.out.println("猫在睡觉");
   }
   public void catchMouse() {
       System.out.println("猫在抓老鼠");
   }

}


public class Test3 {
   public static void main(String[] args) {
       Animal am = new Cat();
       am.eat();
       am.sleep();
       am.run();
       //am.catchMouse();这里先注释掉,等会会说明
       //System.out.println(am.name);//这里先注释,待会说明
       System.out.println(am.num);
       System.out.println(am.age);
   }
}

参考文章

对于向上转型,程序会自动完成,而对于向下转型时,必须明确的指明要转型的子类类型。

向上转型,new 了一个子类可以指向父类

向下转型,把指向父类的转成子类

我这里的向下转型指的是把向上转型返回的对象指向强转成子类,我可以没有说new了一个父类指向子类,现实中不行,java也是不行的。



java多态的理解的评论 (共 条)

分享到微博请遵守国家法律