**
Java中 多态的理解
**
多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
其实,简单点理解可以是: 就是在面对对象时,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,同样也可理解为对象的多种特性。
多态存在的三个必要条件:
1.要有继承;
2.要有方法的重写;
3.父类引用指向子类对象(对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,只就是动态连接)
对于多态,可以将其总结为:*
①使用父类类型的引用指向子类的对象;
②该引用只能调用父类中定义的方法和变量;
③如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接,动态调用);
④变量不能够被重写(覆盖),“重写”这个概念只针对于方法,如果在子类中“重写”了父类中的变量,那么在编译时会报错;
⑤如果子类继承父类的一个方法后加以重载,则该父类的引用不能使用重载之后的那个方法。
例子:
package test;
public class Textduotai {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*这时多态就很好的体现了,你想给你的宠物喂食,只需要添加相对应动物类,和食物类的子类,比如你有养了一只乌龟,只需要写一个乌龟类让他继承动物类,和它相对应的food
**说话,你想喂鱼给你的猫吃就只需要调用feed方法,结果你的猫吃到了鱼:程序输出我叫小白,我喜欢吃鱼, */
Master master = new Master();
master.feedFood(new Cat(), new Fish());
}
}
//定义动物类,动物有两个成员属性name和age
class Animal{
String name;
int age;
//成员变量的访问器和修改器即get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//定义动物两个方法动物都会叫
public void animalcay(){
System.out.println();
}
//动物都要吃东西
public void eat(){
System.out.println();
}
}
//定义猫类并且让猫类继承动物类
class Cat extends Animal{
String name;
int age;
public Cat(){
System.out.println("小白");
}
//父类方法的重写
public void animalcay(){
System.out.println(" 喵喵叫");
}
public void eat(){
System.out.print("I like fish");
}
}
//定义狗类,并且让狗类继承动物类的方法
class Dog extends Animal{
String name;
int age;
public Dog(){
System.out.println("我叫小黑");
}
//父类方法的重写
public void animalcay(){
System.out.println(" 旺旺叫");
}
public void eat(){
System.out.print("我喜欢吃骨头");
}
}
//定义食物类
class Food{
String name;
public void showName(){
System.out.println();
}
}
class Fish extends Food{
String name;
//重写父类方法
public void showName(){
System.out.println("我喜欢吃鱼");
}
}
class Bone extends Food{
String name;
//重写父类方法
public void showName(){System.out.println("骨头");} } //定义主人类,比如要给动物喂食
class Master {
String name ;
public Master(){
}
public Master(String name){
this.name = name;
}
public void feedFood(Animal an,Food food){
System.out.print(name+" ");
an.eat();
System.out.println("最喜欢食物:");
food.showName();
}
}
输出结果为: