当前位置:  技术问答>java相关

请看:下面这个程序的运行结果是什么?为什么?

    来源: 互联网  发布时间:2015-04-24

    本文导语:  class Base {   int x=3;   public Base() {}   public void show() {   System.out.print(" The value is " + x);   }   }   class Derived extends Base {   int x=2;   public Derived() {}   public void show() {   System.out.print(" ...

class Base {  
int x=3;  

public Base() {}  

public void show() {  
System.out.print(" The value is " + x);  
}  
}  

class Derived extends Base {  
int x=2;  
public Derived() {}  
public void show() {  
System.out.print(" The value is " + x);  
}  
}  

public class Test {  

public static void main(String args[]) {  
Base b = new Derived();  
b.show();  
System.out.println("The value is " +b.x);  
}  
}

|
答案是The value is 2The value is 3
至于为什么我来说说:
JAVA中所有的方法都采用后期绑定,也就是相当于C++中的虚函数动态绑定。但对于属性却不是后期绑定,而是早期绑定,所以b.show()的时候调用的是Derived类的show()方法。而b.x=3

|
在java中,当子类定义了与父类同名的属性变量时,即出现了子类变量对同名父类变量的隐藏。
所谓隐藏就是指子类拥有两个同名变量,一个继承自父类,一个由自己定义。当子类执行继承自父类的操作时,处理的是继承自父类的变量,当执行由子类本身定义的操作时,处理就是自己定义的变量,而把继承自父类的变量“隐藏”起来。
也就是说,在Derived类创建的时候,分配了两个x的空间,但是对于外部来说,它只有一个变量x。
而方法的继承则和域中变量的继承不一样:当父类中一个方法被子类覆盖时,它所占用的内存空间将被完全清空,父类的方法在子类中将不复存在。
Base类的对象b的创建是通过new一个Derived来完成的,因此b这个句柄指向的对象其实是Derived类的一个实例,在实例b中,内存空间中分配了两个同名的x,b.show()由于在Derived类里被覆盖了,调用的也是Derived类里面的show()方法,因此这个show()操作的是Derived类里面的x,所以值为2。而b.x=3是因为b的类型是Base,b.x是显式的调用Base类里继承的变量x,所以显示的是Base类所赋的值。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关注ejb培训的请看过来,开课在即,欲报名赶紧联系!
  • JBUILDER高手请看
  • 请看看(20分)
  • servlet加weblogic高手请看看
  • 怪怪问题,请看。
  • 路人甲请看这个问题。。分数随你开。。。。
  • 求助!请看一下。
  • 请看一下!
  • 请看,这是什么意思?
  • c/c++ iis7站长之家
  • 提供一个jcreator pro 2.5下载的地方,需要的请看!(含注册码)
  • 请看看这个ftp有什么问题
  • 字符串能以流的方式保存到文件中吗?请看这个问题
  • 如何比较时间大小,,请看!!
  • 能者请看!多多益善!
  • 高手请看过来,我有些问题,我是新手.关于线程的!
  • 高手请看
  • 请看我这个String[]的错误
  • 安装QMAIL出错,请看看
  • 请看!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3