当前位置: 技术问答>java相关
求助关于静态数据初始化问题,很简单的,快进来看看。
来源: 互联网 发布时间:2015-02-03
本文导语: 程序代码如下: class Bowl(){ Bowl(int marker){ System.out.println("Bowl("+marker +")"); } void f(int marker){ System.out.println("f("+marker+")"); } class Table{ static Bowl b1=new Bowl(1); Table(){ System.out.println(...
程序代码如下:
class Bowl(){
Bowl(int marker){
System.out.println("Bowl("+marker +")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
class Table{
static Bowl b1=new Bowl(1);
Table(){
System.out.println("table()");
b2.f(1);
}
void f2(int marker){
System.out.println("f2("+marker+")");
}
static Bowl b2=new Bowl(2);
}
class cupboard{
Bowl b3=new Bowl(3);
static Bowl b4=new Bowl(4);
cupboard(){
System.out.println("cupboard()")}
b4.f(2);
}
void f3(int marker){
System.out.println("f3("+marker+")");
}
static Bowl b5=new Bowl(5);
}
public class static Initialization{
public static void main(String[] args){
System.out.println("creating new cupboard() in main");
new cpboard();
System.out.println("creating new cupboard() in main");
new cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2=new Table();
static cupboard te=new cupboard();
}
输出结果如下:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
.....
我不再写了,
问题是:1.程序应从void main开始运行的,为什么不先输出
creating new cupboard() in main
而输出为Bowl(1)?
2.Bowl类的对象b1是在类table中创建的,而类bowl在这之前创建的,什么时候调用到class Bowl?这几个类的
运行顺序是怎样的?
class Bowl(){
Bowl(int marker){
System.out.println("Bowl("+marker +")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
class Table{
static Bowl b1=new Bowl(1);
Table(){
System.out.println("table()");
b2.f(1);
}
void f2(int marker){
System.out.println("f2("+marker+")");
}
static Bowl b2=new Bowl(2);
}
class cupboard{
Bowl b3=new Bowl(3);
static Bowl b4=new Bowl(4);
cupboard(){
System.out.println("cupboard()")}
b4.f(2);
}
void f3(int marker){
System.out.println("f3("+marker+")");
}
static Bowl b5=new Bowl(5);
}
public class static Initialization{
public static void main(String[] args){
System.out.println("creating new cupboard() in main");
new cpboard();
System.out.println("creating new cupboard() in main");
new cupboard();
t2.f2(1);
t3.f3(1);
}
static Table t2=new Table();
static cupboard te=new cupboard();
}
输出结果如下:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
.....
我不再写了,
问题是:1.程序应从void main开始运行的,为什么不先输出
creating new cupboard() in main
而输出为Bowl(1)?
2.Bowl类的对象b1是在类table中创建的,而类bowl在这之前创建的,什么时候调用到class Bowl?这几个类的
运行顺序是怎样的?
|
先 运行 Initialization static Table t2=new Table();
////////////运行Table() 先运行 static Bowl b1=new Bowl(1); //print Bowl(1)
/////////// static Bowl b2=new Bowl(2); // Bowl(2)
////////// Table()--->System.out.println("table()");
///////// Table()--->b2.f(1);
运行 Initialization static cupboard te=new cupboard();
/////////////运行cupboard() 先运行 static Bowl b4=new Bowl(4);//Bowl(4)
///////////// / 运行 static Bowl b5=new Bowl(5);//Bowl(5)
////////////// 初始化cupboard ----〉 Bowl b3=new Bowl(3);
cupboard()----〉System.out.println("cupboard()")// cupboard()
----〉 b4.f(2);//f(2)
然后开始运行public static void main(String[] args){
剩下的你就应该明白如何运行的了
写了这么多,累死我了
////////////运行Table() 先运行 static Bowl b1=new Bowl(1); //print Bowl(1)
/////////// static Bowl b2=new Bowl(2); // Bowl(2)
////////// Table()--->System.out.println("table()");
///////// Table()--->b2.f(1);
运行 Initialization static cupboard te=new cupboard();
/////////////运行cupboard() 先运行 static Bowl b4=new Bowl(4);//Bowl(4)
///////////// / 运行 static Bowl b5=new Bowl(5);//Bowl(5)
////////////// 初始化cupboard ----〉 Bowl b3=new Bowl(3);
cupboard()----〉System.out.println("cupboard()")// cupboard()
----〉 b4.f(2);//f(2)
然后开始运行public static void main(String[] args){
剩下的你就应该明白如何运行的了
写了这么多,累死我了
|
编译器对静态数据是提前优先处理的!
|
"public class static Initialization",这里的static用的不对吧。
根据java语言规范,static 只能用于成员类(即内部类),而且位于class之前。把这里的static去掉试试看。
根据java语言规范,static 只能用于成员类(即内部类),而且位于class之前。把这里的static去掉试试看。
|
我的看法是:
对于static Initialize的,是JAVA在JVM一运行的时候立刻执行的部分
对于method来说,只能调用大家都是static的变量和方法
对于变量来说,每一个instance都是使用同样一块内存,也就是说无论建立多少个instance,这个static的初始值都是一样的,而在同一个instance中的则是跟普通变量没有什么不同了。
这是我的理解,希望有人补充
对于static Initialize的,是JAVA在JVM一运行的时候立刻执行的部分
对于method来说,只能调用大家都是static的变量和方法
对于变量来说,每一个instance都是使用同样一块内存,也就是说无论建立多少个instance,这个static的初始值都是一样的,而在同一个instance中的则是跟普通变量没有什么不同了。
这是我的理解,希望有人补充
|
和你调用的顺序有关
|
还记得那个吗
int i=0;
(i++)+(++i);
System.out.println(i);
int i=0;
(i++)+(++i);
System.out.println(i);
|
老大,你这程序错误百出
这样还差不多
class Bowl
{
Bowl(int marker)
{
System.out.println("Bowl("+marker +")");
}
void f(int marker)
{
System.out.println("f("+marker+")");
}
}
class Table
{
static Bowl b1=new Bowl(1);
Table()
{
System.out.println("table()");
b2.f(1);
}
void f2(int marker)
{
System.out.println("f2("+marker+")");
}
static Bowl b2=new Bowl(2);
}
class cupboard
{
Bowl b3=new Bowl(3);
static Bowl b4=new Bowl(4);
cupboard()
{
System.out.println("cupboard()");
b4.f(2);
}
void f3(int marker)
{
System.out.println("f3("+marker+")");
}
static Bowl b5=new Bowl(5);
}
public class Initialization
{
public static void main(String[] args)
{
System.out.println("creating new cupboard() in main");
new cupboard();
System.out.println("creating new cupboard() in main");
new cupboard();
t2.f2(1);
te.f3(1);
}
static Table t2=new Table();
static cupboard te=new cupboard();
}
这样还差不多
class Bowl
{
Bowl(int marker)
{
System.out.println("Bowl("+marker +")");
}
void f(int marker)
{
System.out.println("f("+marker+")");
}
}
class Table
{
static Bowl b1=new Bowl(1);
Table()
{
System.out.println("table()");
b2.f(1);
}
void f2(int marker)
{
System.out.println("f2("+marker+")");
}
static Bowl b2=new Bowl(2);
}
class cupboard
{
Bowl b3=new Bowl(3);
static Bowl b4=new Bowl(4);
cupboard()
{
System.out.println("cupboard()");
b4.f(2);
}
void f3(int marker)
{
System.out.println("f3("+marker+")");
}
static Bowl b5=new Bowl(5);
}
public class Initialization
{
public static void main(String[] args)
{
System.out.println("creating new cupboard() in main");
new cupboard();
System.out.println("creating new cupboard() in main");
new cupboard();
t2.f2(1);
te.f3(1);
}
static Table t2=new Table();
static cupboard te=new cupboard();
}
|
你的程序编译都过不去!!!