Java基础之多态

Posted liualex1109

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础之多态相关的知识,希望对你有一定的参考价值。

多态:父类的引用指向了子类的对象。因此在实现多态时一定要有继承的关系。

比如:

class Fu {

}

class Zi extends Fu {

}

Fu obj = new Zi();

使用多态的注意事项:一定要保证父类有此成员,否则编译无法通过。

(1)在访问成员变量时,实际上访问的也是父类的成员变量。

public class Demo {
    public static void main(String[] args) {
        Animal cat = new Cat();
        System.out.println(cat.weight);  // 20.0
    }
}

class Animal {
    double weight=20;

    
}

class Cat extends Animal {
    double weight=10;

}

(2)在访问非静态的成员方法时,实际上访问的是子类的成员方法。

public class Demo {
    public static void main(String[] args) {

        Father son = new Son();
        son.drive(); //坐公交车
    }
}

class Father {

    public void drive(){
        System.out.println("开小汽车");
    }
}

class Son extends Father {

    @Override
    public void drive() {
        System.out.println("坐公交车");
    }
}

(3)在访问静态的成员方法和成员属性时,实际上访问的是父类的方法和属性。

public class Demo {
    public static void main(String[] args) {
        Father f = new Son();
        f.say(); //I‘m father
    }
}

class Father {
    public static void say(){
        System.out.println("I‘m father.");
    }
}

class Son extends Father {

    public static void say(){
        System.out.println("I‘m son.");
    }
}

(4)多态经常会在方法的参数中使用,即形参是父类,实参是子类对象,这样在运行时会动态绑定,从而节省代码量。

public class Demo {
    public static void main(String[] args) {
        Animal cat = new Cat();
        Animal dog = new Dog();
        cat.say();
        dog.say();
    }

    public static void test(Animal animal){
        animal.say();
    }

}


class Animal{
    public void say(){
        System.out.println("I‘m animal");
    }
}

class Cat extends Animal {
    public void say(){
        System.out.println("I‘m cat");
    }
}

class Dog extends Animal {
    public void say(){
        System.out.println("I‘m dog");
    }
}

(5)关于向上转型和向下转型。

public class Demo {
    public static void main(String[] args) {
        Fu obj = new Zi(); //向上转型
        Zi z = (Zi) obj; //向下转型,通过强制类型转换
    }
}

class Fu {
    
}

class Zi extends Fu {
    
}

但要注意,在向下转型时,一定要确保转换的对象的实际类型和子类相同,否则报错。

public class Demo {
    public static void main(String[] args) {
     
        Fu f = new Fu();
        Zi z = (Zi) f; //错误:Fu cannot be cast to Zi
    }
}

class Fu {

}

class Zi extends Fu {

}

(6)多态的缺点:在使用多态时,不能访问子类的独有的属性和方法(因为父类没有,无法通过编译)。

以上是关于Java基础之多态的主要内容,如果未能解决你的问题,请参考以下文章

Java基础知识回顾之三 ----- 封装继承和多态

Java基础知识回顾之三 ----- 封装继承和多态

Java基础之多态

阿花宝宝 Java基础笔记 之 多态

阿花宝宝 Java基础笔记 之 多态区分

09. Java基础之多态