标签:特征 子类 多态 Dog 面向对象 Animal 父类 eat
多态的含义,简单来说就是一类事物在不同时刻表现出不同的状态。
就像是:
小猫和小狗都属于动物类,小猫吃鱼,小狗吃骨头。一只小动物在吃鱼的时候就是小猫,在吃骨头的时候就是小狗。吃鱼和吃骨头就像是两个方法,都是小猫和小狗所特有的。
例如:
public abstract class Animal {
public abstract void eat();
}
class Cat extends Animal{
public void eat(){
System.out.println("小猫吃鱼");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("小狗吃骨头");
}
}
class Test {
public static void main(String[] args) {
Test test = new Test();
Animal dog = new Dog();
Animal cat = new Cat();
test.feed(dog);
test.feed(cat);
}
public void feed(Animal animal){
animal.eat();
}
}
动物类Animal类为小猫类和小狗类的父类,在定义对象时,将小猫类和小狗类自动转换成为动物类,因为满足已成关系所以这里的语法也是成立的,这样创建对象的方式满足,编译看左边,运行看右边。再在测试类中定义一个方法来调用动物类中的eat();方法,这样在调用时,dog对象则会调用Dog类中的eat();方法,而cat对象则会调用Cat类中的eat();方法,从而实现同类事物在不同时刻表现出不同的状态。
多态需要满足的条件:
1、子类继承父类
2、在子类中要有父类方法的重写
3、在创建对象时父类引用指向子类对象。如下:
Animal dog = new Dog();
Animal cat = new Cat();
什么是编译看左边,运行看右边呢?
简单来说:
程序的运行一般分为两个阶段,一个是编译阶段,一个是运行阶段。
class Test {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.eat();
cat.eat();
}
}
如果将测试类改成这样也是可以运行通过的,就是因为程序在编译期间,左边为父类,右边为子类。在调用方法时,编译时,会先看父类中有没有eat();方法,在运行时,再运行右边的子类中的eat();方法,不论这两个条件哪个都不满足,则程序便会运行不了。
在多态中还存在多态之间的转型:
多态的转型类似于基本类型转换,
自动类型转换:子类转换为父类,子类上升为父类
一般使用这种方法来实现多态
强制类型转换:父类转换为子类
如果子类存在父类中没有的方法,并且在创建子类对象时自动转换成为了父类,如果想要调用子类特有的方法,则必须先把类型强制转换为子类类型。
语法格式为:
Dog(子类类型的类型名) dog1(变量名) = (Dog) dog(父类类型变量名);
如果不知道创建的对象引用变量是什么类型的话,可以使用下面的方法先来判断一下:
if(dog instanceof Dog){ }//这句话的意思是:判断dog1是否为Dog类型
基本格式为:
父类引用 instanceof 具体子类类型
以上则是我所理解的多态,望采纳。
标签:特征,子类,多态,Dog,面向对象,Animal,父类,eat 来源: https://blog.csdn.net/qq_52391639/article/details/121410256
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。