📅  最后修改于: 2020-03-29 05:36:59             🧑  作者: Mango
static是Java中的不可访问修饰符,适用于以下情况:
要创建静态成员(块,变量,方法,嵌套类),请在其声明之前添加关键字static。将成员声明为静态成员后,可以在创建其类的任何对象之前对其进行访问,并且无需引用任何对象。例如,在下面的Java程序中,我们无需创建Test类的任何对象即可访问静态方法m1()。
// Java展示无需创建Test类的任何对象即可访问静态方法m1()。
class Test
{
// static方法
static void m1()
{
System.out.println("来自m1");
}
public static void main(String[] args)
{
// 调用m1,无对象
m1();
}
}
输出:
来自m1
静态块Static blocks
如果您需要进行计算以初始化静态变量,则可以声明一个静态块,在首次加载该类时仅执行一次。考虑下面的Java程序,该程序演示了静态块的使用。
// Java展示如何使用静态块Static blocks
class Test
{
// static变量
static int a = 10;
static int b;
// 静态块Static blocks
static {
System.out.println("静态块Static blocks初始化.");
b = a * 4;
}
public static void main(String[] args)
{
System.out.println("来自 main");
System.out.println("a : "+a);
System.out.println("b : "+b);
}
}
输出:
静态块Static blocks初始化.
来自 main
a : 10
b : 40
有关静态块的详细文章,请参见静态块
静态变量
当变量声明为静态变量时,将创建该变量的单个副本并在类级别的所有对象之间共享。静态变量本质上是全局变量。该类的所有实例共享相同的静态变量。
静态变量的重点:
下面的Java程序演示了静态块和静态变量按照它们在程序中的顺序执行。
// Java程序,展示静态块static blocks和静态变量
class Test
{
// static变量
static int a = m1();
// 静态块static blocks
static {
System.out.println("来自静态块static blocks");
}
// static方法
static int m1() {
System.out.println("来自 m1");
return 20;
}
// static method(main !!)
public static void main(String[] args)
{
System.out.println("a : "+a);
System.out.println("来自 main");
}
}
输出:
来自 m1
静态块static blocks
a : 20
来自 main
静态方法
用static关键字声明方法时,称为静态方法。静态方法的最常见示例是main()方法 。如上所述,可以在创建其类的任何对象之前访问任何静态成员,并且无需引用任何对象。声明为static的方法具有以下限制:
以下是演示静态方法限制的Java程序。
// Java演示如何使用静态方法
class Test
{
// static变量
static int a = 10;
// 对象变量
int b = 20;
// static方法
static void m1()
{
a = 20;
System.out.println("来自 m1");
// 不能对非静态b创建一个reference
b = 10; // 编译错误
// 不能对非静态m2创建一个静态引用
m2(); // compilation编译错误
// 在static中,不能用super
System.out.println(super.a); // 编译错误
}
// 实例方法
void m2()
{
System.out.println("来自 m2");
}
public static void main(String[] args)
{
// main方法
}
}
何时使用静态变量和方法
将静态变量用于所有对象共有的属性。例如,在“学生”类中,所有学生都使用相同的大学名称。使用静态方法来更改静态变量。
考虑以下Java程序,该程序说明了将static关键字与变量和方法一起使用。
// Java程序展示静态方法和变量
// Student class
class Student
{
String name;
int rollNo;
// static变量
static String cllgName;
// static变量
static int counter = 0;
public Student(String name)
{
this.name = name;
this.rollNo = setRollNo();
}
// 从静态变量counter中获取唯一的rollNo
static int setRollNo()
{
counter++;
return counter;
}
// static方法
static void setCllg(String name){
cllgName = name ;
}
// 实例方法
void getStudentInfo(){
System.out.println("名字 : " + this.name);
System.out.println("rollNo : " + this.rollNo);
// 访问静态变量
System.out.println("cllgName : " + cllgName);
}
}
// 测试代码
public class StaticDemo
{
public static void main(String[] args)
{
// 调用静态方法,不用初始化对象
Student.setCllg("XYZ");
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
s1.getStudentInfo();
s2.getStudentInfo();
}
}
输出:
名字 : Alice
rollNo : 1
cllgName : XYZ
名字 : Bob
rollNo : 2
cllgName : XYZ
静态嵌套类:我们不能使用静态修饰符声明顶级类,但可以将嵌套类声明为静态。这种类型的类称为嵌套静态类。