黑马程序员技术交流社区

标题: 静态代码块的妙用??? [打印本页]

作者: 冯纪纲    时间: 2012-10-31 00:55
标题: 静态代码块的妙用???
本帖最后由 冯纪纲 于 2012-11-12 16:16 编辑

class Demo
{
        {
                System.out.println("1.构造块。");//定义构造块
        }

        static{
                System.out.println("0.静态代码块。");//定义静态代码块
        }
        public Demo()
        {
                System.out.println("2.构造方法。");//定义构造方法
        }
}
{
}

class  CodeDemo
{
        static{
                System.out.println("在main方法中定义的静态代码块。");//在main方法中定义静态代码块
        }
        public static void main(String[] args)
        {
                new Demo();//实例化对象
                new Demo();//实例化对象
                new Demo();//实例化对象
        }
}
运行结果为:
在main方法中定义的静态代码块。
0.静态代码块。
1.构造块。
2.构造方法。
1.构造块。
2.构造方法。
1.构造块。
2.构造方法。

从程序的运行结果发现,静态代码块优先于main方法执行,而在类中定义的静态代码块优先于构造块执行,而且不管有多少个对象产生,静态代码块只执行一次。
既然静态代码块优先于mian方法执行,那么可以直接使用静态代码块而不使用main方法来打印“hello world”了,

class  CodeDemo1
{
        static{
                System.out.println("hello world");//直接在静态块中打印信息
        }
        
}
结果:
hello world  但是下面蹦出个NoSuchMenthodError:main 异常。有没有不加main方法的决解方案呢?


作者: jsfjb    时间: 2012-10-31 09:07
我感觉没有,因为程序执行就是从main开始的。程序执行的时候会寻找main,没有mai的话就没有开始,所以就over了!
作者: 王杰    时间: 2012-10-31 09:32
  1. 试试这样:
  2. class  CodeDemo1
  3. {
  4.         static{
  5.                 System.out.println("hello world");
  6.         }

  7. public static void main(String[] args)
  8.         {}
  9. }
  10. 总结:1,静态虽好但是只能访问静态。
  11. 2,静态代码块是给类进行初始化的,在第一次加载类时运行,只要存在对该类的引用,且未被垃圾回收机制回收,那么就会常驻内存。所以以后要慎用。
  12. 3,回答你提的问题:没有其他方法!main方法是程序运行的入口。如果向运行程序,main方法是必须有的!
复制代码

作者: 林晓泉    时间: 2012-10-31 10:02
王杰 发表于 2012-10-31 09:32

2.静态代码块是给类进行初始化的,在第一次加载类时运行,只要存在对该类的引用,且未被垃圾回收机制回收,那么就会常驻内存。所以以后要慎用
这句话不是很懂,能解释下吗?
是静态代码块的代码会一直在方法区中?
类的引用是什么概念?和对象的引用的区别?
什么情况下类在内存中会完全消失?
作者: 王杰    时间: 2012-10-31 12:00
林晓泉 发表于 2012-10-31 10:02
2.静态代码块是给类进行初始化的,在第一次加载类时运行,只要存在对该类的引用,且未被垃圾回收机制回收 ...

1,静态代码块 应该是在静态区,也不是一直都在,静态属性的生命周期是:从你第一次使用这个类(注意不是使用这个对象!不是new出来的)或new一个对象的时候加载到内存,直到被jvm回收。
2,类的引用;这是我自己的说法,通俗的说就是:你用过这个类,比如:System.out.println("ha");这里你没有new对象,但是你用了System,System就加载到了内存中,你可以使用System的静态方法和访问访问它的静态属性。
     对象的引用:也就是说,堆里面的对象在栈里面有相应的引用。
3,什么情况下类在内存中会完全消失?
a,jvm关了;
b,被java的垃圾回收机制回收了。
作者: 林晓泉    时间: 2012-10-31 12:58
王杰 发表于 2012-10-31 12:00
1,静态代码块 应该是在静态区,也不是一直都在,静态属性的生命周期是:从你第一次使用这个类(注意不是 ...

3,什么情况下类在内存中会完全消失?
a,jvm关了;//这个懂
b,被java的垃圾回收机制回收了。//什么时候可以被回收,对象是在没有被引用的时候,类呢?

作者: 王杰    时间: 2012-10-31 13:14
林晓泉 发表于 2012-10-31 12:58
3,什么情况下类在内存中会完全消失?
a,jvm关了;//这个懂
b,被java的垃圾回收机制回收了。//什么时 ...

jvm:java虚拟机
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收 来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。
垃圾收集的算法分析

Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。

大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。
作者: 冯纪纲    时间: 2012-11-7 22:42
王杰 发表于 2012-10-31 09:32

在静态代码块的最后加上"System.exit(0);",感觉还行哦  呵呵




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