首页 分享 【Java学习记录】十二 Java中的多态

【Java学习记录】十二 Java中的多态

来源:萌宠菠菠乐园 时间:2024-09-17 03:17

多态的三个要点:

      1. 多态是方法的多态,不是属性的多态(多态与属性无关)。

      2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象

      3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

多态的弊端,就是:不能使用子类特有的成员属性和子类特有的成员方法。

父类Animal

class Animal {

public void shout() {

System.out.println("叫了一声!");

}

}

子类Dog

class Dog extends Animal {

public void shout() {

System.out.println("旺旺旺!");

}

public void seeDoor() {

System.out.println("看门中....");

}

}

测试类

public class TestPolym {

public static void main(String[] args) {

Animal a = new Animal();

animalcry(a);

Animal d = new Dog();

animalcry(d);

}

static void animalcry(Animal a) {

a.shout();

}

}

输出结果:

条件1:继承,Dog类继承了Animal类

条件2:方法重写,在Dog子类中,重写了Animal类中的shout()方法。

条件3:父类引用指向子类对象,Animal d = new Dog();

多态成员访问的特点:

成员变量
编译看父类,运行看父类

成员方法
编译看父类,运行看子类,动态绑定

静态方法
编译看父类,运行看父类。

只有非静态的成员方法,编译看父类,运行看子类。

在知乎上看到有对多态使用花木兰替父从军的的比喻解释非常有意思:https://www.zhihu.com/question/30082151

Animal d = new dog(); ( dog型自动提升为Animal型(向上转型,得按Animal对象进行操作),因此dog只能调用Anima类中的方法,dog中特有功能无法访问,例如dog中的看门)。如果还想用狗的特有功能,可以强制向下转型:Dog c = (Dog) d。向下转型是为了使用特有方法。如果两者不具备继承关系不能强制转换!(向上转型为了提高扩展性并限制特有方法,向下转型为了使用特定方法)。

headfirst 

在多态下,引用和对象可以是不同的类型:

Animal myDog = new Dog(); //两者的类型不同。引用变量的类型声明为Animal,但对象是Dog

在运行多态时,引用类型可以是实际对象类型的父类:

Animal[] animals = new Animal[5];//声明Animal类型的数组,也就是说一个会保存Animal类型对象的数组

animals [0] = new Dog();

animals [0] = new Cat();

animals [0] = new Wolf();

animals [0] = new Lion(); //可以放任何Animal的子类型进去

for (int i=0; i < animals.length; i++){ //多态抢的地方在于可以将数组元素逐个调出来当作是Animal来操作

animals[i].eat(); //当i为0时,这里会调用Dog的eat方法

animals[i].roam(); //当i为1时,这里调用Cat的eat方法

}

也就是说将参数声明为父类类型,就可以在运行时传入任何的子类对象。不仅如此,参数和返回类型也可以多态,也就是根据方法中输入的参数对象不同,执行对应对象的该方法。

题目

public class duotai {

public static void main(String[] args){

A a =new A();

B b =new B();

C c =new C();

A a2=new C();

a.m1();

b.m2();

c.m3();

a2.m1();

a2.m2();

a2.m3();

c.m1();

c.m2();

c.m3();

}

}

class A{

int ivar=7;

void m1(){

System.out.println("A's m1");

}

void m2(){

System.out.println("A's m2");

}

void m3(){

System.out.println("A's m3");

}

}

class B extends A{

void m1(){

System.out.println("B's m1");

}

}

class C extends B{

void m3(){

System.out.println("C's m3 "+(ivar+6));

}

}

相关知识

Java笔记:多态polymorphic
java 多态
java测试类pet
(java)多态
多态
Java基于JAVA语言的宠物寄养管理(开题+源码)
毕业设计:基于java的宠物管理系统设计与实现
毕业设计:基于java的宠物领养系统设计与实现
电子宠物游戏java
编写Java程序模拟主人养宠物 java写一个宠物系统

网址: 【Java学习记录】十二 Java中的多态 https://www.mcbbbk.com/newsview171558.html

所属分类:萌宠日常
上一篇: 七麦数据
下一篇: while((c = getch

推荐分享