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中的多态和对实例化对象的一些理解的更多相关文章

  1. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...

  2. java中实现多态的机制是什么?

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  3. Java 中的多态,一次讲个够之接口实现关系中的多态

    上文还没有写完,这一篇继续 Java 中的多态,一次讲个够之继承关系中的多态 https://www.cnblogs.com/qianjinyan/p/10824576.html 接口实现关系,和继承 ...

  4. 通过实例聊聊Java中的多态

    Java中的多态允许父类指针指向子类实例.如:Father obj=new Child();  那么不禁要发问?? 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪 ...

  5. Java中实现多态的条件是什么

    java中实现多态需要三个条件: 1,需要有继承关系的存在. 2,需要有方法的重写. 3,需要有父类的引用指向子类对象.

  6. 深度分析:理解Java中的多态机制,一篇直接帮你掌握!

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  7. Java中直接输出一个类的对象

    例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...

  8. 【Java基础】Java中的多态

    什么是多态 多态是一个对象的多种实现,是建立在继承的基础上的,即对象“人”,有老师和学生不同的实现,其实总结起来就是允许将子类类型的指针赋值给父类类型的指针. 多态的发生条件 多态发生的前提是:1. ...

  9. Java 中的多态,一次讲个够之继承关系中的多态

    多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...

  10. 深入理解Java中的多态

    一.什么是多态? 多态指同一个实体同时具有多种形式.它是面向对象程序设计(OOP)的一个重要特征.如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的. 二.多态是如何实现的? ...

随机推荐

  1. How to Change Reset Retrieve the WebLogic Server Administrator Password on WLS 10.3.6 or earlier

    To change the Administrator password on WLS 10.3.6 or earlier, perform the following steps depending ...

  2. CH573 CH579 CH582程序烧录讲解

    WCH的蓝牙芯片CH57x/CH58x系类大部分是支持串口烧录.USB烧录和LINK烧录的,除了一些特殊的封装,如571K,它引脚较少,只支持串口免按键烧录. 仿真下载:ARM内核的CH579支持Jl ...

  3. el-scrollbar element-ui的滚动条组件(官方文档没有写出来)

    <el-scrollbar></el-scrollbar> //去掉横向滚动条 /deep/.el-scrollbar__wrap { overflow-x: hidden; ...

  4. 【Python】pcap抓MySQL网络包

    pcap # -*- coding:utf-8 -*- # yum install libpcap-devel python-devel # pip install pypcap hexdump -i ...

  5. QImageReader(Writer)支持格式变少的解决方法

    首发于我的个人博客:xie-kang.com 博客内有更多文章,欢迎大家访问 原文地址 获取程序支持的图片格式: #include "mainwindow.h" #include ...

  6. @Value属性值读取

    1.在父类定义属性DQ,并通过配置初始化 @Configuration public class DQConfig { public static String DQ; @Value("${ ...

  7. JConsole连接远程Java进程

    1.Java进程启动新增如下参数 java -Djava.rmi.server.hostname=118.89.68.13 #远程服务器ip,即本机ip -Dcom.sun.management.jm ...

  8. ES2016-ES2020

    参考:https://zhuanlan.zhihu.com/p/59096242 备注:可以使用ES6取代的10个Lodash特性 https://www.w3cplus.com/javascript ...

  9. 基于Mindspore2.0的GPT2预训练模型迁移教程

    摘要: 这篇文章主要目的是为了让大家能够清楚如何用MindSpore2.0来进行模型的迁移. 本文分享自华为云社区<MindNLP-基于Mindspore2.0的GPT2预训练模型迁移教程> ...

  10. Blazor项目在VisualStudio调试时配置运行基础目录

    最近在使用 Blazor 开发管理后台时遇到了如下的问题,我这里后台整体采用了 AntDesignBlazor 组件库,在上线之后发现ReuseTabs组件在使用过程中,如果默认 / 没有指定为项目的 ...