首页 > 编程语言 >关于java中的多态和对实例化对象的一些理解

关于java中的多态和对实例化对象的一些理解

时间:2023-05-03 16:12:34浏览次数:47  
标签:java 子类 void 多态 Dog 实例 Animal 重写 public

java面向对象三大特征即为:继承封装多态。而多态需要三大必要条件。分别是:继承、方法重写、父类引用指向子类对象。我们先一个一个来理解。

1、首先是继承和重写。这个很简单。因为多态就是建立在不同的重写之上的。也就是说多态就是在使用着一个方法的不同重写。而重写又是依赖着继承关系。

2、这个父类引用指向子类对象。

首先先上代码示例。

public class Animal {
    public void Shout(){
        System.out.println("叫叫叫");
    }
    public void Hi(){
        System.out.println("打招呼");
    }
}
class Dog extends Animal{
    public void Shout(){
        System.out.println("汪汪汪");
    }
    public void seeHouse(){
        System.out.println("看家");
    }

}class Cat extends Animal{
    public void Shout(){
        System.out.println("喵喵喵");
    }
}

class goose extends Animal{
    public void Shout(){
        System.out.println("嘎嘎嘎");
    }
}

 

 

public class TestPolym {
    public static void main(String[] args) {
        AnimalShout(new Dog());
        AnimalShout(new goose());
    }
    static void AnimalShout(Animal animal){
        animal.Shout();
    }
}

在如上代码中,Animal类是作为dog、cat、goose的父类。而TestPolym则是用于实现多态

先解释下父类引用指向子类对象:在TestPolym类中的AnimalShout方法中,接收着Animal类的对象。这就是父类的引用;

指向子类对象则是看这一行: 

AnimalShout(new Dog());

这里其实可以理解为:

Animal animal = new Dog();

其实这一行打出来基本就可以理解个七七八八。这句话就是定义了一个对象 animal 然后将其实例化成 类型为 Animal 的Dog()。因为Dog、Cat这些是Animal的子类,所以类型 Animal >= Dog、Cat......这些子类。所以首先指向子类是成立的。

其次在 Animal animal = new Dog(); 这个构造器真实的类型为Dog,但是! 编译器在看animal这个对象的时候,只会将他识别为Animal类型。而这行代码成立的最重要的原因是:Dog是Animal的一个子类,并且Dog类总是小于等于Animal类。然后我们看一下我们在使用什么方法。这个方法是Shout。是由Animal重写而来。因此在调用由Dog类重写Animal类的方法如此代码中的Shout方法时,此语句成立。 

反之,使用此语句去运行不是由Animal类中的方法重写而来的方法时,此语句会报错。例如用这一行去调用seeHouse时


 编译器会红,并且建议你在Animal中创建这样一个方法,那我们去创建一下。之后就会发现,Animal和Dog两个类中都有Hi方法了,又变成重写了!而且程序也能跑的通了。所以本质上还是Animal类包含(抽象一点的)Dog类。




标签:java,子类,void,多态,Dog,实例,Animal,重写,public
From: https://www.cnblogs.com/Link-Soul/p/17369151.html

相关文章

  • Java 网络编程 —— 创建多线程服务器
    一个典型的单线程服务器示例如下:while(true){Socketsocket=null;try{//接收客户连接socket=serverSocket.accept();//从socket中获得输入流与输出流,与客户通信...}catch(IOExceptione){e.printStackTr......
  • Java虚拟机之自动内存管理
    1内存区域1.1运行时数据区域运行时数据区域可以划分为由所有线程共享的方法区、堆和线程隔离的虚拟机栈、本地方法栈、程序计数器。1.1.1程序计数器(ProgramCounterRegister)-线程隔离程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器。Java虚拟机......
  • Java基础
    目录Java基础注释标识符数据类型变量包机制JavaDoc生成文档Java基础注释单行//,多行/*注释/文档注释/**@Description*@Author*/标识符数据类型longnum=30L;floatnum=10.1F;最好完全避免用浮点数进行比较(用Bigdecimal)强制类型转换(不能对boolean转换):(类型)......
  • java基于springboot+vue非前后端分离的影城管理系统、影院销售管理系统,附源码+文档+PP
    1、项目介绍本影城管理系统主要包括二大功能模块,即用户功能模块和管理员功能模块。(1)管理员模块:系统中的核心用户是管理员,管理员登录后,通过管理员功能来管理后台系统。主要功能有:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订......
  • 实例化对象 A a = new A();
    "new"在Java中代表实例化的意思,Aa=newA()代表实例化了一个对象a,这个对象a属于A类.可以认为A是一个抽象概念,对象a是一个实体(存储于内存),等式左边实际上就是用类A定义对象a,等式右边就是创造对象a的过程.Aa;   是定义一个类型为A的对象。new实例化a=n......
  • java操作map集合
    java操作map集合importjava.util.HashMap;importjava.util.Map;publicclassMapExample{publicstaticvoidmain(String[]args){//创建一个HashMap对象Map<String,Integer>map=newHashMap<>();//添加键值对......
  • JAVA方法详解
    JAVA方法详解方法是程序中的最小执行单元 形参:形式参数,是指方法定义中的参数实参:实际参数:方法调用中的参数 有返回值的定义格式:publicstatic返回值类型方法名(参数){方法体;return返回值;}调用格式:直接调用赋值调用输出调用方法的注意事项方法......
  • Java 注解
    什么是Java的注解如何在Java中定义一个注解注解通过@interface关键字进行定义。public@interfaceTestAnnotation{}上面的代码就创建了一个名字为TestAnnotaion的注解。那么如何使用这个注解呢?下面的代码创建一个类Test,然后在类定义的地方加上@TestAnnotation......
  • idea创建SpringBoot项目报错For artifact {mysql:mysql-connector-java:null:jar}: Th
    Forartifact{mysql:mysql-connector-java:null:jar}:Theversioncannotbeempty.报错如图:pom.xml文件如图:添加版本号:就好了......
  • 关于java中的super
    首当其冲先说一下super的用途和含义。他是用于调用一些被重写的方法。这里还可以复习一下子这个重写:重写是把新的方法放在被重写的方法前面。在被重写的子类中,优先调用重写后的方法。但是如果想要调用原本未被重写的方法的话,就需要super了。如上的代码中ChildClass为FatherClass......