static可以修饰内部类,方法,变量,也可以限定静态代码块。被它修饰的内部类、变量或方法属于类而不从属于某一具体的对象,所以它们的使用方法也比较特殊,如: 类A有被static修饰的内部类B,那么B的对象的定义为:A.B b = new A.B(); 而方法或变量可以如此使用:this.(方法名)或this.(变量名) 。 被static修饰的静态代码块优先于其他代码执行。 说到static,不得不提修饰main方法的static。为什么main方法要用static修饰呢?那是因为static修饰的方法可以被类直接使用,所以main方法可以直接被虚拟机调用,这样使用比较方便。 static的缺点是:不当使用static时,导致内存没有被及时释放。
对于每一个基于相同类别所产生的对象而言,其拥有各自的资料成员,然而在某些时候,您会想要这些对象拥有相同的资料成员,其资料是共享的。举个例子来说,在Ball类别中,您会使用到圆周率的这个资料,对于任一个球而言,圆周率都是一样的,您并不需要让不同的球对象拥有各自的资料成员来记录圆周率,而这个记录的值却是相同,这只会增加内存的消耗而已。您可以将资料成员声明为"static",被声明为"static"的资料成员,它是属于类别所拥有,而不是个别的对象,您可以将"static"视为个别对象所拥有、共享的资料成员。要声明static变量,您只要在声明资料成员时加上"static"关键字就可以了,例如:public class Ball { // .... public static double PI = 3.14159; // 声明static资料
public Ball() { // .. }
public Ball(double radius, String name) { //... }
public double getVolumn() { // ...... } } 由于static成员属于类别所拥有,所以在不使用对象名称的情况下,您也可以使用类别名称加上 . 运算子来存取static资料成员,例如:System.out.println("PI = " + Ball.PI); static变量同样遵守public、protected与 private的存取限制,所以若您要在类别之外直接存取static变量,必须注意它的权限(例如必须设定为public成员)。虽然您也可以在声明对象之后,使用 . 运算子来存取static资料成员,但是这并不被鼓励,通常建议使用类别名称加上 . 运算子来存取,一方面也可以避免与非static成员混淆。与静态资料成员类似的,您也可以声明方法成员为static方法,又称静态方法,被声明为静态的方法通常是为了提供工具,例如在Ball类别上增加一个角度转径度的方法toRadius():public class Ball { ... public static double toRadius(double angle) { return 3.14159 / 180 * angle; } } 与静态资料成员一样的,您可以通过类别名称使用'.'运算子来存取static方法(当然要注意权限设定,例如设定为public),例如:System.out.println("角度90等于径度" + Ball.toRadius(90)); 静态资料与静态方法的作用通常是为了提供共享的资料或工具方法,例如将数学常用常量或计算公式,以static声明并撰写,之后您可以把这个类别当作工具,通过类别名称来管理与取用这些静态资料或方法,例如像J2SE 所提供的Math类别上,就有Math.PI这个静态常量,以及Math.Exp()、Math.Log()、Math.Sin()等静态方法可以直接使用,另外还有像Integer.parseInt()、Integer. MAX_VALUE等也都是静态方法与静态资料成员的实际例子。由于static成员是属于类别而不是对象,所以当您呼叫static方法时,并不会传入对象的位置参考,所以static方法中不会有 this参考,由于没有this参考,所以在Java的static方法成员中不允许使用非static成员,因为程序没有this来参考至对象位址,也就无法辨别要存取哪一个对象的成员,事实上,如果您在static方法中使用非static资料成员,在编译时就会出现以下的错误讯息:non-static variable test cannot be referenced from a static context 或者是在static函式中呼叫非static函式,在编译时就会出现以下的错误讯息:non-static method showMe() cannot be referenced from a static context Java在使用到类别时才会加以载入程序中,如果您要使用一个static资料或方法,而在载入一个类别时,您希望先进行一些初始化动作,您可以使用static定义一个区块,并在当中撰写初始化资源的动作,例如:public class Ball { static { // 一些初始化程序码 } .... } 像上面这样一个类别,在第一次呼叫而被载入时,static区块中的程序码就会被执行,且只会执行一次。
static修饰类变量时,该变量每个类只有一份。
static修饰方法时,调用是直接绑定,性能会比多态情形略好(非优化情况下).static方法不存在覆盖和多态现象。
static修饰静态块:
class Test{
static{}
}
类加载时执行一次。应用场景:面向问题进行分析,一般不需要根据性能等问题来考虑。
package JavaBasic;public class DeadLock implements Runnable{ public int flag=1;
Object o1=new Object();
Object o2=new Object();
public void run(){
System.out.println("flag="+flag);
if(flag==1){
synchronized(o1){
try{
Thread.sleep(2000);
}catch(InterruptedException e){
System.out.println(e.getMessage());
}
synchronized(o2){
System.out.println("flag=1 enter o2");
}
}
}
if(flag==0){
synchronized(o2){
try{
Thread.sleep(2000);
}catch(InterruptedException e){
System.out.println(e.getMessage());
}
synchronized(o1){
System.out.println("flag=0 enter o1");
}
}
}
}
public static void main(String[] args) {
DeadLock td1=new DeadLock();
DeadLock td2=new DeadLock();
td1.flag=1;
td2.flag=0;
new Thread(td1).start();
new Thread(td2).start();
}}
当然是Object o1=new Object();
Object o2=new Object();
static修饰的方法是类方法,执行时不需要类的实例就可运行。修饰的变量是类变量;在引用static
方法和变量时,如果类还没加载,会引起类的加载。static不能修饰方法中的变量。
static代码段会在类加载的时候执行。static变量也称为哨兵变量。大家继续
静态变量是存在内存中data segment区域的,而且只在加载类的时候初始化一次
局部变量是存在内存中栈里面的哦。谈点使用
静态变量是不用创建对象就能直接拿来用的 类名.静态变量名 当然你也可以 对象.静态变量名
你使用的时候,在此方法中不能访问非静态变量,非静态方法。当然更不能使用this,super等关键字。
这是我所理解的 就这些了 呵呵
类A有被static修饰的内部类B,那么B的对象的定义为:A.B b = new A.B();
而方法或变量可以如此使用:this.(方法名)或this.(变量名) 。
被static修饰的静态代码块优先于其他代码执行。
说到static,不得不提修饰main方法的static。为什么main方法要用static修饰呢?那是因为static修饰的方法可以被类直接使用,所以main方法可以直接被虚拟机调用,这样使用比较方便。
static的缺点是:不当使用static时,导致内存没有被及时释放。
// ....
public static double PI = 3.14159; // 声明static资料
public Ball() {
// ..
}
public Ball(double radius, String name) {
//...
}
public double getVolumn() {
// ......
}
}
由于static成员属于类别所拥有,所以在不使用对象名称的情况下,您也可以使用类别名称加上 . 运算子来存取static资料成员,例如:System.out.println("PI = " + Ball.PI);
static变量同样遵守public、protected与 private的存取限制,所以若您要在类别之外直接存取static变量,必须注意它的权限(例如必须设定为public成员)。虽然您也可以在声明对象之后,使用 . 运算子来存取static资料成员,但是这并不被鼓励,通常建议使用类别名称加上 . 运算子来存取,一方面也可以避免与非static成员混淆。与静态资料成员类似的,您也可以声明方法成员为static方法,又称静态方法,被声明为静态的方法通常是为了提供工具,例如在Ball类别上增加一个角度转径度的方法toRadius():public class Ball {
...
public static double toRadius(double angle) {
return 3.14159 / 180 * angle;
}
}
与静态资料成员一样的,您可以通过类别名称使用'.'运算子来存取static方法(当然要注意权限设定,例如设定为public),例如:System.out.println("角度90等于径度" + Ball.toRadius(90)); 静态资料与静态方法的作用通常是为了提供共享的资料或工具方法,例如将数学常用常量或计算公式,以static声明并撰写,之后您可以把这个类别当作工具,通过类别名称来管理与取用这些静态资料或方法,例如像J2SE 所提供的Math类别上,就有Math.PI这个静态常量,以及Math.Exp()、Math.Log()、Math.Sin()等静态方法可以直接使用,另外还有像Integer.parseInt()、Integer. MAX_VALUE等也都是静态方法与静态资料成员的实际例子。由于static成员是属于类别而不是对象,所以当您呼叫static方法时,并不会传入对象的位置参考,所以static方法中不会有 this参考,由于没有this参考,所以在Java的static方法成员中不允许使用非static成员,因为程序没有this来参考至对象位址,也就无法辨别要存取哪一个对象的成员,事实上,如果您在static方法中使用非static资料成员,在编译时就会出现以下的错误讯息:non-static variable test cannot be referenced from a static context
或者是在static函式中呼叫非static函式,在编译时就会出现以下的错误讯息:non-static method showMe() cannot be referenced from a static context
Java在使用到类别时才会加以载入程序中,如果您要使用一个static资料或方法,而在载入一个类别时,您希望先进行一些初始化动作,您可以使用static定义一个区块,并在当中撰写初始化资源的动作,例如:public class Ball {
static {
// 一些初始化程序码
} ....
} 像上面这样一个类别,在第一次呼叫而被载入时,static区块中的程序码就会被执行,且只会执行一次。
我觉得static成员变量是常驻内存的
就是说如果你的程序启动静态变量就占据内存一块位子
除非你手动释放,要不他会一直占据了内存指导程序终止
这也就是为什么不建议大量用static修饰变量的原因吧
自动去检测。当检测到没用引用指向某块内存时
垃圾回收机制会自动释放此内存
static final int
我也是来学习的。