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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逆袭的风 中级黑马   /  2013-8-1 21:29  /  1770 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 逆袭的风 于 2013-8-2 01:07 编辑

编译运行如下代码:

class Test
{
        static
        {
                System.out.println("看看加载没");
                }
        }


class Demo
{
        public static void main(String [] args)
        {
                System.out.println("**************"+Test.class);
        }
}

输出为:*************class  Test

为什么"看看加载没"没有输出,既然运行不报错,Test类应该已经加载进内存了吧?



9 个回复

倒序浏览
静态代码块的加载
1类进内存就运行了,就一次
2 优先于构造代码块
3 如果多个,按照代码顺序
4子类继承父类后,先运行父类静态代码块,运行子类静态代码块
Test.class是获取Test类的字节码文件,此时这类并没有加载到内存。


回复 使用道具 举报
执行java Demo命令的时候只有Demo被加载进内存了,Test并没有进内存这个时候开始执行主函数,而你写的主函数并没有创建Test类的实例对象,所以Test类根本就不会被加载,静态代码块怎么会执行呢?我在主函数中创建了一个对象,静态代码块就执行了。你再思考一下。
程序如下:
class Test//只有产生实例对象的时候才会加载进内存
{
     static//静态代码块随着Test类的加载而被执行
     {
         System.out.println("看看加载没");
     }
}

/*
java Demo命令只加载了Demo类,然后开始执行主函数,
而主函数中并没有创建Test类的实例,所以静态代码块不会执行
*/
class Demo
{
     public static void main(String [] args)
     {
        System.out.println("**************"+Test.class);
                /*
                只有当创建Test类的实例的时候,虚拟机才去找Test加载进内存
                这个时候Test类中的静态代码块才被执行。
                */
                Test t1=new Test();//创建一个Test类的实例对象
     }
}
回复 使用道具 举报
没有创建对象
回复 使用道具 举报
高永强 发表于 2013-8-1 22:12
执行java Demo命令的时候只有Demo被加载进内存了,Test并没有进内存这个时候开始执行主函数,而你写的主函 ...

如果没加载,Test.class会报错
如果把目录中Test.class删掉,运行会出错
回复 使用道具 举报
高永强 发表于 2013-8-1 22:12
执行java Demo命令的时候只有Demo被加载进内存了,Test并没有进内存这个时候开始执行主函数,而你写的主函 ...

如果没加载,Test.class会报错
如果把目录中Test.class删掉,运行会出错
回复 使用道具 举报
本帖最后由 布易般 于 2013-8-1 23:09 编辑

楼主你的代码:
  1. public static void main(String [] args)
  2.         {
  3.                 System.out.println("**************"+Test.class);
  4.         }
复制代码
最好的Test.class表面上是在调用Test类的功能,实际上,在内存并没有加载Test这个类
有两种方法可以加载Test类:
     1.直接调用Test类中的类方法。
     2.通过new建立Test类实例对象来加载类。
--------------------------------------------------------------
【第一种方法:】直接调用Test类中的类方法。
class Test
{
        static
        {
                System.out.println("看看加载没");
                }
       static void show()
        {
               
        }
}


class Demo
{
        public static void main(String [] args)
        {                   Test.show();//调用类方法的方式,在内存中导入类
                    System.out.println("**************"+Test.class);
        }
}


【方法二】通过new建立Test类实例对象来加载类
class Test
{
        static
        {
            System.out.println("看看加载没");
         }
}


class Demo
{
        public static void main(String [] args)
        {         Test myTest = new Test();//建立一个myTest对象的时候,会把Test类导入到内存。
                    System.out.println("**************"+Test.class);
        }
}
以上输出为:

      看看加载没
      **************class Day09.Test


回复 使用道具 举报 1 0
你写的静态代码块是无法用语句调用的,所以我在代码里添加了一个类方法,或者通过类实例化来加载类到内存中。
回复 使用道具 举报 1 0
逆袭的风 发表于 2013-8-1 22:38
如果没加载,Test.class会报错
如果把目录中Test.class删掉,运行会出错

你没创建对象怎么会加载呢??
你把类Test.class 删掉,当jvm要加载Test类的时候会找不到,你说报不报错??
回复 使用道具 举报
首先!没有创建类对象!
这段代码运行!虚拟机首先找带有主函数main的类,首先运行主函数类,
主函数类当创建了类对象时,被创建了类才进行内存,首先进行类初始化,对象
静态代码块是给是给类进行初始化操作,在方法区内。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马