“成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边。”

意思是:当父类变量引用子类对象时(Fu f = new Zi();),在这个引用变量f指向的对象中,他的成员变量和静态方法与父类是一致的,他的非静态方法,在编译时是与父类一致的,运行时却与子类一致(发生了复写)。

例:

class Fu {

intnum = 5;

static void method4() {

System.out.println("fu method_4");

}

void method3() {

System.out.println("fu method_3");

}

}

class Zi extends Fu {

intnum = 8;

static void method4() {

System.out.println("zi method_4");

}

void method3() {

System.out.println("zi method_3");

}

}

class DuoTaiDemo4 {

public static void main(String[] args) {

Fu f = new Zi();

System.out.println(f.num);//与父类一致

f.method4();//与父类一致

f.method3();//编译时与父类一致,运行时与子类一致

Ziz = new Zi();

System.out.println(z.num);

z.method4();

z.method3();

}

}

输出结果:

5

fu method_4

zi method_3

8

zi method_4

zi method_3

分析:

Fu f = new Zi();----------首先了解变量F到底是什么,把这句子分2段:Fu f;这是声明一个变量f为Fu这个类,那么知道了f肯定是Fu类。然后我们f=newZi();中建立一个子类对象赋值给了f,结果是什么??

结果是,拥有了被Zi类函数覆盖后的Fu类对象----f------。

上海尚学堂java原创)
也就是说:

只有子类的函数覆盖了父类的函数这一个变化,但是f肯定是Fu这个类,也就是说f不可能变成其他比如Zi这个类等等(突然f拥有了Zi类特有函数,成员变量等都是不可能的)。所以f所代表的是函数被复写后(多态的意义)的一个Fu类,而Fu类原来有的成员变量(不是成员函数不可能被复写)没有任何变化----------------获得结论:A:成员变量:编译和运行都看Fu。

但是f的Fu类函数被复写了。
获得结论:B:非静态方法:编译看Fu,运行看Zi

对于静态方法:编译和运行都看Fu!!

其实很简单,首先我们要理解静态情况下发生了什么?

当静态时,Fu类的所有函数跟随Fu类加载而加载了。也就是Fu类的函数(是先于对象建立之前就存在了,无法被后出现的Zi类对象所复写的,所以没发生复写,那么获得:C:静态方法:编译和运行都看Fu

JAVA继承:编译与运行的关系(编译看左边,运行看右边)的更多相关文章

  1. Java 继承详解

    什么是继承? 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接 ...

  2. 乐字节Java继承|方法重写、super和final关键字

    大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...

  3. java运行时跟编译时的区别,欢迎大家指正

    个人博客地址:https://blog.csdn.net/qq_41907991 关于java运行时及编译时期的区别: 首先我们要了解编译以及运行的概念: 编译就是指,编译器帮你把源码翻译成机器能识别 ...

  4. Java 面试题问与答:编译时与运行时

    Java 面试题问与答:编译时与运行时 2012/12/17 | 分类: 基础技术, 职业生涯 | 5 条评论 | 标签: RUNTIME, 面试 分享到:58 本文作者: ImportNew - 朱 ...

  5. 《深入理解Java虚拟机》-----第10章 程序编译与代码优化-早期(编译期)优化

    概述 Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运 ...

  6. 【转】Java 面试题问与答:编译时与运行时

    在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念.理解这几个概念可以更好地帮助你去了解一些基本的原理.下面是初学者晋级中级水平需要知道的一些问题. Q.下面的代码片段中,行A和行B所 ...

  7. Java编译过程、c/c++编译过程区别

    Java编译原理 1.Java编译过程与c/c++编译过程不同 Java编译程序将java源程序编译成jvm可执行代码--java字节码. c/c++编译过程: 当C编译器编译生成一个对象的代码时,该 ...

  8. java代码编译与C/C++代码编译的区别

    Java编译原理 1.Java编译过程与c/c++编译过程不同 Java编译程序将java源程序编译成jvm可执行代码--java字节码. Java在编译过程中一般会按照以下过程进行: (1)JDK根 ...

  9. 深入理解Java虚拟机读书笔记6----早期(编译期)优化

    六 早期(编译期)优化   1 “编译期”的含义     · 可能是指一个前端编译器把*.java文件转变成*.class文件的过程,前端编译器如:Sun的Javac.Eclipse JDT中的增量式 ...

随机推荐

  1. HTML canvas 笑脸

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 201521123082《Java程序设计》第3周学习总结

    201521123082<Java程序设计>第3周学习总结 标签(空格分隔): Java 1.本周学习总结 XMind图: 2.书面作业 Q1.代码阅读 public class Test ...

  3. 201521123117 《Java程序设计》第7周学习总结

    1. 本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.解释ArrayList的contains源代码 源代码: //contains()方法 public boolean conta ...

  4. 201521123095 《Java程序设计》第3周学习总结

    ,1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面 ...

  5. 201521123040《Java程序设计》第2周学习总结

    1. 本周学习总结 本周学习目录: <1>回顾(Java程序) <2>掌握各种数据类型的使用 <3>掌握运算符和表达式的使用 <4>枚举类.String ...

  6. python3中的一些小改动

    Python 3.3中使用print是必须要括号因为在python3以上的版本中print不再是一条命令而是一个函数了.

  7. 201521123089 《Java程序设计》第12周学习总结

    1. 本周学习总结 1. Input Stream -- 数据提供者可从其中读数据输出流:Output Stream -- 数据接收者可往其中写数据: 2. 字符流底层具体读写操作还是使用字节流: 3 ...

  8. eclipse:eclipse for java EE环境下如何配置tomcat服务器,并让tomcat服务器显示在控制台上,将Web应用部署到tomcat中

    eclipse环境下如何配置tomcat 打开Eclipse,单击"Window"菜单,选择下方的"Preferences".  单击"Server& ...

  9. 对Spring IOC的理解(转)

    Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理 ...

  10. Oracle函数之chr

    chr()函数将ASCII码转换为字符:字符 –> ASCII码:ascii()函数将字符转换为ASCII码:ASCII码 –> 字符: 在oracle中chr()函数和ascii()是一 ...