`
smiky
  • 浏览: 254176 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

让我迷惑的结果(悲惧的JAVA基础啊)

阅读更多

 

为什么子类对象调用父类对象的方法,改变的居然是被子类隐藏掉的变量?
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编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java程序员阅读...

    java解惑(罗列了95个容易让你迷惑的java知识点)

    罗列了95个容易让你迷惑的java知识点。

    java基础补足和thinking In Java学习.rar

    此书的特点在于里面有很多作者对Java语言的独有的理解与讲解,这些内容往往也是所有Java语言初学者迷惑的地方。称之为超简明入门书籍也不为过。 《Java核心技术:卷1基础知识》 这系列书籍,非常适合有一定...

    java学习手册

    4,java 进阶模块,在java基础内容上进一步详细介绍了多线程,集合框架,以及JVM内存管理,并收录java中容易使人迷惑的谜题内容。 5,数据库模块,完整详尽的介绍了数据库的创建、增删改、检索、常用函数、索引与...

    Java游戏源码,蚂蚁迷惑,Android游戏源码

    Java游戏源码、蚂蚁迷惑、Android游戏源码是当前在线编程和游戏开发领域的热门话题。Java游戏源码可以帮助程序员了解游戏开发的基本原理和技巧,增强他们的编程能力。蚂蚁迷惑是一款益智休闲游戏,玩家需要在有限...

    java基础经典总结1

    自己总结的java容易迷惑的地方~ 写得不好请多指教 QQ:273804595

    Java91个迷惑的问题

    JavaJava谜题谜题-表达式谜题表达式谜题 JavaJava谜题谜题 -表达式谜题表达式谜题

    介绍Java学习的一些主线思路

    J2SE就是Java2的标准版,主要用于桌面应用软件的编程;...不要被IDE纠缠,在学习java和j2ee过程中,你会遇到五花八门的IDE,不要被他们迷惑,学 JAVA的时候,要学语言本身的东西,不要太在意IDE的附加功能。

    基于Java多线程隐藏数组下标变换表达式的代码迷惑算法.pdf

    基于Java多线程隐藏数组下标变换表达式的代码迷惑算法.pdf

    Java就业培训教程 mobi epub

    在第3章和第4章中,透彻系统地讲解了面向对象的思想和应用,用通俗形象的语言、典型翔实的例子、鲜明的对照比较,阐述了初学者最容易迷惑的一些思想理念。在以后的章节中,作者始终以“启发编程思想,培养编程感觉”...

    Java解惑(中文).pdf

    Java解惑(中文).pdf 给大家介绍java中容易迷惑用错的实例

    java环境变量的配置

    对于初学java 的人,往往对java的环境变量配置比较迷惑,此小软件能有效地帮助初学者配置java环境变量。

    JAVA实习报告(2).docx

    JAVA实习报告(2) 哈尔滨理工大学管理学院信息系 实习报告 班级 信息13-4 姓名 赵军 学号 8 JAVA实习报告(2)全文共12页,当前为第1页。...另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操

    java反射的原理机制

    讲解java反射原理,给那些迷惑于java反射的同胞给个分享!

    Java实习报告资料.doc

    哈尔滨理工大学管理学院信息系 ...另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强 制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得

    张孝祥 Java就业培训教程高清晰版

    在第3章和第4章中,透彻系统地讲解了面向对象的思想和应用,用通俗形象的语言、典型翔实的例子、鲜明的对照比较,阐述了初学者最容易迷惑的一些思想理念。在以后的章节中,作者始终以“启发编程的思想,培养编程的...

    Java实习报告(1).doc

    哈尔滨理工大学管理学院信息系 ...另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强 制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得

    学java的心得体会

    “它”更简单,java很容易学习和使用,它丢弃了C++中难理解的令人迷惑的特性。

Global site tag (gtag.js) - Google Analytics