为什么子类对象调用父类对象的方法,改变的居然是被子类隐藏掉的变量?
public class InheritTest
{
public static void main(String[] args)
{
B b = new B(3,4);
b.setValue(1, 2);
System.out.println(b.compute());//请问结果是什么?
}
}
class A {
int x;
int y;
public void setValue(int i,int j){
this.x = i;
this.y = j;
}
public int compute(){
return this.x*this.y;
}
}
class B extends A{
int x;
int y;
B(int i,int j){
this.x = i;
this.y = j;
}
public void setValue(int i,int j){
super.setValue(i, j);
}
public int compute(){
return this.x*this.y;
}
}
A的字节码:
// class version 49.0 (49)
// access flags 32
class org/zengge/test/A {
// compiled from: InheritTest.java
// access flags 0
I x
// access flags 0
I y
// access flags 0
<init>()V
L0 (0)
LINENUMBER 16 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V
RETURN
L1 (4)
LOCALVARIABLE this Lorg/zengge/test/A; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 1
public setValue(II)V
L0 (0)
LINENUMBER 20 L0
ALOAD 0
ILOAD 1
PUTFIELD org/zengge/test/A.x : I
L1 (4)
LINENUMBER 21 L1
ALOAD 0
ILOAD 2
PUTFIELD org/zengge/test/A.y : I
L2 (8)
LINENUMBER 22 L2
RETURN
L3 (10)
LOCALVARIABLE this Lorg/zengge/test/A; L0 L3 0
LOCALVARIABLE i I L0 L3 1
LOCALVARIABLE j I L0 L3 2
MAXSTACK = 2
MAXLOCALS = 3
// access flags 1
public compute()I
L0 (0)
LINENUMBER 25 L0
ALOAD 0
GETFIELD org/zengge/test/A.x : I
ALOAD 0
GETFIELD org/zengge/test/A.y : I
IMUL
IRETURN
L1 (7)
LOCALVARIABLE this Lorg/zengge/test/A; L0 L1 0
MAXSTACK = 2
MAXLOCALS = 1
}
可以看出setValue操作的是A对象的属性
而new B()的时候同时会产生一个A的对象,这时b相当于有4个属性,B.x,B.y,A.x,A.y只不过A.x与A.y被隐藏掉了,而调用setValue时,发变的实际上是A对象的x与y,所以最后打印出来的还是12,而不是2,B的属性值没有发生任何变化
分享到:
相关推荐
Java基础实例大全适合于初学者 这里是所有Java技术点的集合 每个技术点都有对应的例子。 经典制作不容错过。。。 特别是对Java书籍很迷惑,想看看实际例子的朋友,这里就有你所需要的. Java基础实例大全适合于初学...
Java解惑,以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java程序员阅读...
罗列了95个容易让你迷惑的java知识点。
此书的特点在于里面有很多作者对Java语言的独有的理解与讲解,这些内容往往也是所有Java语言初学者迷惑的地方。称之为超简明入门书籍也不为过。 《Java核心技术:卷1基础知识》 这系列书籍,非常适合有一定...
4,java 进阶模块,在java基础内容上进一步详细介绍了多线程,集合框架,以及JVM内存管理,并收录java中容易使人迷惑的谜题内容。 5,数据库模块,完整详尽的介绍了数据库的创建、增删改、检索、常用函数、索引与...
Java游戏源码、蚂蚁迷惑、Android游戏源码是当前在线编程和游戏开发领域的热门话题。Java游戏源码可以帮助程序员了解游戏开发的基本原理和技巧,增强他们的编程能力。蚂蚁迷惑是一款益智休闲游戏,玩家需要在有限...
自己总结的java容易迷惑的地方~ 写得不好请多指教 QQ:273804595
JavaJava谜题谜题-表达式谜题表达式谜题 JavaJava谜题谜题 -表达式谜题表达式谜题
J2SE就是Java2的标准版,主要用于桌面应用软件的编程;...不要被IDE纠缠,在学习java和j2ee过程中,你会遇到五花八门的IDE,不要被他们迷惑,学 JAVA的时候,要学语言本身的东西,不要太在意IDE的附加功能。
基于Java多线程隐藏数组下标变换表达式的代码迷惑算法.pdf
在第3章和第4章中,透彻系统地讲解了面向对象的思想和应用,用通俗形象的语言、典型翔实的例子、鲜明的对照比较,阐述了初学者最容易迷惑的一些思想理念。在以后的章节中,作者始终以“启发编程思想,培养编程感觉”...
Java解惑(中文).pdf 给大家介绍java中容易迷惑用错的实例
对于初学java 的人,往往对java的环境变量配置比较迷惑,此小软件能有效地帮助初学者配置java环境变量。
JAVA实习报告(2) 哈尔滨理工大学管理学院信息系 实习报告 班级 信息13-4 姓名 赵军 学号 8 JAVA实习报告(2)全文共12页,当前为第1页。...另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操
讲解java反射原理,给那些迷惑于java反射的同胞给个分享!
哈尔滨理工大学管理学院信息系 ...另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强 制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得
在第3章和第4章中,透彻系统地讲解了面向对象的思想和应用,用通俗形象的语言、典型翔实的例子、鲜明的对照比较,阐述了初学者最容易迷惑的一些思想理念。在以后的章节中,作者始终以“启发编程的思想,培养编程的...
哈尔滨理工大学管理学院信息系 ...另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强 制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得
“它”更简单,java很容易学习和使用,它丢弃了C++中难理解的令人迷惑的特性。