Java继承与多态

Java继承与多态码解

请注意,本文编写于 214 天前,最后修改于 171 天前,其中某些信息可能已经过时。

项目目录架构

20190420162312.png
20190420162312.png

父类Animal.java

package cn.allms.bean;
/**
 * 动物对象类
 * @author allms
 *
 */
public class Animal {
    private String name = "浅枫"; //动物名,私有属性
    public Integer age = 1; //动物的年龄,共有属性
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    // 共有方法
    public void call() {
        System.out.println("动物发出叫声!");
    }
    // 私有方法
    @SuppressWarnings("unused")
    private void jump() {
        System.out.println("动物跳高的私有方法!");
    }
    
    // 静态方法
    public static void sleep() {
        System.out.println("动物睡觉的静态方法");
    }
    public void look() {
        System.out.println("我看了动物一眼");
    }
}

子类Cat.java

package cn.allms.bean;
/**
 * 猫继承动物类
 * @author allms
 *
 */
public class Cat extends Animal {
    /**
     * 继承:继承父类的开辟的控件,子类对父类的继承,继承的是继承方法访问权限,而不是代码片段
     * 共有的方法能直接访问,而不是子类存在这个方法
     * 成员变量的继承:继承父类的成员变量的空间
     * 方法的继承:不继承空间,只是继承方法的访问权限
     */
    
    public void call() {
        System.out.println("小猫发出叫声!");
    }
    
    public void look() {
        System.out.println("我看了猫一眼");
    }
}

子类Dog.java

package cn.allms.bean;

public class Dog extends Animal {
    public void look() {
        System.out.println("我看了狗狗一眼");
    }
}

测试类1

package cn.allms.test;

import cn.allms.bean.Animal;
import cn.allms.bean.Cat;
/**
 * 测试类
 * @author allms
 *
 */
public class MyTest {
    public static void main(String[] args) {
        Cat cat = new Cat(); //创建Cat对象的一个实列
        //cat.name=""; // 私有属性不能够直接访问
        //String catName = cat.getName(); //私有属性只能通过简介的共有方法访问
        System.out.println(cat.age); //父类的age,直接输出父类的初始值1
        System.out.println(cat.age=5); // 共有属性可以直接访问并赋值
        System.out.println(cat.getName());//调用共有的getName()方法
        
        //cat.jump();//父类的私有方法无法被访问
        // 方法重写/覆盖:子类开辟一个内存空间,并不是覆盖父类的内存空间,父类的方法任然存在
        cat.setName("沐雪");
        System.out.println(cat.getName());//调用共有的getName()方法
        cat.call();// 子类的call()方法
        System.out.println("---------------------父类的方法属性依旧存在");
        /**
         * 方法重写/覆盖并不能把父类的方法属性进行覆盖抹去
         */
        Animal animal = new Animal();//创建动物类的一个实例
        animal.call();
        System.out.println(animal.getName());//调用共有的getName()方法
        System.out.println(animal.age);
    }
}

运行结果

1
5
浅枫
沐雪
小猫发出叫声!
---------------------父类的方法属性依旧存在
动物发出叫声!
浅枫
1

测试类2

package cn.allms.test;

import cn.allms.bean.Animal;
import cn.allms.bean.Dog;

public class MyTest2 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Animal animal = new Animal();
        /**
         * 运行不会报错,Dog类并没有call()方法,但它继承了Animal类
         * 则自动调用父类的call()方法
         */
        dog.call();
        
        animal.call();
    }
}

运行结果

动物发出叫声!
动物发出叫声!

测试类3

package cn.allms.test;

import cn.allms.bean.Animal;
import cn.allms.bean.Cat;
import cn.allms.bean.Dog;

public class MyTest3 {
    public static void main(String[] args) {
        // 上下型,无论后面是什么引用类型,都会调用Animal类的slee()静态方法
        Animal animal_1 = null;
        animal_1.sleep();
        
        Animal animal_2 = new Cat();
        animal_2.sleep();
        
        Animal animal_3 = new Dog();
        animal_3.sleep();
        
    }
}

运行结果

动物发出叫声!
动物发出叫声!

测试类4

package cn.allms.test;

import cn.allms.bean.Animal;
import cn.allms.bean.Cat;
import cn.allms.bean.Dog;

/**
 * 多态测试类
 * @author allms
 *
 */
public class MyTest4 {
    public static void main(String[] args) {
        // 上转型: 父类的引用指向子类对象
        /**
         * 父类的引用animal
         * 指向子类对象  animal = new Cat(); animal = new Dog();
         */
        Animal animal = null; //给动物类赋值为null
        animal = new Cat();
        animal.look();
        
        animal = new Dog();
        animal.look();
        
        /**
         * 多态:相同的引用Animal,调用相同的方法look(),产生不同的结果
         * 多态的方式必须依赖:
         * 1.必须有继承
         * 2.必须有方法的引用
         * 3.必须有上转型
         */
    }
}

运行结果

我看了猫一眼
我看了狗狗一眼

测试类5

package cn.allms.test;

import cn.allms.bean.Animal;
import cn.allms.bean.Cat;
import cn.allms.bean.Dog;

public class MyTest5 {
    public static void main(String[] args) {
        /**
         * 下转型分为真下转型和假下转型
         */
        /*============真下转型(默认不被允许)=============*/
//        Animal animal= new Animal();
//        Cat cat= (Cat)animal;
//        // 运行报错:java.lang.ClassCastException
        /*============假下转型=============*/
        Animal animal = new Dog();
        Dog dog = (Dog)animal; //下转型必须进行强制转换
        dog.call(); //指向父类的call(),子类未重写父类的call()方法
        dog.look(); //子类已经重写父类的look()方法
        
        // True 假下转型,False 真下转型
        Animal animal_1= new Animal();
        if(animal_1 instanceof Cat) { //instanceof判断真下转型与下转型
            Cat cat= (Cat)animal_1;
            cat.look(); 
        }
        System.out.println("---------------------");
        if(animal instanceof Dog) { //instanceof判断真下转型与下转型
            Dog dog1= (Dog)animal;
            dog1.look(); 
        }
    }
}

运行结果

动物发出叫声!
我看了狗狗一眼
---------------------
我看了狗狗一眼

源项目下载

extendsDemo.zip

此处评论已关闭