最近在看多态,里面有一句话困扰了我很久,就是

编译时类型和运行时类型

ps:多态定义:把子类对象直接赋给父类的引用时,当运行时调用该引用类型的方法时,其方法行为总是表现出子类的行为特征,而不是父类的行为特征,这就出现了同一引用调用引用变量带的方法是,表现出不同的特征,这就是多态。
我一直都对这个编译时类型和运行时类型很迷惑,百度了很多讲的都很浅显大都如下:

Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。

这样的说法只是简单地描述了编译时类型、运行时类型,并没有真正的从本质上说明什么是编译时类型什么是运行时类型。最终我还是找到了一篇写的比较好的文章,拷贝其中的一段给大家看看,外加上自己的代码

Person p=new Women()(Women类继承自Person类)那么,假如p的属性修饰符为public 访问属性时得到的是Person类的属性还是Women类的属性,方法调用又是哪个类?答案:会得到Person类的属性,调用Women类的方法。为什么会这样呢?这里就需要知道什么是编译时类型和运行时类型,Java程序状态会分为编译和运行这两种状态,编译时,JVM会在栈中静态创建基本数据变量,和引用数据变量的引用,回到刚刚那句代码,显然,p这个引用就是在编译时创建的,那么,p的编译时类型就是Person了,当运行这句java代码时,JVM在堆中为p新建一块内存,对应new Women()这句代码,所以p的运行时类型就是Women

这篇文章的地址在这大家可以去看看原版文章写得非常好。http://blog.csdn.net/qq_23419401/article/details/52064871#java
下面我就要发表一下自己的看法了。我们都知道栈和堆,在栈中存放的是一些引用和一些变量,而堆内存中存放的是对象。
所以:编译时期可以理解为堆内存中还没有为该对象创建内存,只是在栈中创建了一些基本类型的变量和引用,所以编译时类型就是指在new该对象之前被加载到栈中的属性或方法。而运行时类型,是指new了一个对象出来,在栈中为该对象分配了内存,此时的运行时类型也就是栈中对象的属性或方法了。
 Person person = new student();
这里就可以很好地理解编译时类型和运行时类型了。
编译时类型是Person,当new了一个对象之后,堆内存中产生了一个Student对象,此时的类型就是运行时类型,也就是Student类型了。这里需要补充的是,在多态中,将子类对象赋给父类的引用,会产生多态。
Father son = new Son();
而这里的son只能调用Father的方法(重写或者继承的方法),而不能调用本身定义的一些方法(自己编写的父类中没有的方法)。例如下面这样就会报错。

public class Father {public String name;public Father(){this.name = "father";}public void show(){System.out.println("father's name : " + this.name);}
}public class Son extends Father {public String name;public Son(){this.name = "son";}public void show(){System.out.println("Son's name: " + this.name);}public void show2(){System.out.println("show2");}public static void main(String[] args) {Father son = new Son();son.show2();//此处就会报错}
}
因为多态中强调:编写java程序时,引用类型变量只能调用其编译时类型的变量,不能调用其运行时类型变量。此时的show2()就是运行时类型的变量了。所以会报错

编译时类型和运行时类型到底是什么?相关推荐

  1. java 运行 对象_java实例对象的编译时类型和运行时类型

    为什么要区分编译时类型和运行时类型? 看这样一句代码:Person p=new Women()(Women类继承自Person类)那么,假如p的属性修饰符为public 访问属性时得到的是Person ...

  2. C++编译时多态和运行时多态

    C++编译时多态和运行时多态 作者:melonstreet 出处:https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有,欢迎转载,但未 ...

  3. 浅谈Java异常及其编译时异常和运行时异常的区别

    异常是程序编码和运行时经常发生的事件,了解异常有助于我们提高代码质量,增强系统的健壮性,这里总结一下Java编程中的异常.以及Java编译时异常和运行时异常的区别,并列举几种常见的异常,以供参考学习. ...

  4. 编译时异常和运行时异常的区别

    编译时异常和运行时异常的区别 参考文章: (1)编译时异常和运行时异常的区别 (2)https://www.cnblogs.com/lxl57610/p/6716252.html (3)https:/ ...

  5. 异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption

    一.概述 1.定义: 程序运行过程中的发生了不正常的情况 2.异常处理机制和作用----JVM虚拟机打印的 java语言时很完善的语言,提供了异常处理方式,出现异常,将异常信息打印到输出控制台,供程序 ...

  6. 编译时异常和运行时异常区别

    文章目录 1.编译时异常因为什么而得名 2.编译时异常和运行时异常区别 3.编译时异常还有其他名字 4.运行时异常还有其他名字 5.所有异常都发生在运行阶段的 1.编译时异常因为什么而得名 编译时异常 ...

  7. java中的编译时异常和运行时异常

    首先区分一下 编译时异常和运行时异常 运行时异常,也就是extends RuntimeException的异常编译时不用try{}catch(){}和throws 编译时异常,也就是extends E ...

  8. 编译时类型 和运行时类型的 区别(1)

    class T{ void f(int x){ System.out.println("int in T:" +x); } void f(double x){ System.out ...

  9. java面向对象三大特性之多态---编译时多态和运行时多态详解

    一.引言 1.什么是多态? 说到重载和重写,大家可能都知道.它们都是多态性的体现,那么说什么是多态呢?多态是指允许不同子类型的对象对同一行为作出不同的响应.例如在生活中,比如跑的动作,小猫.小狗和大象 ...

最新文章

  1. inux 后台执行命令
  2. 阿里巴巴Druid数据源,史上最强的数据源,没有之一
  3. [Apache] Apache 從 2.2 換至 2.4 httpd.conf 的調整筆記 (windows 環境)
  4. 解决 wget 使用 https 下载报错的问题
  5. linux里创建表空间和用户名,linux下oracle的启动和创建表空间用户
  6. L1-045 宇宙无敌大招呼
  7. auto.js停止所有线程_Java线程与并发编程实践:深入理解volatile和final变量
  8. nssl1458-HR 的疑惑【枚举】
  9. 虚方法(virsual method)
  10. 《信息安全系统设计基础》实验一 开发环境的熟悉
  11. 2018年,这100家AI公司值得关注!CB Insights选出AI 100第二季
  12. easyui首页模板
  13. ADC的DMA多通道数据采集(雨滴传感器+光敏传感器)
  14. python实现isprime函数_Python实现isPrime函数
  15. 基于docker一行命令搭建个人博客wordPress
  16. 淘宝天猫店铺微信公众平台建设指南
  17. end kernel panic not syncing
  18. 炒股:如何安全地追热点
  19. Hook其他程序中的StringGrid的内容(内牛满面,终于找到了。)
  20. Activiti 6研究01 - 流程文件的手动导入

热门文章

  1. mysql创建代理服务器_【初学菜鸟作-MySQL代理服务器设置与集群】
  2. win 10 开机后内存占用率过高
  3. java 调用 finalize_java finalize方法总结、GC执行finalize的过程
  4. 数据库(数据库、表及表数据、SQL语句)
  5. 工作流与工作流管理系统的概念
  6. Oracle数据库体如何用才是最好用的呢?
  7. java utf8乱码_java utf-8 乱码怎么办
  8. 我的百度地图位置定位服务器,百度地图手机版如何进行我的位置定位?
  9. c语言中rand是什么意思,c语言中Random是什么意思 random()的头文件是什么 - 云骑士一键重装系统...
  10. FastDFS网页访问文件特别慢