在Java的学习过程中,有关于静态static的学习我一直都感觉很有意思,特别是静态类,因为它在使用时需要特别注意,下面介绍的是关于static的
作用:
用于修饰成员
随着类加载,随着类消失
优先于对象,用类名直接访问
静态属性
static属性是当前类的所有对象共有的共同属性,任何一个当前类对象修改这个属性,所有其他类对象的这个属性都会受影响
语法:
public class A{
范围限定词private/package/protected/public static 类型 变量名;
}
静态方法
可通过对象名或类名调用的方法
语法:
public class 类{
范围限定词 static 返回值类型 方法名称(参数列表){
}
}
在静态方法中不允许使用super或者this指代对象,允许在静态方法中自行创建对象进行调用
静态方法只能访问静态成员,不能直接访问非静态成员,除非时自行创建对象
public class T1 {
private int age;
private static int count=0;
public void A() {} //非静态方法
public static void B() {} //静态方法
public static void C() { //静态方法
// A(); //语法错误,原因是在静态方法中只能直接访问静态成员
B(); //正确
// System.out.printlin(age); //语法报错,在静态方法中只能直接访问静态成员
System.out.printlin(count); //正确
}
}
静态代码块
是一个匿名的方法,但是在类加载完成后会自动执行一次,由于匿名只能执行一次语法
public class 类{
static { //静态代码块允许定义多次,所有的静态代码块在类加载完成后都会自动执行
处理逻辑;
}
}
非静态代码块
是一个匿名的方法,但是在构建对象之前会自动执行一次,由于匿名只能执行一次语法
public class 类{
{ //非静态代码块允许定义多次,而且所有的非静态代码块在构造器执行之前都会自动执行
处理逻辑;
}
}
执行:
当类加载完毕后则会自动有限执行static静态属性和static静态代码块,这两个的优先级相同,所以谁在前面定义的,就先执行谁。
public class Static {
public static void main(String[] args) {
new B();
}
}
class A {
static {
System.out.println("A静态代码块");
}
{
System.out.println("A非静态代码块");
}
public A() {
System.out.println("A无参数构造器");
}
}
class B extends A {
static {
System.out.println("B静态代码块");
}
{
System.out.println("B非静态代码块");
}
public B() {
System.out.println("B无参数构造器");
}
}
执行结果:
A2静态代码块
B2静态代码块
A2非静态代码块
A2无参数构造器
B2非静态代码块
B2无参数构造器
new对象时才执行处理非静态属性和非静态代码块,这两个优先级相同,所以谁先定义的,先执行谁,最后才执行构造器,执行构造器时先父后子。