static
作用域:
- 成员变量(Filed),被修饰的成员变量一般称之为静态变量或类变量。多搭配final使用。
- 函数方法(Method),被修饰的方法一般称之为静态方法
- 内部类,被修饰的内部类称之为静态内部类
- 和import搭配使用
- static静态代码块
示例:
package com.start.test;
/**
* import static + 全限定名称 + .*;将指定类引入后,就可以直接访问类中的静态成员变量和静态方法,
* 就无需再使用类名+方法或成员变量的方式来使用其他类的静态方法或静态属性;
* 例如下面getName()方法使用的Test2类的field1属性和testMethod()方法;
* 该搭配是jdk1.5版本新引入的,自jdk1.5版本之后生效
*/
import static com.start.test.Test2.*;
public class TestStatic {
private String Tcode;
/**
* 被static修饰的成员属性,也称为静态变量、静态属性或类属性,
* 既然被称之为类属性,顾名思义这个属性是属于当前类的,而不是属于对象的,也就是说无需创建对象就可以个使用这个属性,
* 一般静态变量的使用方式为 类名.属性名 即TestStatic.name就可以直接获取当前属性值,当然也需要注意权限修饰符的作用域。
* 根据命名规范静态变量的变量名称应驼峰式命名。
*/
static String name;
/**
* 1.被static修饰的代码块,会优先于普通代码块先执行,也就是在普通代码块之前执行
* 2.相比于普通代码块,静态代码块可以给静态成员变量和静态常量进行赋值。
* 对静态常量进行赋值这一点比较特殊,因为静态常量必须赋值,但如果给一个静态常量赋值时想根据某些条件进行赋值,
* 如果条件比较简单可以使用三元表达式进行简单逻辑判断例如下方的OLD静态常量,但如果判断条件复杂就可以使用静态代码块来进行赋值操作例如下方的AGE属性,
* 而且静态代码块和静态常量之间不需要关注先后顺序例如下方的AGE属性,但需要注意说的是静态常量静态变量不行,例如name属性就必须写在静态代码块上方才可使用。
* 可以参考Integer类的IntegerCache,这里面就进行了比较复杂的判断。
* 3.当调用当前类的静态方法时会先执行静态代码块
* 4.当创建当前类的实例对象时,也会优先调用静态代码块-->普通代码块-->构造器
*
*/
static {
/**
* 在进行逻辑判断时,需要注意无论怎样进行逻辑判断,AGE静态常量必须赋值,
* 如果下面的if分支判断没有写最后的else AGE=80,是编译不通过的
*/
if (null == name){
AGE = 0;
}else if (name.equals("张三")){
AGE = 20;
}else if (name.equals("李四")){
AGE = 50;
}else {
AGE = 80;
}
System.out.println("-----------");
}
/**
* 被static和final同时修饰的成员属性,称之为静态常量,他也是类属性,非
* 与静态变量相比,静态常量必须进行初始化赋值,并且具有不可变性。
* 根据命名规范静态常量应全部大写
*/
static final Integer AGE;
static final Boolean OLD = AGE>70?true:false;
/**
* 静态方法,相比于普通方法,静态方法无需创建对象后调用,和静态变量一帮可被其他类直接进行访问,如果权限允许的话。
* 在静态方法中无法直接调用非静态方法,如果需要调用非静态方法,只能先创建对象再进行访问,即使访问当前类的方法也是如此。
* 在静态方法中无法使用普通的成员变量,必须使用静态变量或静态常量,因为普通的成员变量是属于类的,类的初始化要比对象早或者可能就没有当前类的对象。
*/
static void getName(){
System.out.println(field1);
testMethod();
}
/**
* 被static修饰的内部类,称之为静态内部类。相比于其他普通的内部类有如下异同
* 1.静态内部类可以定义静态变量、静态常量、静态方法,普通内部类则不可以。普通内部类只可创建普通的成员变量和方法,和static有关的操作都不可使用。
* 2.在其他对象中可以创建静态内部类的实例对象,例如TestStatic.ClassStatic tcs = new TestStatic.ClassStatic();
* 而普通的内部类无法直接通过new指令创建,也就是其他对象无法直接访问某个对象的内部类对象。也就是说普通内部类直供当前对象使用,当前对象可以通过new的方式创建内部类对象,其他对象无法直接访问。
* 3.内部类可以无条件访问外部类的属性及方法,即使属性和方法是private的。普通内部类对这个描述自然是没问题的,但如果是静态内部类就不行了,原则上静态内部类与外部类是平级的,就需要按照正常的访问关系进行访问
* 也就是该new就new,没有不创建对象实例直接引用这一说,可以直接引用的也就是外部类的静态变量、静态常量和静态方法。外部类唯一可以对静态内部类产生影响的就是权限修饰符。
* 总结:还是那句话静态内部类是属于类的,是可被共享的与普通类无异(当然具体还得看权限修饰符如何修饰的,如果是private的那就只能当前类是由),只是创建时需要带上当前类名。
* 而普通内部类是属于对象的,只能当前对象使用,使用时需要new一个内部类的对象实例。
*/
protected static class ClassStatic{
static String code;
static String getCode(){
return code;
}
}
public class ClassStaticWithin{
String code;
String getName(){
return name;
}
}
}