标签:System java 子类 am 多态 Cat 理解 println 父类
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也是不行的。
标签:System,java,子类,am,多态,Cat,理解,println,父类 来源: https://blog.csdn.net/liulang68/article/details/110319207
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。