一、多态的介绍
1、前提:
a、必须要有子类继承父类或者接口之间的关系
b、必须要有方法的重写,没有重写没有意义。多态主要针对的是方法的重写
c、new对象:父类引用指向子类对象
Fu fu = new Zi() ->理解为大类型接收小类型
2、注意:多态下不能直接调用子类特有的功能
java
//定义抽象类
public abstract class Animal {
public abstract void eat();
}
//定义实现类
public class Dog extends Animal{
@Override
public void eat() {
}
public void lookDoor(){
System.out.println("小狗看门");
}
}
//定义测试类
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
animal.eat(); //调用的是dog对象
// animal.lookDoor(); //多态前提下,不能直接调用子类特有成员
}
}
二、多态条件下成员的访问特点
2.1、成员变量:看等号左边是谁,先调用谁中的成员变量
2.2、成员方法:看new的是谁,先调用谁中的成员方法,子类没有,招父类
java
public class Fu {
int num = 100;
public void method(){
System.out.println("我是父类中的方法");
}
}
public class Zi extends Fu{
int num = 10;
public void method(){
System.out.println("我是子类中的方法");
}
}
public class Test {
public static void main(String[] args) {
Fu fu = new Zi();
//成员变量看左边
System.out.println(fu.num);//100
//成员方法看右边new的是谁
fu.method();//我是子类中的方法
}
}
三、多态的好处
多态方式和原始方式new对象的优缺点
1、原始方法
a、优点:既能调用重写的,还能调用父类非私有的,还能调用自己特有的。
b、缺点:扩展性差。
2、多态方式
a、优点:扩展性强。
b、缺点:不能直接调用子类特有功能
java
public abstract class Animal {
public abstract void eat();
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("小狗在吃骨头");
}
//子类特有功能
public void lookDoor(){
System.out.println("小狗看门");
}
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫在吃鱼");
}
public void catchMouse(){
System.out.println("小猫捉鱼");
}
}
//原始方法new对象
public class Test01 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
method(dog);
//当需要一个Cat类时,需要在创建一个方法
}
public static void method(Dog dog){
dog.eat();
dog.lookDoor();
}
}
//多态方式new对象
public class Test02 {
public static void main(String[] args) {
Animal animal = new Dog();
// animal.lookDoor();//不能调用子类特有的
Animal cat = new Cat();
method(cat);
//当需要dog时,new Dog,method方法即可
}
/**
*形参传递父类类型,调用次方法父类类型可以接收任意他的子类类型
*传递哪个子类对象,就指向哪个子类对象,调用哪个子类中重写的方法
*/
public static void method(Animal animal){
animal.eat();
}
}