java多态的理解

 1.多态的概念

       多态性是指允许不同类的对象对同一消息作出响应,多态性包括参数化多态性和包含多态性,多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

前提:

(1)要有继承关系
(2)子类要重写父类的方法
(3)父类的引用指向子类的对象(向上转型:子类自动转换为父类)

实质:父类引用指向子类对象

2.多态的使用

格式:

父类名称 对象名 = new 子类名称();

或者

 接口名称 对象名 = new 实现类名称();

3.简单示例(引用:https://www.zhihu.com/question/30082151?sort=created

3.1 创建几个类,如下图

 Cat类和Dog类继承Animal类

3.2 代码

Animal类

package 多态;

public class Animal {

    int num = 10;
    static int age=20;
    
    public void eat()
    {
        System.out.println("动物吃饭");
    }
    
    public static void sleep()
    {
        System.out.println("动物睡觉");
    }
    
    public  void run()
    {
        System.out.println("动物在奔跑");
    }
    
}

Cat类

package 多态;

public class Cat extends Animal{

    int num = 80;
    static int age = 90;
    
    String name="tomcat";
    
    //重写父类的方法
    public void eat() {
        System.out.println("猫吃饭");
    }
    
    //重写父类的静态方法
        public static void sleep() {
        System.out.println("猫在睡觉" );
        }
        
        
        public void catchMouse() {
        System.out.println("猫在抓老鼠"); 
        }
    
    
    
}

Dog类

package 多态;

public class Dog extends Animal{

    String name="dongdong";
    
    public void eat()
    {
        System.out.println("dongdong在吃饭");
    }
}

Demo_Test类

package 多态;
public class Demo_Test {

    
    public static void main(String[] args) {
        /*多态条件1:要有继承关系
         * 多态条件2:子类要重写父类的方法
         * 多态条件3:父类的引用指向子类的对象(向上转型:子类自动转换为父类)
         */
        Animal animal = new Cat();

        //结论1:非静态方法,编译看左边(父类),运行看右边(子类)。动态绑定
        animal.eat(); 
        
        //结论2:静态方法,编译看左边(父类),运行看左边(父类)。
        animal.sleep();
        
    
        
        //结论3:成员变量,编译看左边(父类),运行看左边(父类)。
        System.out.println(animal.num);
        System.out.println(animal.age);
        
        //多态的弊端:不能使用子类特有的成员属性和子类特有的成员方法。
        animal.run();//可以访问父类的方法
        //animal.catchMouse();//这个父类指向子类对象的引用无法访问子类特有的方法
        
        //如果父类的引用需要访问子类的属性和方法
        //多态优点1:减少了多余对象的创建
        Cat cat2 = (Cat)animal;//(向下转型:需要强制转换)  
        
/* cat2.eat(); cat2.sleep(); cat2.catchMouse(); cat2.run(); */
//子类对象替代父类引用为形参的方法 GeneralEat(new Cat()); GeneralEat(new Dog()); } /*多态的优点2:减少了方法的编写,方法的形式参数为父类引用, * 实参可以是父类的所有子类对象,提高了程序的扩展性*/ public static void GeneralEat(Animal a) { a.eat(); if(a instanceof Cat) { Cat cat = (Cat)a; cat.eat(); } if(a instanceof Dog) { Dog dog = (Dog)a; dog.eat(); } } //上面的GeneralEat()方法相当于以下2个方法的作用,且扩展更灵活 public static void GeneralEat(Cat cat) { cat.eat(); } public static void GeneralEat(Dog dog) { dog.eat(); } }

运行结果:

参考文章:

https://www.zhihu.com/question/30082151?sort=created

https://www.cnblogs.com/AceIsSunshineRain/p/5058375.html

转载文章链接已标明,如有侵权请告知。文章仅作为知识记忆所用,如有错误,敬请指正。
原文地址:https://www.cnblogs.com/YorkZhangYang/p/12718882.html