经典题目 java类的加载顺序及理解何为java向前引用
来源:互联网 发布:网络教育统考时间报名 编辑:程序博客网 时间:2024/06/04 00:25
public
class
StaticTest {
public
static
int
k =
0
;
public
static
StaticTest t1 =
new
StaticTest(
"t1"
);
public
static
StaticTest t2 =
new
StaticTest(
"t2"
);
public
static
int
i = print(
"i"
);
public
static
int
n =
99
;
public
int
j = print(
"j"
);
{
print(
"构造快"
);
}
{
print(
"静态块"
);
}
public
StaticTest(String str) {
System.out.println((++k) +
":"
+ str +
" i="
+ i +
" n="
+ n);
++n;
++i;
}
public
static
int
print(String str) {
System.out.println((++k) +
":"
+ str +
" i="
+ i +
" n="
+ n);
++i;
return
++n;
}
public
static
void
main(String[] args) {
StaticTest t =
new
StaticTest(
"init"
);
}
}
1:j i=0 n=0
2:构造快 i=1 n=1
3:静态块 i=2 n=2
4:t1 i=3 n=3
5:j i=4 n=4
6:构造快 i=5 n=5
7:静态块 i=6 n=6
8:t2 i=7 n=7
9:i i=8 n=8
10:j i=9 n=99
11:构造快 i=10 n=100
12:静态块 i=11 n=101
13:init i=12 n=102
理解:
首先加载的顺序为:
先父类的static成员变量-》子类的static成员变量-》父类的成员变量-》父类构造-》子类成员变量-》子类构造
也就是说最先被加载的是所有static申明的成员变量,之所以被申明为静态,特点就是共享,即使实例化多个对象,但是是共用一个static声明的变量的。
也就是说,首先所有的static被载入,但是还未执行,下一步开始执行,自上而下,首先执行完第一行之后执行public static StaticTest t1 = new StaticTest("t1");
实例化这个对象的时候,由于静态的已经被载入,所以就直接执行
public int j = print("j"); 这一句,然后执行
{ print("构造快"); } { print("静态块"); }
最后执行构造函数,
然后实例化t2,
最后实例化对象。
做几个例子测试出该效果,推出什么原理大家自己理解吧。
第一个,public static StaticTest t1 = new StaticTest("t1");改为
public StaticTest t1 = new StaticTest("t1");
结果:加载出错
第二个,把public int j = print("j");也改为静态的。
类加载顺序:
* 1.加载类的静态属性(非静态不管)
* 这里加载的是:public static int k = 0;
* 然后加载:public static StaticTest t1 = new StaticTest("t1");
* 因为此处进行了类的实例化所以
* 1.1加载类的非静态属性
* 这里是:public int j = print("j");
* 运行完这个方法接着
* 1.2顺序加载类中的非static代码块(static暂时不加载)
* 这里是:print("构造快");和print("静态块");
* 运行完接着
* 1.3加载类的构造方法
* 这里是:public StaticTest(String str)
* 运行完(一个静态属性的实例就完成了)
* 2.继续加载类的静态属性
* 这里加载的是:public static StaticTest t2 = new StaticTest("t2");
* 2.1重复(1.1-1.3)
* 3.继续加载类的静态属性
* 这里加载的是:public static int i = print("i");
* 运行完接着
* 4.继续加载类的静态属性
* 这里加载的是:public static int n = 99;
* 不管你n原来是多少现在为99
* 接着
* 5.(如果有static代码块,在这里先加载,这个里面没有所以加载主函数)加载主函数
* 这里加载的是:StaticTest t = new StaticTest("init");
* 因为此处进行了类的实例化所以
* 5.1
* 重复1.1-1.3
* 5.2
* 因为public static int print(String str)这个方法返回++n
* 所以n从99开始累加
* 运行完OK了
疑问:
static被载入时,int值应该为空吧.
运行到创建t1的实例时,还没有运行static i的初始化代码吧?
为什么创建t1实例的时候,可以直接做i++?
还有一个知识点就是关于向前引用的问题,像结果中n开始为什么会0,后面有变为99。这个可以参考一下:
class
MyClass
{
void
method()
{
System.out.println(myvar);
}
String myvar =
"var value"
;
}
class
MyClass {
int
method() {
return
n; }
int
m = method();
int
n =
1
;
}
System.out.println(
new
MyClass().method());
System.out.println(
new
MyClass().m);
class
MyClass {
int
method() {
return
n; }
int
n =
1
;
int
m = method();
}
System.out.println(
new
MyClass().m);
MyClass myClass =
new
MyClass();
System.out.println(myClass.n);
// 输出1
System.out.println(myClass.m);
// 仍然输出0
class
MyClass {
static
int
method() {
return
n; }
static
int
m = method();
// 直接访问m,仍然会输出0
static
int
n =
1
;
}
- 经典题目 java类的加载顺序及理解何为java向前引用
- 何为Java引用
- 何为Java引用
- java向前引用
- Java中的向前引用
- java向前引用
- Java中的向前引用
- java向前引用
- java 中的向前引用
- Java类的加载及初始化顺序
- Java向前引用容易出错的地方
- Java向前引用容易出错的地方
- Java向前引用容易出错的地方
- Java向前引用容易出错的地方
- Java向前引用容易出错的地方
- java 类加载器加载顺序 经典例子
- Java的继承及继承中类的加载顺序
- Java的继承及继承中类的加载顺序
- macOS安装vmware ubuntu不能共享剪贴板和共享文件夹解决
- 洛谷 P1641 [SCOI2010]生成字符串(拓展欧几里得或者)
- mac下启动adb并安装apk
- Privacy Policy
- yum 配置和yum源网站
- 经典题目 java类的加载顺序及理解何为java向前引用
- 百度地图API基础操作--百度鹰眼篇
- 【CSS】CSS消除浏览器的默认样式
- 【设计模式】策略模式
- Java语言设计模式之桥接(Bridge)模式
- js while 延迟
- 图像处理 图像平滑、滤波、卷积
- Java中Lambda表达式的使用
- 三维树状数组(区间更新,单点查询)POJ