A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李文肖 黑马帝   /  2011-10-9 14:40  /  2356 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


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()

谢谢

4 个回复

倒序浏览
你没有new Cups()实例
public static void main(String[] args){
        System.out.println("Inside main()");
        Cups cups = new Cups(); // 要实例化
        Cups.cup1.f(99); // 这里只是调用Cups里面的静态方法,不会实例化该对象
    }

评分

参与人数 1技术分 +2 黑马币 +5 收起 理由
wangfayin + 2 + 5 赞一个!

查看全部评分

回复 使用道具 举报
Cups()是一个无参的构造方法,你并没有使用该无参构造方法实例化一个对象,当然不会输出了

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
修改后:

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()

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报

类装载步骤
   在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)

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马