多态
1.什么是多态
简单的说可以理解为某一类事物的多种存在形态。
举个例子说一下吧:
class Animal{
String color;
public void eat(){
System.out.println("吃东西")
}
}
class Dog extends Animal{
public void eat(){
System.out.println("边汪汪的叫,边吃东西")//重写
,
//当子类不想用父类中继承的eat()
方法,这时候可以重写eat()方法
}
}
比如说有一个Animal类,一个Dog类,Dog类继承了Animal类,现在我们可
以从两个方面来看Dog,即
可以把它当做Dog,也可以把它当做Animal,所以说现在Dog类可以有两种存在形式
;
2、对象多态的前提(要记住)
A:类与类(或接口)要有继承(或实现)关系。
B:一定要有方法的重写。
C:一定要有父类或者接口的引用指向子类的对象。(Animal a=new Dog
)
3、多态思想:可以指挥同一类型的一批对象做事情。
多态的出现让我们复杂的问题简单化了。
4、多态中成员的特点:
A:成员变量:编译和运行都看父类。
B:非静态方法:编译看父类,运行看子类。(重点,今天考试考到好几
个)
比如:Animal a=new Dog;
a.eat();
这句代码编译的时候首先看父类有没有eat()方法,如
果有这个方法,编译可以通过,如果没有,编译不会通过
运行的时候看子类Dog有没有eat()方法,如果子类有
eat()方法,输出的是子类中的eat()方法,如果没有输出父类Animal
中的eat()方法;
为了更好的说明这一点我就举个今天考的例子吧
class Base{
void test( ){
System.out.println(“Base.test()”);
}
}
public class Child extends Base{
void test(){
System.out.println(“Child.test()”);
}
public static void main(String[] a){
Child child=new Child();
Base base=new Child();
base.test();
}
}
分析:题目中有两个类,分别是Base类和Child类,并且Child继承了Base
类,并且重写了父类的text()方法
Child child=new Child();创建子类对象
Base base=new Child(); 创建子类对象,赋给父类引用型变
量base,满足了多态的三个前提:1.有继承关系;2、子类重写了父类中
的方法;3、父类的引用base 指向子类对象(new Child)
base.test() 编译期间看父类中有test()方法,运
行的时候子类中也有test()方法,所以输出结果一目了然了
当然是Child,test() (是不是觉得挺简单的,只要记住这些判断步骤,相信下次遇到多态就不会出错了)
C:静态方法:编译和运行都看父类。
补充一点吧:如果子类中有自己的特有方法,如果你想调用特有方法,这
时候你就必须要向下转型了!话不多说还是看一下代码吧
class Animal{
String color;
public void eat(){
System.out.println("吃东西")
}
}
class Dog extends Animal{
public void eat(){
System.out.println("边汪汪的叫,边吃东西
“)//重写,
//当子类不想用父类中继承的eat()
方法,这时候可以重写eat()方法
public void yaoRen(){
System.out.println("我可以咬人哦")
}
}
}
Animal a=new Dog() 主函数中有这一句
代码,看到我们就想到了多态,现在我们的需求是
想调用Dog中yaoRen()这个方法,并且这个方法是子类Dog特有的方法
我们该如何调用它呢,这时候我们就不能把Dog当做Animal看待了,要把a强行转成Dog所以代码就要写成
Dog g=(Dog)a; g.yaoRen(),输出结果一目了然