初学者关于继承的一个小问题
代码如下:
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类型的默认值。。
我理解的应该是运行时会出错才是。郁闷了,,个中缘由,搞不清楚哦
------解决方案--------------------不管调不调用..Java都对任何已经定义但没有赋值的基本变量赋默认值
int型是0
boolean型是false
------解决方案--------------------你可以这样理解:
类的成员变量,如果没有明确赋值,都有默认值,int的默认值是0.
------解决方案--------------------我是在书上看到类初始化时会给静态变量分配地址,赋默认值,,a是实例变量,,在没有创建Base类的实例对象前a也会分配内存和初值啊,,具体的情况能不能再说得详细一点啊
=======================================
其一:先要弄清楚类的生命周期,初始化时,初始化一个子类,可以是看做对它父类的主动使用,所以会先初始化父类,这也解释了为什么无论你声明sub 是Base类还是Sub类,a都被初始化了..
其二:静态变量在JAVA虚拟机加载类的过程中被分配内存地址,位于内存的方法区,被类的所有实例共享,它的生命周期是和类的周期相同的;实例变量在JAVA虚拟机初始化的时候不分配内存,但是一旦创建了一个类的实例,就会为实例变量分配一次内存,位于堆区中,它的生命周期和实例周期相同.这也是我开始说你已经 Base sub= new Sub(); 创建了新类,同时也要初始化实例变量.
不知道 这样解释还满意不
------解决方案--------------------是不是只能这样解释:--类的成员变量,如果没有明确赋值,都有默认值--
===================================================================
对的,只要是基本数据类型,都会有默认值;
如果是类类型的变量,则是不会有默认值的;
要分清楚:int i相当于int i=0;
而Integer i则不一样,i在内存中并不会有值,为null!!!
解释的够明白不?呵呵~