写在开头
静态(static)关键字在Java的众多关键字中举足轻重!也是很多大厂面试官特别喜欢问的面试高频知识点,今天我们就一起学习,梳理,重温一下这个关键吧,之所以用重温修饰是因为在过往的文章中早已提到了static,无论是变量中还是方法中甚至于类中,static都是不可或缺的!
我们知道要想调用类中的属性和方法,通常情况下,需要创建一个对象,初始化完成之后,通过对象的引用去访问,而static修饰的方法和变量为类所有,因此,可以直接跳过对象的初始化,主要类被加载了就可以直接通过类名.属性名/方法名进行直接调用!
一、静态变量
【代码示例】
代码语言:javascript复制public class Person {
//成员变量
//在类内部但在方法体外声明的变量称为成员变量,或者实例变量,或者字段。
//之所以称为实例变量,是因为该变量只能通过类的实例(对象)来访问。
int data1 = 3;
//静态变量
//通过 static 关键字声明的变量被称为静态变量(类变量),
//它可以直接被类访问
static int data2 = 4;
public int sum(){
//局部变量
//在方法体内声明的变量被称为局部变量,该变量只能在该方法内使用,
//类中的其他方法并不知道该变量。
int a = 1;
int b = 2;
return a b;
}
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.data1 == person.sum());
System.out.println(Person.data2 == person.sum());
}
}
二、静态方法
【代码示例】
代码语言:javascript复制public class Test {
public static void main(String[] args) {
System.out.println(sub(2,1));
}
//若方法的声明中加上了static关键字,静态方法是属于类的,
//而不是属于类创建的对象或实例的,故在调用时无需通过对象实例。
public static int sub(int a,int b){
return a - b;
}
}
三、静态代码块
虽然静态代码块和main()方法都被static修饰,但静态代码块通常用来初始化一些静态变量,它会优先于 main() 方法执行。来段代码感受一下: 【代码示例】
代码语言:javascript复制public class Test {
public static void main(String[] args) {
System.out.println("main 方法");
}
static {
System.out.println("静态代码块");
}
}
输出:
代码语言:javascript复制静态代码块
main 方法
四、静态内部类
静态嵌套类,并没有对实例的共享关系,仅仅是代码块在外部类内部 静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它 静态嵌套类仅能访问外部类的静态成员和方法 在静态方法中定义的内部类也是静态嵌套类,这时候不能在类前面加static关键字。
【代码示例】
代码语言:javascript复制class OuterFish {
static class InnerFish {
}
}
class TestStaticFish {
public static void main(String[] args) {
//创建静态内部类对象
OuterFish.InnerFish iFish = new OuterFish.InnerFish();
}
}
static在Java中的主要用法就这么多了,那么好,接下来我们就根据它的用法来进行最后的总结
总结
1、static 可以修饰变量、方法、代码块和内部类 static 变量是这个类所有,由该类创建的所有对象共享同一个 static 2、可以通过创建的对象名.属性名 和 类名.属性名两种方式访问 static 变量在内存中只有一份 static 3、修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次 static 修饰的变量可以重新赋值 static 4、方法可以通过对象名.方法名和类名.方法名两种方式来访问 static 方法中不能用 this 和 super 关键字 static 5、方法必须被实现,而不能是抽象的abstract static 方法不能被重写 static 6、代码块在类被第一次加载时执行静态代码块,且只被执行一次,主要作用是实现 static 属性的初始化 static 7、内部类属于整个外部类,而不属于外部类的每个对象,只可以访问外部类的静态变量和方法