代码如下:
class Base{
private int a;
void amethod(){
System.out.println(a);
}
}public class Sub extends Base{
void amethod(){
//this.a=1;
super.amethod();
}
public static void main(String[] args){
Base sub = new Sub();
sub.amethod();
}
}
在这里运行的时候输出0,我有点不解,实例化的是Sub类,Base类的a成员变量的私有类型的,Sub类在初始化的时候,会先初始化Base类,但是a不是静态变量,是不是应该在内存中还没有这个变量啊,怎么在Sub的amethod方法中调用父类方法访问父类未赋值的私有变量还能成功呐?这个值还是int类型的默认值。。
我理解的应该是运行时会出错才是。郁闷了,,个中缘由,搞不清楚哦

解决方案 »

  1.   

    Base sub = new Sub();
    Base sub,所以它会调Base的方法...
    前两天上课老师是这么说的...
      

  2.   

    super.amethod();
    这里指明了调用父类的方法
      

  3.   

    可能我没说清楚,意思是不管你是
    Sub ss=new Sub();还是Base sub = new Sub();
    结果都会因为在方法中的super.amethod()调用父类的方法,明白?
      

  4.   

    Sub类在初始化的时候,会先初始化Base类,但是a不是静态变量,是不是应该在内存中还没有这个变量啊,怎么在Sub的amethod方法中调用父类方法访问父类未赋值的私有变量还能成功呐?
    -------------------------------------------
    还有你说的成员变量a,如果你在声明的时候没有给类的成员变量a赋值,类在初始化的时候会自动给它一个值.
      

  5.   

    不管调不调用..Java都对任何已经定义但没有赋值的基本变量赋默认值
    int型是0
    boolean型是false
      

  6.   


    可能我没说清楚,意思是不管你是
    Sub ss=new Sub();还是Base sub = new Sub();
    结果都会因为在方法中的super.amethod()调用父类的方法,明白?
      

  7.   

    初始化的时候会给  a  一个默认值啊..  
    不是说a不是静态变量,就不对其初始化了...只是在内存中存放的区域不一样  
    但只要初始化.就会赋给其一个默认值初始值  
    ------------
    我是在书上看到类初始化时会给静态变量分配地址,赋默认值,,a是实例变量,,在没有创建Base类的实例对象前a也会分配内存和初值啊,,具体的情况能不能再说得详细一点啊
      

  8.   

    你可以这样理解:
    类的成员变量,如果没有明确赋值,都有默认值,int的默认值是0.
      

  9.   

    你可以这样理解:
    类的成员变量,如果没有明确赋值,都有默认值,int的默认值是0.
    ---------------------------
    应该是的
      

  10.   

    我是在书上看到类初始化时会给静态变量分配地址,赋默认值,,a是实例变量,,在没有创建Base类的实例对象前a也会分配内存和初值啊,,具体的情况能不能再说得详细一点啊
    =======================================
    其一:先要弄清楚类的生命周期,初始化时,初始化一个子类,可以是看做对它父类的主动使用,所以会先初始化父类,这也解释了为什么无论你声明sub 是Base类还是Sub类,a都被初始化了..其二:静态变量在JAVA虚拟机加载类的过程中被分配内存地址,位于内存的方法区,被类的所有实例共享,它的生命周期是和类的周期相同的;实例变量在JAVA虚拟机初始化的时候不分配内存,但是一旦创建了一个类的实例,就会为实例变量分配一次内存,位于堆区中,它的生命周期和实例周期相同.这也是我开始说你已经 Base sub= new Sub(); 创建了新类,同时也要初始化实例变量.不知道 这样解释还满意不
      

  11.   

    实例变量在JAVA虚拟机初始化的时候不分配内存,但是一旦创建了一个类的实例,就会为实例变量分配一次内存,位于堆区中,它的生命周期和实例周期相同.这也是我开始说你已经 Base sub= new Sub(); 创建了新类,同时也要初始化实例变量
    ---------
    new Sub()创建的是Sub的一个实例,也是Base的实例,Sub中没有定义实例变量a,Base中a是私有的,Sub中不能继承是不是只能这样解释:--类的成员变量,如果没有明确赋值,都有默认值--
      

  12.   

    是不是只能这样解释:--类的成员变量,如果没有明确赋值,都有默认值--
    ===================================================================
    对的,只要是基本数据类型,都会有默认值;
    如果是类类型的变量,则是不会有默认值的;
    要分清楚:int i相当于int i=0;
    而Integer i则不一样,i在内存中并不会有值,为null!!!解释的够明白不?呵呵~