static 今天看到有人写的这样的代码:static{……}省略号代表普通的java代码非常迷惑,请高手指点 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java编程思想有非常详细的描述如果static{……}代码段在代码的最前面,那么里面的代码会最先执行 比构造器等任何方法都早 有些代码需要一些资源才能执行 可以定义static{……}块来初始化资源 这样可以防止空指针之类的错误 有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量 实例方法和类方法 类方法时属于类的.类变量也属于类 方法声明中用关键字static修饰的成为类方法或者静态方法.不用static修饰的为实例方法.实例方法可以调用实例方法或者类方法.类方法只能调用该类的类方法,不能调用实例方法. 实例方法可以操作成员变量,无论是实例变量还是类变量;类方法只能操作类变量.不能操作实例变量.类方法的几条限制:1)它们仅能调用其他的static 方法2)它们只能访问static数据。3)它们不能以任何方式引用this 或super实例方法必须通过对象调用的原因: 当类的字节码文件被加载到内存时,类的实例不会被分配入口地址,只有当该类创建对象后,类中的实例方法才分配入口地址.当使用new和构造方法创建对象时,首先分配成员变量给该对象,同时实例方法分配入口地址.然后执行构造方法中的语句.完成必要的初始化.当创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址时被所有对象共享.类方法可以通过类名直接调用原因: 对于类中的类方法,再该类被加载到内存时,就分配了相应的入口地址,即使该类没有创建对象,也可以直接通过类名调用方法(也可以通过对象调用).类方法中出现的成员变量必须时被所有共享的变量(类变量).类方法不能操作实例变量的原因: 再类创建对象以前,实例方法也没有入口地址.无论类方法或者实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的内存.例如: public class ClassModle { static double x=56.84,y=34.10;//类变量 static double max(double a,double b){ //类方法 return a>b?a:b; } public double min(){ //实例方法 return x+y; //方法操作类变量 } public static void main(String args[]){ double max=ClassModle.max(12, 34); //通过类名调用类方法 System.out.println(max); System.out.println(ClassModle.x=23); //直接通过类名调用类变量 System.out.println(ClassModle.y=52); ClassModle mode=new ClassModle(); System.out.println(mode.max(12, 78)); //通过对象调用类方法 System.out.println(mode.min()); //通过对象调用实例方法 }} 执行时间:当你去new一个对象时或调用该对象的静态成员时,该类就会对static变量初始化,然后是static{}这是static块|静态块.用途:一般情况下静态块用于对该类的非静态变量进行初始化一楼和三楼说的有问题,如果有static变量的话,该变量首先被初始化,然后才执行static{//...} static{……}在类初始化时执行,位于类静态变量初始化之后,无关于构造器执行与否。 01.//一条对象语句可以直接调用四方,简称"一调四",具体阐述如下: 02.class Qo 03.{ 04. static int i; 05. private String s="null"; 06. public Qo(String s) 07. { 08. this.s=s; 09. System.out.println("调用构造方法 s="+s); 10. System.out.println("Ye..Ye...Ye..Y i="+i); 11. } 12. 13. {System.out.println("实例代码块.");} 14. 15. static {System.out.println("静态代码块.");} 16.} 17. 18.class Rt122 19.{ 20. public static void main(String[] args) 21. { 22. new Qo("您好!").i=1986;//***可以直接调用 静态代码块>实例代码块>构造方法>给类成员赋值. 23. new Qo("xg");//检测上行语句到底有没有把值赋予i. 24. } 25.} 26./* 27.静态代码块. 28.实例代码块. 29.调用构造方法 s=您好! 30.Ye..Ye...Ye..Y i=0 31.实例代码块. 32.调用构造方法 s=xg 33.Ye..Ye...Ye..Y i=1986 34.*/ 这叫做初始化块语句,{}里的代码在这个类被加载到内存后马上会被执行的。这些代码最先执行并且在JVM运行过程中只会执行一次。 这个是静态代码块,在这个类被加载到JVM的时候,和所有静态的方法或者属性一样,只会在程序运行的时候加载一次。java 程序代码的执行顺序是:1.所有静态的比非静态的先加载。2.所有静态的(静态变量、方法或者块)按照顺序加载。3.所有的块都在构造函数之前执行。块除了静态块还有非静态块。非静态块没有static关键字,只有{}。 java中的引用变量存放在哪里 运行同一个包中的两个类 ******高手们救命啊,帮忙做个sockets题目(一经采用另送200分)****** 关于nio包中Datagramchannel实现非阻塞的问题 关于分页的问题 scjp的考题,大家来分析一下吧,没有分了,就当学习吧, 请教用Java开发语音识别 高分求java 程序!!!!!!!! 为什么非静态变量不能用在静态方法上?什么意思? 遇到困难了 可以帮忙看看吗 在线等 Java中Math.random()的取值问题,求助 Java Socket中的编码问题
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量
实例方法和类方法
类方法时属于类的.类变量也属于类
方法声明中用关键字static修饰的成为类方法或者静态方法.不用static修饰的为实例方法.实例方法可以调用实例方法或者类方法.类方法只能调用该类的类方法,不能调用实例方法.
实例方法可以操作成员变量,无论是实例变量还是类变量;类方法只能操作类变量.不能操作实例变量.类方法的几条限制:
1)它们仅能调用其他的static 方法
2)它们只能访问static数据。
3)它们不能以任何方式引用this 或super实例方法必须通过对象调用的原因: 当类的字节码文件被加载到内存时,类的实例不会被分配入口地址,只有当该类创建对象后,类中的实例方法才分配入口地址.当使用new和构造方法创建对象时,首先分配成员变量给该对象,同时实例方法分配入口地址.然后执行构造方法中的语句.完成必要的初始化.当创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址时被所有对象共享.类方法可以通过类名直接调用原因: 对于类中的类方法,再该类被加载到内存时,就分配了相应的入口地址,即使该类没有创建对象,也可以直接通过类名调用方法(也可以通过对象调用).类方法中出现的成员变量必须时被所有共享的变量(类变量).类方法不能操作实例变量的原因: 再类创建对象以前,实例方法也没有入口地址.无论类方法或者实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的内存.例如:
public class ClassModle {
static double x=56.84,y=34.10;//类变量
static double max(double a,double b){ //类方法
return a>b?a:b;
}
public double min(){ //实例方法
return x+y; //方法操作类变量
}
public static void main(String args[]){
double max=ClassModle.max(12, 34); //通过类名调用类方法
System.out.println(max);
System.out.println(ClassModle.x=23); //直接通过类名调用类变量
System.out.println(ClassModle.y=52); ClassModle mode=new ClassModle();
System.out.println(mode.max(12, 78)); //通过对象调用类方法
System.out.println(mode.min()); //通过对象调用实例方法
}
}
02.class Qo
03.{
04. static int i;
05. private String s="null";
06. public Qo(String s)
07. {
08. this.s=s;
09. System.out.println("调用构造方法 s="+s);
10. System.out.println("Ye..Ye...Ye..Y i="+i);
11. }
12.
13. {System.out.println("实例代码块.");}
14.
15. static {System.out.println("静态代码块.");}
16.}
17.
18.class Rt122
19.{
20. public static void main(String[] args)
21. {
22. new Qo("您好!").i=1986;//***可以直接调用 静态代码块>实例代码块>构造方法>给类成员赋值.
23. new Qo("xg");//检测上行语句到底有没有把值赋予i.
24. }
25.}
26./*
27.静态代码块.
28.实例代码块.
29.调用构造方法 s=您好!
30.Ye..Ye...Ye..Y i=0
31.实例代码块.
32.调用构造方法 s=xg
33.Ye..Ye...Ye..Y i=1986
34.*/
java 程序代码的执行顺序是:
1.所有静态的比非静态的先加载。
2.所有静态的(静态变量、方法或者块)按照顺序加载。
3.所有的块都在构造函数之前执行。块除了静态块还有非静态块。非静态块没有static关键字,只有{}。