在Dog中通过super.eat()访问的是Animal中的方法,说明子类Dog没有复写Animal中的方法,但是通过泛型 红色字体不对 ,这个不能说明没有复写,super 关键字 是直接调用父类的方法,更不能叫做泛型。。。Animal a = new Dog(); a.eat();这时访问的是Dog中复写的eat()方法。 这个是必然的 。。。
下面是多态的解析和代码。。。三种不同动物有各自特有的呼吸方式。所以复写了父类的呼吸方式。调用时跟别调用各自的。如果需要调用父类的方法 可以用super关键字
//多态
//多态是指同一个方法根据上下文使用不同的定义的能力。方法的覆写,和方法的重载都可以被看成多态。。
//但是Java的多态更多是动态绑定放在一起理解的。。
//动态绑定是一种机制,通过此机制,对一个已经被重写的方法的调用将会发生在运行时,而不是在编译时去解析。
//下面程序演示动态的绑定
//首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。
//标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中
//可以有两个或更多的函数,叫同一个名字而他们的参数不同。 他们之间毫无关系,是
//不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!
//再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。
//我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那
//就把那个函数在子类中重新实现一遍。 这样再调用这个方法的时候,就是执行子类中的过程
//了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然
//你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)
public class DuoTai {
public static void main(String[] args) {
Animal[] animal = new Animal[3];
//创建不同的对象,都存入Animal的引用中
animal[0] = new Animal();
animal[1] = new Sheeps();
animal[2] = new Fish();
DuoTai dt = new DuoTai();
dt.move(animal[0]);
dt.move(animal[1]);
dt.move(animal[2]);
//move 方法首先判断animal对象是哪个类的对象,由判断执行不同的方法。
//在判断过程中使用了instanceof运算符,它是用来判断对象类型的一个运算符。
//当判断出它的类型后,在对其进行类型转换,得到原始的类型转换后,就可以调用它特有的方法了
//运行结果
/*动物做运动
羊上山跑着玩
鱼在水中自由游*/
//animal[0].breath();
//animal[1].breath();
//animal[2].breath();
//定义一个数组存放Animal对象,存3个元素,分别是Animal、Sheeps、Fish。
//分别调用breath()方法。程序执行结果
/*动物呼吸
羊是用肺呼吸的
鱼是用腮呼吸的*/
//对象是多态的,定义一个Animal对象,它既可以存Animal对象,也可以存放Animal的子类的对象
//在子类Sheeps。Fish对象。执行breath方法时会自动调用原来对象的方法。而不是父类的方法
//这就是动态绑定
}
void move(Animal animal) {
//进行对象类型的判断
if(animal instanceof Sheeps){
((Sheeps)animal).sheepsRun();
}else if (animal instanceof Fish) {
((Fish)animal).swim();
}else {
animal.run();
}
}
}
class Animal{
String type;
String name;
int age;
void eat() {
System.out.println("动物吃食物");
}
void breath() {
System.out.println("动物呼吸");
}
void run() {
System.out.println("动物做运动");
}
}
class Sheeps extends Animal {
String sheepsType;
void sheepsRun(){
System.out.println("羊上山跑着玩");
}
void breath() {
System.out.println("羊是用肺呼吸的");
}
}
class Fish extends Animal {
String fishType;
void swim() {
System.out.println("鱼在水中自由游泳");
}
void breath() {
System.out.println("鱼是用腮呼吸的");
}
}
|