黑马程序员技术交流社区

标题: 静态初始化疑问[ [打印本页]

作者: 李文肖    时间: 2011-10-9 14:40
标题: 静态初始化疑问[

class Cup{
    Cup(int marker){
        System.out.println("cup("+ marker +")");
    }
    void f(int marker){
        System.out.println("f("+marker+")");
      }
   
}

class Cups{
    static Cup cup1;
    static Cup cup2;
    static {
        cup1 = new Cup(1);
        cup2 = new Cup(2);
    }
    Cups() {
        System.out.println("Cups()");
    }
    }
   
   

public class JingTai {
   
    public static void main(String[] args){
        System.out.println("Inside main()");
        Cups.cup1.f(99);
    }
   
   

}





输出结果为

Inside main()
cup(1)
cup(2)
f(99)



为什么没输出Cups()

谢谢
作者: 林国锋    时间: 2011-10-9 14:57
你没有new Cups()实例
public static void main(String[] args){
        System.out.println("Inside main()");
        Cups cups = new Cups(); // 要实例化
        Cups.cup1.f(99); // 这里只是调用Cups里面的静态方法,不会实例化该对象
    }
作者: 王春艳    时间: 2011-10-9 14:58
修改后:

class Cup{
    Cup(int marker){
        System.out.println("cup("+ marker +")");
    }
    void f(int marker){
        System.out.println("f("+marker+")");
      }
   
}

class Cups{
    static Cup cup1;
    static Cup cup2;
    static {
        cup1 = new Cup(1);
        cup2 = new Cup(2);
    }
   void Cups() { //方法没返回值的时候
        System.out.println("Cups()");
    }
    }
   
   

public class JingTai {
   
    public static void main(String[] args){
        System.out.println("Inside main()");
        Cups.cup1.f(99);
        Cups c = new Cups();
        c.Cups(); //你的程序根本没调用怎么会输出呢
      
    }
   

}


修改后输出结果:
Inside main()
cup(1)
cup(2)
f(99)
Cups()
作者: 黄治文    时间: 2011-10-9 15:02
Cups()是一个无参的构造方法,你并没有使用该无参构造方法实例化一个对象,当然不会输出了
作者: 张雷    时间: 2011-10-9 15:28

类装载步骤
   在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
Cups.cup1.f(99);
通俗的讲
静态代码块在出现这个类的类名的时候就执行; 就是类被点名就执行。

只有用到类的内容时,类才会被加载。
而你并没有创建这个类的对象。也没用到里面的内容。
所以这个类没有被加载
而   静态代码块     在出现这个类的类名的时候就执行; 就是类被点名就执行。
所以就只执行   静态代码块里面的。
static {
        cup1 = new Cup(1);
        cup2 = new Cup(2);
    }

  cup1 = new Cup(1);
        cup2 = new Cup(2);
这一个类用到了new,也就是用到了  构造有参函数
Cup(int marker){
        System.out.println("cup("+ marker +")");
    }
new  了 2次 所以加载2次
输出
cup(1)
cup(2)

然后.
cup1.f(99);
调用 方法
输出
f(99)





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2