package com.bag;class Super
{
int i = 10; Super()
{
print();
i = 20;
} void print()
{
System.out.println(i);
}
}public class Sub extends Super
{
int j=30;
Sub()
{
print();
j=40;
}
void print()
{
System.out.println( j);
}
public static void main(String[] args)
{
System.out.println(new Sub().j);
}
}结果是 0
30
40为什么不是 10
30
40
{
int i = 10; Super()
{
print();
i = 20;
} void print()
{
System.out.println(i);
}
}public class Sub extends Super
{
int j=30;
Sub()
{
print();
j=40;
}
void print()
{
System.out.println( j);
}
public static void main(String[] args)
{
System.out.println(new Sub().j);
}
}结果是 0
30
40为什么不是 10
30
40
解决方案 »
- 求一个常用写法(REGEX)
- java初学者问题(Could not find the main class)
- 请问怎样开发自己的jar包,就像rt.jar那样,也可以 import java.math.*;
- 关于接口与继承
- ***谈谈对java调用dll的认识,希望得到高手的指点***
- 有一个参数传过来,StringBuffer传,由数据与字母组成,每个参数中间以/0相间隔,参数不固定,用哪种方法可以取出参数一个StringBuffer由
- 如何利用servlet进行文件的上传!谢!
- String数组里的数字怎么转换为int?在线等,马上结贴!
- CVS和VSS哪个好用?或哪个用的比较多
- 我想学java,但是用什么开发平台好呢
- 求助帖,关于线程,socket,sigar
- 求救,一道图像还原题纠结我N久了。。。
也要了解到一个对象实例化的步骤,基本可以分为五个步骤。
在执行new Sub();这句话的时候,先调用父类的构造方法Super();父类构造方法中调用的print()方法是子类Sub中的方法,此时还没有调用子类中的构造方法给j显性初始化赋值,所以j在栈内存中存放的还是int型的默认值0,所以此时输出0;
接着调用子类Sub中的构造方法Sub();调用的同时为j显性初始化赋过值了,所以print();方法中j=30;
最后,在Sub的构造方法中为j改变赋值,所以此时new Sub().j=40.
1. 虚拟机试图访问Sub.main这个静态方法
2. 当一个类第一次被访问的时候,才会被加载,如果有静态变量或称为类变量,那么在此
加载时会被初始化
3. 加载Sub类的时候,虚拟机注意到它有一个基类Super,那么Super类也会被加载
4. 当new Sub()的时候,第一件事儿就是在内存中划出一块足够存储Sub对象的空间,
这块空间会被清零,也就是说Sub对象的所有实例变量都会得到一个默认值,对于
这里的i,j就是0,如果是引用类型就是null
5. 执行Sub构造器,Sub有父类,所以执行Sub构造器的第一步就是执行父类的构造器,
构造器的执行过程是最让人迷惑的地方,下面试着做一下解释: 首先要明确构造器的作用,构造器的作用就是初始化对象,而不是创建对象。
其次要明确,执行构造器时第一要做的就是初始化对象,然后才是运行构造器中的语句。
什么叫初始化对象呢?就是按照语义从上到下依次执行一下你声明的字段。哥们就说这么多,你要再不明白,没招儿啦!
而 方法 super里的i 却是局部变量
所以~~~~~
楼主明白了么???
{
Super()
{
int i = 10;
print();
i = 20;
}void print()
{
System.out.println(i);
}
}