前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java继承与多态

Java继承与多态

作者头像
暖月寒星
发布2020-03-11 14:33:32
7110
发布2020-03-11 14:33:32
举报
文章被收录于专栏:浅枫沐雪

项目目录架构

20190420162312.png

父类Animal.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
package cn.allms.bean;

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

测试类1

代码语言:javascript
复制
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);
    }
}

运行结果

代码语言:javascript
复制
1
5
浅枫
沐雪
小猫发出叫声!
---------------------父类的方法属性依旧存在
动物发出叫声!
浅枫
1

测试类2

代码语言:javascript
复制
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();
    }
}

运行结果

代码语言:javascript
复制
动物发出叫声!
动物发出叫声!

测试类3

代码语言:javascript
复制
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();
        
    }
}

运行结果

代码语言:javascript
复制
动物发出叫声!
动物发出叫声!

测试类4

代码语言:javascript
复制
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.必须有上转型
         */
    }
}

运行结果

代码语言:javascript
复制
我看了猫一眼
我看了狗狗一眼

测试类5

代码语言:javascript
复制
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(); 
        }
    }
}

运行结果

代码语言:javascript
复制
动物发出叫声!
我看了狗狗一眼
---------------------
我看了狗狗一眼

源项目下载

extendsDemo.zip

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目目录架构
  • 父类Animal.java
  • 子类Cat.java
  • 子类Dog.java
  • 测试类1
  • 测试类2
  • 测试类3
  • 测试类4
  • 测试类5
  • 源项目下载
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档