我贴出一段代码
public class Target extends Depend {
int i = 30 ; public Target() {
print();
i = 40 ;
}
void print() {
System.out.println( " Target=> " + i);
}
public static void main(String[] args) {
System.out.println(new Target().i); }
}
class Depend {
int i = 10 ;
public Depend() {
print();
i = 20 ;
}
void print() { System.out.println( " Depend=> " + i);
}
} 运行结果是:
Target=> 0
Target=> 30
40
大家讨论 为什么会这样
public class Target extends Depend {
int i = 30 ; public Target() {
print();
i = 40 ;
}
void print() {
System.out.println( " Target=> " + i);
}
public static void main(String[] args) {
System.out.println(new Target().i); }
}
class Depend {
int i = 10 ;
public Depend() {
print();
i = 20 ;
}
void print() { System.out.println( " Depend=> " + i);
}
} 运行结果是:
Target=> 0
Target=> 30
40
大家讨论 为什么会这样
解决方案 »
- 菜鸟求助,马士兵贪吃蛇代码问题
- 怎么更改自己的IP
- XML中的非法字符如何能被解析?
- webservice接口返回类型为集合的问题,请高手赐教!!!!!!!!!
- 关于java执行本地程序的问题
- 熟悉swt的请进,如何使Ststem.out.println(...)这样的内容在swt中显示?
- float有很大的问题!
- 怎样用WriteObject向文件中写入一些对象,然后,再用ReadObject读出来?
- 求Jbuilder 5 Enterprise注册机或注册码!
- 一个小问题,有结果立刻60分送上。。。。。。。。。。。。
- 请问大家用JAVA做C/S端的一个档案管理软件的可行性
- JButton的标题内容的小问题!谢谢各位朋友!10
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
public class Target extends Depend {
int i = 30 ;
public Target() {
//super();---------首先调用父类的构造方法
print();
i = 40 ;
}
void print() {
System.out.println( " Target=> " + i);
}
public static void main(String[] args) {
System.out.println(new Target().i);
}
}
class Depend {
int i = 10 ;
public Depend() {
print();
i = 20 ;
}
void print() {
System.out.println( " Depend=> " + i);
}
}
这个挺头晕.
算是自动初始化的值?
刚开辟过空间,自动初始化为0?
那个达人可以帮忙解释一下?
子类方法覆盖父的方法,
在构造方法里面最好只做初始化的工作
不要调用方法
java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员加入讨论。QQ群:3001581(人员有限,不接收初学者,谅解)
3. 子类与父类中同名的成员变量,是两个独立的变量。在父类中为成员变量赋值,不会影响子类中的同名变量。也就是说,成员变量没有 override。有点疑义.在下认为理解为:i指定的是target中的i而非depend中的i.target的print()换成如下.看结果可知.
System.out.println( " Target=> " + i);System.out.println( " Target super=> " + super.i);
看看?对子而言,有this与super之分.对外而言,无this与super之分.i依然被重载.
如果我把int i = 30 ;这句注释掉 也就是没有成员变量的重载
这时所有用到的都是父类Depend的成员变量i
这时结果是:
Target=> 10
Target=> 20
40
按照10楼和11楼的说法就解释不通了。
类实例化的时候是先初始化成员变量再调用构造方法。
越来越糊涂了。
哪位大虾 给正解
Depend d = (Depend)t;
System.out.println("t: " + t.i);
System.out.println("d: " + d.i);
实际上是 int i= 30 ,这个赋值,与构造函数的问题。
大致是这样的子类构造函数 如果没有显示调用父类的构造方法,会缺省的去掉用父类的不带参数的构造函数
Target()所以会调用Depend(),由于Depend()他有调用Print(),print被重新写过了
所以会调用子类的Print,此时子类的i并没有赋值,而是初始值0,父类调用完print后,返回到子类构造函数,子类继续调用Print,Print发现i没有初始化(注意这是类初始化后发现的),因此,调用赋值i=30,然后就打印出30,并且i=40 了,这应该就是
Target=> 0
Target=> 30至于最后的40 ,我没有明白。
还有继承类本来就是保存一个父类的索引而言。,重写方法,也只是类似于C++的虚函数。
如果我把int i = 30 ;这句注释掉 也就是没有成员变量的重载
这时所有用到的都是父类Depend的成员变量i
这时结果是:
Target=> 10
Target=> 20
40
按照10楼和11楼的说法就解释不通了。
类实例化的时候是先初始化成员变量再调用构造方法。
越来越糊涂了。
哪位大虾 给正解这个疑问很简单,int i = 30 ;这句注释掉也就是说Target中没有i这个变量,也就不可能初始化值,语句System.out.println( " Target=> " + i);只能上父类找这个i值,这是父类的i值是10,所以输出Target=> 10,因此10楼和11楼的说法是对的。
2. 调用对象的构造函数 (但是还没有执行构造方法体)
3. 调用父类的构造函数,如果父类的构造函数调用了其他函数,则
须注意,如果该函数被子类重载,那么实际调用的是子类的相应函数,如果该函数没有重载,那么父类调用该函数。如果该函数使用了成语变量,那么需要先检查成员变量是否要赋值 ,(调用赋值 如i=30)
4. 使用初始化程序和初始块初始化成员(调用赋值 如i=30)
5. 执行构造方法体问题是第3步与第4步发生的。
1.在对象的构造函数执行之前会先执行其父类的初始化.
2.如果父类还有父类的话依次递归
3.始化的过程是首先定义变量,如果没有初始化变量就赋一个默认值.
上述问题是这样的当你在父的构造函数里调用的print其实是重载后的.是子类的方法.但这个时候i并没有定义(这个可以确定,不信自己可以有debug跟一下).不知道java为什么会输出0,也许是java的bug .当在子类的构造函数中调用print方法时,此时i 已定义.
建议:构造函数只是初始化工作.不要在里面执行方法(用于初始化的方法除外),这是写程序的大忌.
这句就是输出i的值的吧,所以会输出40。其他的print()方法输出的。