首页 > 编程语言 >javaSE学习Day1之多态及向下转型

javaSE学习Day1之多态及向下转型

时间:2023-03-26 13:48:44浏览次数:38  
标签:Animal 子类 void 多态 Day1 animal Dog javaSE public

向下转型的使用

Java的多态性:

父类指向子类的声明

Animal animal = new Dog()//Dog()重写了父类Animal

  • 有了对象的多态性以后,内存实际上加载的是子类的属性和方法,但是由于变量声明为父类类型,导致编译时只能调用父类的属性和方法,子类特有的属性方法不能调用。
  • 调用子类特有的属性和方法:向下转型,使用强制类型转换符。
  • 向下转型有风险,使用强转可能出现ClassCastException异常。为了避免出现异常,此时应该使用instanceof关键字。

向下转型在开发中使用较少,一般只会用父类中存在的属性方法。

因为多态性是运行时行为,但是在编译的时候就已经加载了子类的属性和方法,但是用不了子类的特有方法,例如Dog子类类特有的方法liugou(),编译就会报错。

//父类Animal:

class Animal{
public void eat(){
System.out.println("吃吃吃");
}
public void shout(){
System.out.println("叫叫叫");
}
}

//子类Dog

class Dog extends Animal{
@Override
public void shout() {
System.out.println("汪汪汪");
}
public void eat(){
System.out.println("吃狗粮");
}

//子类特有方法lugou()

public void liugou(){
System.out.println("遛狗");
}
}
class Cat extends Animal{
    @Override
    public void shout(){
        System.out.println("喵喵喵");
    }
    public void eat(){
        System.out.println("吃鱼");
    }
    public void hand(){
        System.out.println("手贱");
    }
}

调用子类特有方法报错

public class AnimalTest {
public static void main(String[] args){
   AnimalTest test = new AnimalTest();
   test.func(new Dog());
}
public void func(Animal animal){
   animal.eat();
   animal.liugou();//子类特有方法报错
}
}

向下转型(强制类型转换):

public void func(Animal animal){
      animal.eat();
      Dog dog = (Dog) animal;//使用强制类型转换,不报错
      dog.liugou();
  }

向下转型的风险(编译时可以通过,运行时出现ClassCastException异常):

    public void func(Animal animal){
        animal.eat();
        Dog dog = (Dog) animal;
        Cat cat = (Cat) animal;
        cat.hand();//animal并没有加载cat的属性和方法,编译正常但是运行时错误
        dog.liugou();
    }

instanceof关键字的使用方法:

a instanceof A:判断对象a是否是A的实例,如果是返回true,否则返回flase。

        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.hand();//animal不是Cat的实例,因此hand()不执行
        }

标签:Animal,子类,void,多态,Day1,animal,Dog,javaSE,public
From: https://www.cnblogs.com/KJplant/p/17258539.html

相关文章

  • day13-SpringBoot整合MyBatis/Plus
    SpringBoot整合MyBatis/Plus1.SpringBoot整合MyBatis1.1整合案例需求:整合SpringBoot和Mybatis,向数据库中查询数据。项目结构:1.1.1创建数据库和表--创建数据库DROP......
  • JavaSE
    前言字节流和字符流体系相同,仅操作的数据类型不同。节点流和过滤流的关系,是装饰者模式的体现。转换流,是适配器模式的体现。I/O对磁盘文件的读写,针对的是File类。......
  • JavaSE
    File:用于代表磁盘中的一个文件或文件夹(未必真实存在),提供操作文件本身的方法。1、常用属性路径分隔符:;pathSeparator``pathSeparatorChar`名称分隔符:\Separ......
  • day12-SpringBoot数据库操作
    SpringBoot数据库操作1.JDBC+HikariDataSource在SpringBoot2.x项目中,默认使用Hikari连接池管理数据源。相比于传统的C3P0、DBCP、Tomcatjdbc等连接池更加优秀。当......
  • day11-SpringBoot中注入Servlet&Filter&Listener
    SpringBoot中注入Servlet&Filter&Listener1.基本介绍文档:SpringBoot中注入Servlet&Filter&Listener考虑到实际开发业务非常复杂和兼容问题,SpringBoot支持将Servlet、......
  • 【ACM算法竞赛日常训练】DAY1题解与分析
    DAY1共四题:月月查华华的手机:https://ac.nowcoder.com/acm/problem/23053RinneLovesEdges:https://ac.nowcoder.com/acm/problem/22598逆序对:https://ac.nowcoder.com......
  • C++ 程序设计 第6章 多态与虚函数
    第6章多态与虚函数1多态的基本概念运用封装继承多态能够有效提高程序的可读性,可扩充性,可重用性。多态从字面上理解就是多种形态或多种形式。具体到C++这种面向对象程序......
  • 《渗透测试》WEB攻防-ASP安全&MDB下载植入&IIS短文件名&写权限&解析 2022 Day18
    1  ➢ ASP-数据库-MDB默认下载➢ ASP-数据库-ASP后门植入连接➢ ASP-中间件-IIS短文件名探针-安全漏洞➢ ASP-中间件-IIS文件上传解析-安全漏洞➢ ASP-中......
  • linux基础day12:用户的身份提权
    用户的身份提权sudo命令提权什么是sudosudo就是普通用户可以提权,执行root用户可以执行的命令为什么要用到sudo如果在公司中,入职后,领导给运维的用户是普通用户,但是有些......
  • 25.封装、继承、多态
    封装、继承、多态一、封装1.高内聚,低耦合高内聚就是类的内部数据操作细节自己完成,不允许外部干涉。低耦合就是仅暴露少量的方法给外部使用。2.数据的隐藏通常,应禁止......