class Base{
 int x = 1;
 static int y=2;
 int z=3;
 int method(){
  return x;
 }
}class Subclass extends Base{
 int x = 4;
 int y=5;
 static int z=6;
 int method(){
  return x;
 }
}public class Test{
 public static void main(String[] args){
  Base b = new Subclass();
  System.out.println(b.x + " " + b.y +" "+ b.z);
 }
}问前先声明一下:估计又要被BS了,如果BS我也可以,但希望大家BS完以后可以留下我要问的问题的回复可以吗?谢谢了
请不要灌水问1:子类继承父类所有的成员变量和方法(那么,子类方法被继承且可以重写,而成员变量如果是被继承的话,上面的例子,子类的int x=4也是什么意思???没有成员变量也被重写这一说法吧!!!或许这样理解不知道对不对,本来是已经继承了,只不过这里子类又重新定义了一个值给X,但并不是重写)问2:Base b = new Subclass();这个b已经指向子类对象了,只不过是父类类型的的,但它的实例确实是子类的,为什么b.x是父类里的1呢,虽然这里是b,但它不是指向子类的实例吗???为什么不是4呢经查GOOGLE,BAIDU得知,这些变量是在编译的时候决定的,
但,即使是编译的时候就决定了,但它们应该是每个对象自己里的变量啊.回到那句话,b不是指向子类的对象吗?

解决方案 »

  1.   

    1. 子类中的int x = 4;属于“屏蔽(hiding)”,不是重写。2. 只有方法才可能构成多态。属性永远是静态绑定,不会构成多态。
    无论何时,int x = 1永远都会绑定到Base类型的对象,而int x = 4永远都会绑定到Subclass类型的对象,这是编译时就决定了的。
    Base b = new Subclass();告诉编译器:b是一个Base类型的对象。虽然它实际上到底是什么类型要到运行时才确定,但这时编译器已经完成了绑定了,所以,绑定给b的x永远是1,而不可能是4。
      

  2.   

    编译是就绑定了.那也要运行才可以看到输出结果啊.所以这个Base b = new Subclass();b不还是子灰的实例吗
      

  3.   

    想取子类的,得这样:((Subclass)b).x
      

  4.   

    多态性只发生于方法,而不发生于域.并且,对于方法,只有那些非static与非final方法才具有多态性.
    b.x + " " + b.y +" "+ b.z 都是域,没有多态行为,所以程序的执行结果自然是Base中对应的值。
      

  5.   

    在网上看到一句这样的话,估计很好理解.父类的引用指向子类时,当用到方法时,调用的是子类的对象.当用到属性时,用到的是父类对象.
    如果把主函数变为:
    public class Test{ 
     public static void main(String[] args){ 
      Base b = new Subclass(); 
      System.out.println(b.x + " " + b.y +" "+ b.z); 
      System.out.println(b.method());     //新加上的, 打印出的是 4
     } 

      

  6.   

    你没搞清楚作用域
    默认的作用域是private
    class Base{ 
     int x = 1; 
     static int y=2; 
     int z=3; 
     int method(){ 
      return x; 
     } 

    实际上是
    class Base{ 
     private int x = 1; 
     private  static int y=2; 
     private  int z=3; 
     private int method(){ 
      return x; 
     } 
    } 如果要做共享的话,把属性声明为protected
      

  7.   

    楼上的,是你没搞清楚吧!那不叫作用域,叫访问级别。默认的访问级别是default,不是private,也就是同一包内都可访问。楼主的代码中两个类在同一包中,不存在访问上的问题。
      

  8.   

    回4楼Base b = new Subclass();//能过b.getClass()得知,此时的b是  SubClass类型的对象
    那么b.x不应该输出子类的4吗
      

  9.   


     Base b = new Subclass(); 
    你都new 子类了,父类的这个Base b变量此时不是指向了子类了吗?????? Base b = new Base (); 
    b.x;
    =============分开====================
     Base b = new Subclass(); 
    b.x都是1,就没什么区别????????????