首页 > 试题广场 >

如下程序代码的执行结果是

[问答题]

如下程序代码 的执行结果是

class Singleton {
   private static Singleton obj = new Singleton();
   public static int counter1;
   public static int counter2 = 0;   private Singleton() {
      counter1++;
      counter2++;
    }
   public static Singleton getInstance() {
      return obj;
    }
} 
public class MyMain()
  public static void main(String[] args) {
        Singleton obj = Singleton.getInstance();
        System.out.printIn("obj.counter1=="+obj.counter1);
        System.out.printIn("obj.counter2=="+obj.counter2);
    }
}
counter1=1
counter2=0

详解:首先调用类的静态方法(Singleton.getInstance()),会加载这个类(这里指Singleton类)。

执行过程:       
    1.给所有的静态变量赋予一个默认值(int类型的默认值为0);【singleton=null,counter1=0,counter2=0(赋值操作未执行)】
    2.初始化(从上到下开始执行,把右边的值赋值给左边);
    new Singleton()要生成对象(实例),会自动调用它的构造方法。此时counter1++,所以counter=1;counter2++,counter2=1;
    然后继续向下执行,此时counter1没有赋值,故counter1还是等于1, counter2被赋值为0;
发表于 2017-04-16 12:03:31 回复(5)
发表于 2017-03-20 12:05:17 回复(3)
答案: 
obj.counter1==1
obj.counter2==0
1.obj = Singleton.getInstance();调用getInstance()方法 。
2.在getInstance()方法中返回obj对象。这个对象已经被new出来了。
3.创建对象也就是new对象走构造方法 
4. Singleton() {
      counter1++;
      counter2++;
    }
5.这时 counter1=1 counter2=1
6.然后进行静态初始化
  publicstaticintcounter1;
  publicstaticintcounter2 = 0;  //这个时候counter2被赋值为0
所以答案为 1
          0
发表于 2017-08-19 21:10:35 回复(0)
new 一个类的时候,先默认静态变量值为0,接着执行构造方法,最后执行静态变量的赋值初始化。
发表于 2022-05-14 20:19:42 回复(0)
答案是:obj.counter1==1
              obj.counter2==0
但需要注意的是如果这个代码中的 private static Singleton obj = new Singleton();
放在public static int counter2 = 0; 这句后面的话。
答案就是:obj.counter1==1
                  obj.counter2==1
发表于 2017-09-15 21:31:48 回复(0)
这题比较有意思,由Singleton.getInstance()我们可知,其触发了Singleton的类加载过程
在我们真正的使用这个对象之前:  加载、验证 、准备、 解析、初始化过程依次开始,我们这里着重关注准备和初始化过程
在类加载的准备阶段,虚拟机会先给类的静态成员赋初值,这里的初值不是指我们给变量赋的初值,而是Java本身所规定的未初始化变量所对应的值,如引用为null,int为0,boolean为false,那么在这里,三个静态成员obj = null,  counter1 = 0, counter2 = 0
而后过渡到初始化阶段,初始化阶段是执行类构造器clinit方法的过程,这里,会进行正式的static变量的初始化和static块的运行,顺序是从上往下,首先执行的是new Singleton(),触发构造函数的运行,构造函数里,对counter1和counter2都自增一次,由于这里的初始化是从上往下运行的,所以counter1和counter2现在的值是准备阶段的初始值,即都是为0,这里两个都自增,所以为1
而后由于counter1没有进行赋值操作,所以无需初始化,那么其值还是为上一步的1,而counter2进行了赋值操作,为0.
所以,下面的输出语句,就是counter为1, counter2为0
编辑于 2017-09-12 13:32:02 回复(0)
public class Cat {
    private static Cat cat=null;
    public static int count1=1000;
    public static   int count2;
    private Cat(){
        count1++;
        count2++;
    }
    
    public static Cat getIntance(){
        if(cat==null){
            synchronized (Cat.class){
                if(cat==null){
                    cat=new Cat();
                }
            }
        }
    return cat;
    }
    public static void main(String[] args) {
        Cat c=Cat.getIntance();
        System.out.println(c.count1);
        System.out.println(c.count2);
    }
}
静态成员变量的赋值当然是在加载类后就进行了赋值,然后调用构造函数才会自增,结果都是一
发表于 2017-08-31 09:28:49 回复(0)
答案是  obj.counter1==1
             obj.counter2==1
因为Singelton是单实例且他的构造方法被调用了一次,且这连个值的初始值,counter1 没有赋值所以结果是0但是通过构造方法中进行加1 操作之后值变成1,而counter2 中的初始值是0 经过自增操作之后值变成1 ,所以在最后输出的时候值都是1.
发表于 2017-02-11 22:37:43 回复(0)
这个题目有问题啊,class MyMain后面跟了个括号,这是第一个错误,MyMain后面缺少 半个‘{’这个第二个错误。代码都有问题,结果应该是编译错误啊啊嗷嗷 
发表于 2019-12-04 18:12:28 回复(0)

package com.wy;

/**
 * Created by YancyPeng on 2017/8/23.
 */
 class Singleton {

    /*
   在准备阶段会给所有的static变量赋零值,在初始化阶段才会根据程序员的主观计划去初始化类变量和其他资源。
   <clinit>()方法是由编辑器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并而成的,收集的顺序是由语句在源文件中出现的顺序所决定的
   在这段代码中准备阶段:
    obj = null;
    count1 = 0;
    count2 = 0;
    初始化阶段:
    obj = xxxx;
    执行构造方法后:
    count1 = 1;
    count2 = 1;
    接着执行赋值操作:
    count1 = 1;(count1没有赋值,所以依然使用原来的值)
    count2 = 0;(count2被重新赋值)
   */
    private static Singleton obj = new Singleton();
    public static int count1;
    public static int count2 = 0;

    private Singleton(){
        count1++;
        count2++;
    }

    public static Singleton getInstance(){
        return obj;
    }

}
public class Test{

    public static void main(String[] args) {
        Singleton obj = Singleton.getInstance();
        System.out.println("obj1.count1==" + obj.count1); // count1 == 1
        System.out.println("obj1.count2==" + obj.count2); // count2 == 0

    }
} 
如果此时将count1和count2的赋值语句互换位置,那么count1和count2就会先一步进行赋值结果还为0,在构造函数中都加1,所以结果为1



编辑于 2017-09-01 23:59:44 回复(0)