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