class A{
private static A obj=new A();
public static int num1;
public static int num2=0;
private A(){
num1++;
num2++;
//ystem.out.println(+num1);
//ystem.out.println(+num2);
}
public static A getInstance(){
return obj;
}
}public class Test{
public static void main(String[] args){
A obj=A.getInstance();
System.out.println("obj.num1="+obj.num1);
System.out.println("obj.num2="+obj.num2);
}
㈠执行时,是从main方法开始呢,还是先加载主类(Test)然后执行main方法?㈡main方法中执行到A obj=A.getInstance();时,停下来加载类A,是不是类A的静态成员变量(obj,num1,num2)初始化为默认值(Obj=null,num1=0;num2=0)后就加载完成了?如果没执行完,是不是继续执行private static A obj=new A();public static int num2=0;这两条语句(即将obj实例化,赋给num2指定的值),可是在执行语句private static A obj=new A();时,我陷入了困惑:类A还没有加载完成,能创建类A的对象吗?能创建的话,直接调用构造方法吗?小弟研究了好久,不得其解。诚请教!
private static A obj=new A();
public static int num1;
public static int num2=0;
private A(){
num1++;
num2++;
//ystem.out.println(+num1);
//ystem.out.println(+num2);
}
public static A getInstance(){
return obj;
}
}public class Test{
public static void main(String[] args){
A obj=A.getInstance();
System.out.println("obj.num1="+obj.num1);
System.out.println("obj.num2="+obj.num2);
}
㈠执行时,是从main方法开始呢,还是先加载主类(Test)然后执行main方法?㈡main方法中执行到A obj=A.getInstance();时,停下来加载类A,是不是类A的静态成员变量(obj,num1,num2)初始化为默认值(Obj=null,num1=0;num2=0)后就加载完成了?如果没执行完,是不是继续执行private static A obj=new A();public static int num2=0;这两条语句(即将obj实例化,赋给num2指定的值),可是在执行语句private static A obj=new A();时,我陷入了困惑:类A还没有加载完成,能创建类A的对象吗?能创建的话,直接调用构造方法吗?小弟研究了好久,不得其解。诚请教!
解决方案 »
- 在java中,接口定义为抽象的,有什么好处?
- 关于java2核心技术??java核心技术??
- 帮忙看下是哪错了,谢谢啦。T T
- 请教java里面的.的转义
- 向所有高手提问一个简单问题
- 小女子又有问题想请教各位学长了?
- 各位大虾看看我这个冒泡排序程序(java)错在哪里??
- Swing组件
- 初学java,概念不清,请大家帮忙 J2ME,jdk,jbuilder,jBean,jsp,j2EE,EJB,jms这些概念的含义是什么
- 用lastModified()得到一个文件的修改时间,为什么返回结果总是0呢??急啊!
- ibatis动态传入表名,操作符,参数
- jdk1.5下的concurrent线程池的实现原理是怎样的,和1.5前实现的线程池有什么区别。
2. 不想看字节码,可以在CLass A 和 Class Test里加上 staic{语句块}打印一些信息,你也就知道执行顺序了
3. 最后,看看JVM规范,可以告诉你为啥执行顺序是这个样子的
我建议你自己研究一下,这样印象深刻,比较有成就感
class AB {
static{
System.out.println("我来了AB");
}
private static AB obj = new AB();
public static int num1; public static int num2 = 0; private AB() {
System.out.println("我来了AB构造函数");
num1++;
num2++;
// ystem.out.println(+num1);
// ystem.out.println(+num2);
} public static AB getInstance() {
System.out.println("我来了实例");
return obj;
}
}
public class CsdnTest {
static{
System.out.println("我来了CsdnTest");
}
public static void main(String[] args) {
System.out.println("我来了main");
AB obj = AB.getInstance();
System.out.println("obj.num1=" + obj.num1);
System.out.println("obj.num2=" + obj.num2);
}
}输出:
我来了CsdnTest
我来了main
我来了AB
我来了AB构造函数
我来了实例
obj.num1=1
obj.num2=0
LZ看到这个结果。。你的问题就不需要一一再回答了吧?
懒的找帖子。。直接打字算了
1.先加载主类
2.当执行getInstance()时 先加载类A 类A加载完了
然后开始加载private static A obj=new A();
此时 NUM1 NUM2的值都为1
然后继续加载public static int num1和 public static int num2=0就是这样- -
原因是:num1在声明的时候没有直接赋值,所以后面num1++等于在进行赋值。所以是1。
num2在声明时直接赋值了。static修饰不能改变值了。。所以是0(0是因为int型默认的)。去掉静态就能看见变化了