Java引用变量有两个类型分别是

编译时类型:声明的类型

运行时类型:实际赋值的类型

如果这两个类型不一样就会出现多态

举例现有类A

class A{
public int field = 5; public void fun(){
System.out.println("A类的方法1");
} public void funA(){
System.out.println("A类的方法A");
}
}

B类继承A类

class B extends A{
public String field = "B类的字符串field"; public void fun(){
System.out.println("B类的方法1");
} public void funB(){
System.out.println("B类的方法B");
}
}

两个类都有实例变量field,一个为整型,一个为字符串

两个类都有不同的普通实例方法分别是funA()和funB()

A类中的fun()被B类重写了

一般情况下我们会这么写

A a = new A();
System.out.println(a.field);
a.fun();
a.funA();

输出为

5
A类的方法1
A类的方法A

或者我们会这么写

B b = new B();
System.out.println(b.field);
b.fun();
b.funB();

输出为

B类的字符串field
B类的方法1
B类的方法B

以上两种情况中,我们声明了一个类A(或B)的的引用变量a(或b),并且new了一个类A(或B)的实例

说明编译类型运行类型一致,不会出现什么特殊的情况

但是如果我们写

A c = new B();

情况就会变得特殊一些,我们声明了一个类A(编译类型)的引用变量c,但其实际被赋值为类B(运行类型)的一个实例引用

这时就产生了多态

System.out.println(c.field);

我们输出c的field变量,结果为5,说明访问的是父类A的实例变量

c.fun();

我们调用方法fun()发现输出为“B类的方法1”,说明此时访问的是子类B的实例方法

这就是多态

总结:多态的情况下,调用实例方法时,总是表现出子类方法(运行时类型)的行为特征,而实例变量不存在多态性,系统总是试图访问其定义类型(编译时类型)的实例变量

一个特别需要注意的是,以下的代码将引发编译错误

c.funB();

这是因为引用变量c的编译类型为类A,而类A中不含有方法funB(),即使c确实含有这个方法

Java入门——多态的更多相关文章

  1. JAVA入门第二季(mooc-笔记)

    相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第二季&g ...

  2. Java入门-浅析Java学习从入门到精通【转】

    一. JDK (Java Development Kit)  JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 ...

  3. Java入门篇(六)——类和对象

    写到这里终于写到了入门篇的最后一个知识点了.类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语 ...

  4. java入门概念梳理总结

    Java入门学习 简介 public class HelloWorld { public static void main(String []args) { System.out.println(&q ...

  5. Java入门第二季学习总结

    课程总概 该门课程作为java入门学习的第二季,是在有一定的java基础上进行的进一步学习.由于该季涉及到了java的一些核心内容,所以相对第一季来说,课程难度有所提升.大致可将该季的课程分为五部分: ...

  6. Java入门学习路线目录索引

    原创 Java入门学习路线目录索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/One_ ...

  7. 关于java中多态的理解

    java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...

  8. Java入门第一章

    后天就是十一长假了,亲们准备好了去哪儿玩了吗? 今天有点空,就来聊聊Java吧,当然是一些Java入门知识了,网上有很多,这里我只是列举一些我自己学到的,感谢大家关注喵的博客这么久,也为大家带来点新知 ...

  9. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

随机推荐

  1. DeveloperGuide Hive UDF

    Creating Custom UDFs First, you need to create a new class that extends UDF, with one or more method ...

  2. 1.5 下载和安装VMWare

    搭建虚拟环境一般都有两种方法,一种是系统自带的虚拟机,还有一种是下载VMware,Win8和Win10都自带有虚拟机,但是都不是自动开启的,所以我们必须手动开启. 一.Win10开启虚拟机 在命令行输 ...

  3. linux目录1

    1.linux常用快捷键 2.linux命令之vmstat 3.linux命令之df 4.linux命令之netstat 5.linux命令之 tar 6.The authenticity of ho ...

  4. Oracle的RowId和Rownum

    本文参照来自:https://www.cnblogs.com/whut-helin/p/8024860.html 由sql select p.*,rowid,rownum from promotion ...

  5. 【Windows】+ win10 通过KMS激活

    win10激活到期 通过KMS再次激活(亲测有效):http://www.xitongcheng.com/jiaocheng/win10_article_44435.html

  6. Eclipse中的快捷键

    Ctrl+1:快捷修复(数字 1 不是字母 l) 将鼠标悬停到出错区域,按 Ctrl+1,出现快捷修复的菜单, 按上下方向键选择一种修复方式即可. 也可以将光标移动到出错区域,按 F2 + Enter ...

  7. Spring Cloud:多环境配置、eureka 安全认证、容器宿主机IP注册

    记录一下搭建 Spring Cloud 过程中踩过的一些坑,测试的东西断断续续已经弄了好多了,一直没有时间整理搭建过程,时间啊~时间~ Spring 版本 Spring Boot:2.0.6.RELE ...

  8. Vue-移动端项目真机测试

    一.查看ip地址 在控制台输入 ifconfig 查看ip地址 二.修改webpack-dev-server配置项 webpack-dev-server 默认不支持ip地址访问,需要修改配置项 三.测 ...

  9. Elasticsearch 通关教程(二): 索引映射Mapping问题

    数据库建表的时候,我们的DDL语句一般都会指定每个字段的存储类型,例如:varchar,int,datetime等等,目的很明确,就是更精确的存储数据,防止数据类型格式混乱. CREATE TABLE ...

  10. SharedPreferences类的使用

    SharedPreferences,用xml文件保存用户的偏好设置,是一个轻量级的存储类. 效果图: 代码: activity_main <?xml version="1.0" ...