`
smiky
  • 浏览: 257728 次
  • 性别: 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解惑(罗列了95个容易让你迷惑的java知识点)

    以下就是针对标题"java解惑(罗列了95个容易让你迷惑的java知识点)"中提及的一些关键知识点的详细解释。 1. **Java内存模型**:Java内存模型(JMM)规定了线程如何共享和访问数据,包括主内存、工作内存以及内存间的...

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

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

    Java91个迷惑的问题

    在Java编程语言中,"Java91个迷惑的问题"涵盖了各种各样的技术难点和常见陷阱,这些谜题和表达式谜题旨在帮助开发者深化对Java的理解。以下是一些可能涉及的知识点,它们可能会出现在"java解惑.pdf"文档中: 1. **...

    java学习手册

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

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

    "基于Java多线程隐藏数组下标变换表达式的代码迷惑算法" 本文介绍了一种基于Java多线程的代码迷惑算法,该算法可以隐藏数组下标变换表达式,以防止源代码静态分析和基于源代码植入反迷惑攻击。该算法的核心思想是...

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

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

    java redis服务器java版redis 服务.zip

    Redis涉及技术1、NettyEF-Redis开发框架Java+NettyEF-Redis入门知识1,Java基础b站搜索“韩顺平java”2,Netty基础b站搜索“韩顺平netty”3,redis tcp协议RESP协议中文文档REDIS 命令大全ef-redis 源码解析

    Practical Java(含源码)

    这本书的目的是为了解答那些经常出现但又容易让人迷惑的问题,从而提升Java程序员的技能水平和解决问题的能力。 首先,Java作为一门面向对象的编程语言,其核心概念包括类、对象、接口和继承。书中可能深入探讨了...

    Java谜题,java中的有趣的解谜

    Java谜题是对编程语言中一些不常见或者容易让人迷惑的特性的探讨,这些特性往往隐藏在日常编程的细节之中。Java作为一个广泛应用的面向对象编程语言,它的谜题往往涉及到类与对象、多线程、异常处理、内存管理等多个...

    天津大学JAVA期末考试题型解读与复习建议参考 共6页.pdf

    Java作为一门广泛使用的编程语言,其期末考试往往注重考察学生的基础知识和理解能力。天津大学的JAVA期末考试题型主要包含选择题、填空题、判断题以及程序分析题,尤其强调对基本概念和语法的掌握。根据描述,2010年...

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

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

    java 参数传递

    Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论...Java 参数传递机制详解,揭开了 Java 中的参数传递机制的奥秘,详细分析了基本类型和对象作为参数传递的机制,并揭开了对象作为参数传递的迷惑。

    JavaSetup8u101.zip 编程工具

    另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必...

    Java就业培训教程 mobi epub

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

    Java puzzlers(java 解惑)附源码

    这本书专门探讨了Java编程语言中容易让人迷惑的陷阱和常见误解,通过一系列精心设计的“puzzlers”(谜题)来揭示这些陷阱,并提供了深入的解析,帮助读者提高代码质量,避免潜在的错误。书中涵盖的知识点广泛,涉及...

    Java智能卡的安全漏洞分析与防御.pdf

    本文将详细分析Java智能卡的安全漏洞,并给出实际的病毒代码,深入分析并找到漏洞存在的根本原因,在研究学习前人的基础之上,并结合实际给出对应的防御措施。 首先,Java智能卡的安全威胁来自物理攻击和逻辑攻击两...

    java环境变量的配置

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

    Java解惑(中文版)

    1. **Java语言基础**:书中可能涵盖了Java的基本语法、数据类型、控制流、类和对象等基础知识,帮助读者巩固和加深理解。 2. **异常处理**:Java的异常处理机制是许多初学者易犯错误的地方,书中可能会有相关的谜题...

Global site tag (gtag.js) - Google Analytics