黑马程序员技术交流社区
标题:
静态代码块
[打印本页]
作者:
田向向
时间:
2012-7-5 16:45
标题:
静态代码块
本帖最后由 田向向 于 2012-7-5 17:59 编辑
刚才看比老师的视频,越想越不明白
class StaticCodeDemo {
public static void main(String[] args)
{
StaticCode s=new StaticCode();
}
}
class StaticCode{
static
{
System.out.println("a");
}
public static void show()
{
System.out.println("show run");
}
}
主函数调用StaticCode时,必然先加载StaticCode这个类,那为什么打印的时候只打印a呢,而show run非得在主函数中通过调用StaticCode.show();才能运行呢?越想越不明白,谁能帮我解释解释。
作者:
张昊镭
时间:
2012-7-5 16:57
呃,new StaticCode()的时候加载了StaticCode类,然后执行一次静态代码块,也就是打印a,而要打印show run就得要用StaticCode的对象来调用,也就是引用s来调用,如果你想在new StaticCode()的时候即打印a又打印show run,那就只能使用构造函数了,比如这样写吧
class StaticCodeDemo {
public static void main(String[] args)
{
StaticCode s=new StaticCode();
}
}
class StaticCode{
static
{
System.out.println("a");
}
StaticCode()
{
System.out.println("show run");
}
}
作者:
万宝东
时间:
2012-7-5 17:18
现在我是电脑 ,我帮你运行一下这个程序,希望对你有帮助。
class StaticCodeDemo {
public static void main(String[] args)
//第一步:先找到main函数,开始执行
{
StaticCode s=new StaticCode();//
第二步:到了这里,new一个新对象 s,是StaticCode 类型的。要new对象,先要找到StaticCode方法。
}
}
class StaticCode{
//第三步:程序到了这里,要加载这个类
static
//第四步:看到了静态代码块。因为静态代码块只要一经类加载就加载了,并且只加载一次,它是专门给类进行初始化用的;
{
System.out.println("a");//
第五步:打印a。这个时候这个程序就执行完了。main函数中也没有其他语句了,所以程序就倒这里结束了。
}
至于你问的为什么要打印 show run 需要再调用show方法的问题呢? 因为静态代码块 只有static {。。。。} 这个。只有一层大括号。
要想运行下面的方法,就必须再有其他语句来调用它,否则它是不会自己执行的。
public static void show()
{
System.out.println("show run");
}
}
作者:
赵方明
时间:
2012-7-5 17:21
这个是静态代码块和成员函数的区别
静态代码块用来给类进行初始化,随着类的加载而执行。它跟建立对象与否是无关的。
而成员函数只有在对象调用它之后才会执行。
lass StaticCodeDemo {
public static void main(String[] args)
{
/*
new StaticCode();这个第一步不是在堆内存中建立实体,而是先加载类。随着类的加载,静态代码块就执行,输出a。
StaticCode s在栈内存中开辟内存空间,这个空间是类类型的变量s。它存储堆内存中的实体的地址值。
*/
StaticCode s=new StaticCode();
s.show();//s对象调用位于方法区中的成员函数,此时show运行,输出show run
}
}
class StaticCode
{
/*
静态代码块,随着类的加载而执行
*/
static
{
System.out.println("a");
}
/*
成员函数,当对象调用时才执行
*/
public static void show()
{
System.out.println("show run");
}
}
作者:
余清兰
时间:
2012-7-5 17:22
本帖最后由 余清兰 于 2012-7-5 17:23 编辑
这就设计到静态代码块和静态函数的区别了:静态代码块优先于主函数,类一加载进内存就执行了,且只执行一次。
虽然静态方法也是随着类的加载而加载,随着类的消失页消失,但是需要被调用后才能执行,就像普通方法一样,要被对象调用才能执行。
你这里不需要创建对象StaticCode s=new StaticCode();
可以直接用类名.静态方法名();调用,因为静态方法是跟着类走的,所以也称为类方法
静态代码块:
格式:
Static
{
静态代码块中的执行语句
}
特点:随着类的加载而执行,且只执行一次。
用于给类进行初始化的。并优先于主函数,只有用到类中的内容时,类才会被加载
作者:
付蛟龙
时间:
2012-7-5 23:35
这里涉及到两个问题:1、静态修饰符static ; 2、构造代码块;
1、在类中 static所修饰的成员变量或者方法是存储在数据内存在,为类中所有对象所共享,他是随着类的存在而存在,只要StaticCode这各类在内存中一加载 语句 System.out.println("a");也就随之加载;
2、构造代码块中的过程为该类所有的对象都具有的共同行为,它负责给所有的对象统一初始化,对象一旦建立,构造代码块就会执行,而且是优先于构造函数执行
举个现实生活中的例子给你 话说我用汉语定义一个类如下:
类 英语专业学生
{
姓名;
学好;
.
.
.
static
{
上英语课();
}
void 回答老师问题();
{
回答过程;
}
.
.
.
}
可以看到 在静态构造代码块中 我们有一个上英语课的方法 只要你有一个英语专业的学生(对象) 他就会去上英语课这就执行了静态代码块中的内容; 而此类中的回答老师的问题 就必须老师允许你才能回答(调用)
这个和你那个道理是一样的
作者:
付蛟龙
时间:
2012-7-5 23:37
小学没上好 打错字了
学好 --------- 学号 囧{:soso_e126:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2