当前位置: 技术问答>java相关
求教:一个关于static的例子!!!
来源: 互联网 发布时间:2015-05-29
本文导语: 这里有一个关于static的例子,运行结果有点看不懂。 请各位给出运行结果(最好不要先运行程序)。 如果你的答案中有多个输出---Bowl(3),请告诉我 Why ? so thanks!! //StaticInitialization.java class Bowl { Bowl(int marker) { ...
这里有一个关于static的例子,运行结果有点看不懂。
请各位给出运行结果(最好不要先运行程序)。
如果你的答案中有多个输出---Bowl(3),请告诉我 Why ?
so thanks!!
//StaticInitialization.java
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 StaticInitialization {
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);
t3.f3(1);
}
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
}
请各位给出运行结果(最好不要先运行程序)。
如果你的答案中有多个输出---Bowl(3),请告诉我 Why ?
so thanks!!
//StaticInitialization.java
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 StaticInitialization {
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);
t3.f3(1);
}
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
}
|
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
先运行static区的语句
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
所以这两个是先被调用的,且是只被调用一次,其他的同理。(可以认为这是在编译时被执行的)
Bowl b3 = new Bowl(3);这个不是static的,所以会多次被调用(运行时被执行)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
先运行static区的语句
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
所以这两个是先被调用的,且是只被调用一次,其他的同理。(可以认为这是在编译时被执行的)
Bowl b3 = new Bowl(3);这个不是static的,所以会多次被调用(运行时被执行)
|
一个类调用顺序如下
1.当类被装入jvm的时候,static的代码执行一次,以后就不再执行
class a{
static int i=33;
static {
System.out.println("abcn"+i);
}
a(){
System.out.println("c");
}
}
2.构造函数头执行
3.实例变量和代码段执行
4.构造函数执行
1.当类被装入jvm的时候,static的代码执行一次,以后就不再执行
class a{
static int i=33;
static {
System.out.println("abcn"+i);
}
a(){
System.out.println("c");
}
}
2.构造函数头执行
3.实例变量和代码段执行
4.构造函数执行
|
这个例子体现了类变量和实例变量的区别:
类变量即在变量前有"static"修饰,没有的即为实例变量;
类变量在每个类中只出现一次,不管这个类创建了多少实例,它使用的内存仅分配一次;
而实例变量是为类的每个实例分配的,在创建类的实例时,系统就为这个类中的所有实例变量分配内存。
在上面的例子中,由于b3是实例变量,所以每分配一个实例,就创建一个新的b3,所以它的输出是多次的
类变量即在变量前有"static"修饰,没有的即为实例变量;
类变量在每个类中只出现一次,不管这个类创建了多少实例,它使用的内存仅分配一次;
而实例变量是为类的每个实例分配的,在创建类的实例时,系统就为这个类中的所有实例变量分配内存。
在上面的例子中,由于b3是实例变量,所以每分配一个实例,就创建一个新的b3,所以它的输出是多次的
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。