专栏首页浅枫沐雪Java继承与多态

Java继承与多态

项目目录架构

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • dplayer的一些设置

    深浅无解
  • JAVA经典算法40例

    【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多...

    深浅无解
  • SQL增删改查

    深浅无解
  • Go并发编程之美-条件变量

    go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于...

    加多
  • Go并发编程之美-条件变量

    go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于...

    加多
  • dotnet core 黑科技·String.IndexOf 性能

    本文来告诉大家 dotnet core 里面使用的黑科技,如何提高String.IndexOf(char)的性能

    林德熙
  • Class类文件的结构

      各种不同平台的虚拟机与所有平台都统一使用的程序存储格式---字节码(ByteCode)是构成平台无关性的基石。Class文件是一组以8位字节为基础单位的二进...

    YGingko
  • PHP函数

    可变函数类似于可变变量,通过在变量名后面添加一对括号,PHP就会自动寻找与变量名的值相同的函数,并且执行该函数

    白胡杨同学
  • 深度学习、强化学习、 深度强化学习,傻傻分不清楚?

    但面对众多开发平台的深度学习框架,需要考虑的问题可就多了:兼容性、社群资源、框架迁移等等不一而足。

    商业新知
  • 信安之路从零到一

    俗话说:未知攻 焉知防,随着网络安全事件不断的发生,就在 2017 年 5 月 12 日起,全球范围内爆发的基于 Windows 网络共享协议进行攻击传播的蠕虫...

    信安之路

扫码关注云+社区

领取腾讯云代金券