abstract class A{
int i=4;
public abstract void print();
A3(){
int i=3;
print();
}
}
class B extends A{
private int i=2;
public void print(){
System.out.println("i= "+i);
}在上面的的三个位置定义的i,最后打印出来i的值都是0。
我已经在B里面定义了i=2,A3()但是调用B中的print()时,B还没初始化,那这个i是哪里的?如果是B里面定义的那个i,已经在定义的赋值2了的,为什么不是等于2?或者这样说,类成员在定义的时候(比如int i)不管有没有赋初值,就已经给了内存空间??求解啊!!新手被卡这里了!!!!
int i=4;
public abstract void print();
A3(){
int i=3;
print();
}
}
class B extends A{
private int i=2;
public void print(){
System.out.println("i= "+i);
}在上面的的三个位置定义的i,最后打印出来i的值都是0。
我已经在B里面定义了i=2,A3()但是调用B中的print()时,B还没初始化,那这个i是哪里的?如果是B里面定义的那个i,已经在定义的赋值2了的,为什么不是等于2?或者这样说,类成员在定义的时候(比如int i)不管有没有赋初值,就已经给了内存空间??求解啊!!新手被卡这里了!!!!
解决方案 »
- swt中,怎么添加TreeItem的监听事件。
- 一个关于抽象工厂的问题
- Hi eveyone, 我有一个如何比较两个大VO对象是否相等的问题,请大家帮忙,谢谢
- javadoc里面的斜体字代表什么
- 求《Java Swing 2nd》
- 一个不用odbc 联sqlserver 2k的小问题,解决马上给分
- 我用JB将application打包成.JAR运行有问题,把.jar解开后,用DOS窗口运行java -classpath ...没有问题,这是怎么回事?
- 给定2个时间,如何计算他们之间的天数?
- 初级错误大家找,解决了就给分!
- java开发用什么最好?
- 工厂方法模式-连续剧第一集
- java内存问题,欢迎高手进来探讨
public static void main(String[] args){
B3 r=new B3();
还有几个问题
父类成员函数可以被子类重写,也就是说在子类对象中如果不加super,调用的方法是被子类重写了的,哪怕这个方法被父类的构造函数或者其他没有被重写的方法调用父类成员变量是不会被重写的,如果从原父类一个函数中直接调用这个变量会是父类的变量,如果子类中方法直接调用则是子类中的变量,你这里,虽然print是在父类中构造函数调用的,但是print实现在子类,所以相应的i是子类中的你父类构造函数中生命的i没有任何作用,这只是构造函数的局部变量,声明周期仅在此函数中,如果你是想赋值父类的i应该去掉int,这样只是赋值父类的成员变量i
如果你在子类的构造函数中调用print你就会发现i被初始化成2了