多态是继封装、继承之后,面向对象的第三大特性。
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。
如Student类可以为Person类的子类。那么一个Student对象既可以赋值给一个Student类型的引用,也可以赋值给一个Person类型的引用。
最终多态体现为父类引用变量可以指向子类对象。
多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
public class Father {
public void say() {
System.out.println("This is Father's word");
myhobby();
} public void myhobby() {
System.out.println("This is Father's hobby");
}
}
public class Son extends Father { private String sonname; public String getSonname() {
return sonname;
} public void setSonname(String sonname) {
this.sonname = sonname;
} public void say(){
System.out.println("This is Son's word");
} public void myhobby(String sonname){
System.out.println("This's Son's hobby for String " + sonname);
} }
我是测试类
public class testDuotai { public static void main(String[] args) {
Father father1 = new Son();
System.out.println("实例化一个Son对象,用父亲接收");
father1.say();
father1.myhobby(); Son son = new Son();
System.out.println("实例化一个Son对象,用Son接收");
son.say();
son.myhobby();
son.myhobby(son.getSonname());
}
}
Java实现多态有三个必要条件:继承、重写、向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
对于Java而言,它多态的实现机制遵循一个原则:
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
基于接口实现的多态Demo
public interface Car { String getName();
int getPrice();
} public class BMW implements Car { @Override
public String getName() {
return "宝马";
} @Override
public int getPrice() {
return 30;
}
} public class BenZ implements Car {
@Override
public String getName() {
return "奔驰";
} @Override
public int getPrice() {
return 50;
}
} public class jieKouDemo { public static void main(String[]args){
CarShop shop=new CarShop(); Car car1 =new BMW();
Car car2= new BenZ(); //卖出一辆宝马
shop.sellCar(car1);
//卖出一辆奇瑞QQ
shop.sellCar(car2); System.out.println("总收入:"+shop.getMoney());
}
}