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. Win10系统如何在防火墙里开放端口

    Win10系统如何在防火墙里开放端口(下面傻瓜式教学) 然后怎么做呢?????? 下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步.下一步......... 随便起个名字 KO

  2. 8-过滤器Filter和监听器Listener

    一.web监听器:监听特殊事件的发生1.监听实现步骤 a.写一个java类,实现特定的接口,重写相关方法 b.在web.xml中,牌配置 <listener> <listener-c ...

  3. error C2381: “exit”: 重定义;__declspec(noreturn) 不同

    问题: error C2381: “exit” : 重定义:__declspec(noreturn) 不同 解决办法: 调换一下头文件的包含次序: #include <GL/glut.h> ...

  4. Spring常用配置示例

    Spring 是一款Java平台的开源框架,是为解决企业级应用程序开发的复杂性而创建的,通过良好的分层架构让开发人员能够专注于业务逻辑的开发. Spring框架是一个分层架构,由不同的模块组成,构成s ...

  5. .Net Core应用框架Util介绍(五)

    上篇简要介绍了Util在Angular Ts方面的封装情况,本文介绍Angular封装的另一个部分,即Html的封装. 标准组件与业务组件 对于管理后台这样的表单系统,你通常会使用Angular Ma ...

  6. Git和Gitlab在使用过程中所遇到的问题

    01-关于gitLab添加ssh key后,git clone还提示输入密码问题 本地用户连接远程仓库需要用 HTTP方式连接,SSH方式会出现提示输入密码 git clone http://.... ...

  7. python的设计原则及设计模式

    python的设计原则及设计模式 七大设计原则 单一职责原则 [SINGLE RESPONSIBILITY PRINCIPLE] 一个类负责一项职责. 里氏替换原则 [LISKOV SUBSTITUT ...

  8. SpringCloud学习笔记:声明式调用Feign(4)

    1. Feign简介 Feign采用声明式API接口的风格,将Java HTTP客户端绑定到它的内部. Feign的首要目标是简化Java HTTP客户端调用过程. 2.Feign客户端示例 Feig ...

  9. [模板] 次短路 | bzoj1726-[Usaco2006Nov]Roadblocks第二短路

    简介 所谓次短路, 顾名思义, 就是第二短路. :P 1到n的次短路长度必然产生于:1到x的最短路 + edge(x,y) + y到n的最短路 简单证明一下: 设 \(dis(i,j)\) 表示 \( ...

  10. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...