多态性
多态性
通过覆盖父类的方法来实现,在运行时根据传递的对象引用,来调用相应的方法 。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Car {
public void run() {
System.out.println("car running");
}
}
class Bus extends Car {
public void run() {
System.out.println("bus running");
}
public static void main(String[] args) {
Bus b = new Bus();
}
}
class Test {
static void method(Car c) {
c.run();
}
public static void main(String[] args) {
Car car;
Bus bus = new Bus();
car = bus;
Test.method(car);
}
}
// output: bus running
当我们将子类对象的引用传给声明为父类的一个对象变量,如果子类有的方法,就调用子类的方法,如果子类没有这个方法,就调用父类的方法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Car {
public void run() {
System.out.println("car running");
}
}
class Bus extends Car {
}
class Test {
static void method(Car c) {
c.run();
}
public static void main(String[] args) {
Car car;
Bus bus = new Bus();
car = bus;
Test.method(car);
}
}
// output: car running
当我们将子类对象的引用传给声明为父类的一个对象变量,如果子类有的方法,就调用子类的方法,如果子类没有这个方法,就调用父类的方法。这句话也不一定,当父类的该方法为私有的,那么就还是调用子类的,如果子类无这个方法,而父类有这个方法,但它是私有的,那么就会报告编译时异常。
多态性的好处
它可以根据在运行的时候,根据我们传递不同对象的引用来调用不同对象的方法。
重载可以看作是编译时多态,在编译时刻,根据我们调用方法传递参数的不同来调用相应的方法。上面讲的多态叫做运行时多态,在运行时刻,根据我们传递对象引用的不同来调用相应对象的方法。