static关键字
static关键字
静态的,作为普通修饰符
- 修饰成员变量/方法 --->静态变量/方法||类变量/类方法
在普通方法里面可以访问静态方法,但是静态方法中不能方法非静态成员,如果非要访问的话可以创建类的对象来访问成员(例如:new Test().name;),且不能使用this,当class被加载时,static也被加载,但是static只被加载一次。对于静态成员,推荐使用:类名.静态成员变量/方法,这种语法在本类和其他类均可使用,例如:Math.pow(a,b)用的就是类和方法
如果静态属性外部也可以访问,一般都是:public static final 常量名称,例如:常数pi的底层代码public static final PI=3.14159
由于当类被加载的时候static也被加载,那就说明static代码块优先级高于普通代码块,普通代码块优先级高于构造方法。
public Demo1() {
System.out.println("构造方法代码块");
}
{
System.out.println("普通代码块");
}
static{
System.out.println("static代码块");
}
public static void main(String[] args) {
Demo1 demo=new Demo1();
}
输出结果
static代码块
普通代码块
构造方法代码块
而且如果创建两次对象的话
public static void main(String[] args) {
Demo1 demo=new Demo1();
Demo1 demo1=new Demo1();
}
static的代码块只被加载一次,输出结果:
static代码块
普通代码块
构造方法代码块
普通代码块
构造方法代码块
例子:
利用static保证有且只有一个对象
public class Demo1 {
public static Demo1 ob;//创建一个Demo1类的实例对象
private Demo1() {
System.out.println("构造方法代码块");
}//因为只能创建一个对象,所以构造方法得是私有的
static{
//在static里面给对象开辟空间,并且初始化数据,保证对象只被new一次
ob=new Demo1();
}
}
-
static修饰类-->内部类
在类的内部:
- 成员内部类:
- 静态内部类
- 非静态内部类
- 方法内部类
- 匿名内部类
- 成员内部类:
@Setter
@Getter
public class MyClass {
private int num;
public static class Child{
public int a=200;
public void b(){
System.out.println("hello,b"+a);
}
public static void c(){
System.out.println("hello,c");
}
}
}
public class Demo1Test {
public static void main(String[] args) {
//目的:访问child类的属性和方法
MyClass myClass = new MyClass();
MyClass.Child childclass=new MyClass.Child();
//创建child类的对象,child在myclass下,需要加上myclass
System.out.println(childclass.a);
childclass.b();//对象调用public方法
MyClass.Child.c();//用类名直接调用static成员
}
}