【Java编程教程】详解Java 静态关键字
Java中的static关键字主要用于内存管理。我们可以将 static 关键字应用于变量、方法、块和嵌套类。static 关键字属于类而不是类的实例。
静态可以是:
变量(也称为类变量)
方法(也称为类方法)
块
嵌套类
# 1)Java静态变量
如果您将任何变量声明为静态,则它被称为静态变量。
静态变量可以用来引用所有对象的公共属性(不是每个对象唯一的),例如,员工的公司名称,学生的大学名称等。
静态变量在类加载时只在类区获得一次内存。
静态变量的优点
它使您的程序内存高效(即节省内存)。
理解没有静态变量的问题
class Student{
int rollno;
String name;
String college="ITS";
}
假设我的大学有500个学生,现在所有的实例数据成员在每次创建对象时都会获得内存。所有学生都有其唯一的 rollno 和 name,因此实例数据成员在这种情况下很好。在这里,“学院”是指所有对象的共同属性。如果我们让它成为静态的,这个字段将只获得一次内存。
Java 静态属性是所有对象共享的。
静态变量示例
//Java程序演示静态变量的使用
class Student{
int rollno;//实例变量
String name;
static String college ="ITS";//静态变量
//构造函数
Student(int r, String n){
rollno = r;
name = n;
}
//显示值的方法
void display (){System.out.println(rollno+" "+name+" "+college);}
}
//测试类显示对象的值
public class TestStaticVariable1{
public static void main(String args[]){
Student s1 = new Student(111,"小卡");
Student s2 = new Student(222,"小安");
//我们可以通过一行代码改变所有对象的学院
//Student.college="BBDIT";
s1.display();
s2.display();
}
}
输出:
111 小卡 ITS
222 小安 ITS
无静态变量的计数器程序
在这个例子中,我们创建了一个名为 count 的实例变量,它在构造函数中递增。由于实例变量在对象创建时就获得了内存,所以每个对象都会有实例变量的副本。如果它增加,它不会反映其他对象。因此每个对象在 count 变量中的值为 1。
//Java程序演示实例变量的使用
2//每次创建类的对象时都会获取内存。
class Counter{
int count=0;//每次创建实例时都会获取内存
Counter(){
count++;//增值
System.out.println(count);
}
public static void main(String args[]){
//创建对象
Counter c1=new Counter();
Counter c2=new Counter();
Counter c3=new Counter();
}
}
输出:
1
1
1
静态变量计数器程序
正如我们上面提到的,静态变量只会获得一次内存,如果任何对象改变了静态变量的值,它会保留它的值。
//Java程序中静态变量的使用说明
//与所有对象共享。
class Counter2{
static int count=0; //只会获取一次内存并保留它的值
Counter2(){
count++;//增加静态变量的值
System.out.println(count);
}
public static void main(String args[]){
//创建对象
Counter2 c1=new Counter2();
Counter2 c2=new Counter2();
Counter2 c3=new Counter2();
}
}
输出:
1
2
3
# 2)Java静态方法
如果将 static 关键字应用于任何方法,则称为静态方法。
静态方法属于类而不是类的对象。
无需创建类的实例即可调用静态方法。
静态方法可以访问静态数据成员并可以更改它的值。
静态方法示例
//Java 程序演示静态方法的使用。
class Student{
int rollno;
String name;
static String college = "ITS";
//静态方法改变静态变量的值
static void change(){
college = "BBDIT";
}
//构造函数来初始化变量
Student(int r, String n){
rollno = r;
name = n;
}
//显示值的方法
void display(){System.out.println(rollno+" "+name+" "+college);}
}
//测试类创建和显示对象的值
public class TestStaticMethod{
public static void main(String args[]){
Student.change();//调用变化方法
//创建对象
Student s1 = new Student(111,"小卡");
Student s2 = new Student(222,"小安");
Student s3 = new Student(333,"小宋");
//调用显示方法
s1.display();
s2.display();
s3.display();
}
}
输出:
111 小卡 BBDIT
222 小安 BBDIT
333 小宋 BBDIT
执行正常计算的静态方法的另一个示例
//Java程序使用静态方法获取给定数字的立方体
class Calculate{
static int cube(int x){
return x*x*x;
}
public static void main(String args[]){
int result=Calculate.cube(5);
System.out.println(result);
}
}
输出:
125
静态方法的限制
静态方法有两个主要限制。他们是:
静态方法不能使用非静态数据成员或直接调用非静态方法。
this 和 super 不能在静态上下文中使用。
class A{ int a=40;//非静态
public static void main(String args[]){
System.out.println(a);
}
}
输出:
编译时错误
Q) 为什么 Java main 方法是静态的?
Ans) 这是因为对象不需要调用静态方法。如果是非静态方法,JVM会先创建一个对象,然后调用main()方法,会导致额外分配内存的问题。
# 3)Java静态块
用于初始化静态数据成员。
它在类加载时在 main 方法之前执行。
静态块示例
class A2{
static{System.out.println("静态块被调用");}
public static void main(String args[]){
System.out.println("Hello main");
}
}
输出:
静态块被调用
Hello main
Q) 我们可以在没有 main() 方法的情况下执行程序吗?
Ans) 不,其中一种方法是静态块,但直到 JDK 1.6 才有可能。从 JDK 1.7 开始,没有main 方法就无法执行 Java 类。
class A3{
static{
System.out.println("静态块被调用");
System.exit(0);
}
}
输出:
静态块被调用
从 JDK 1.7 及更高版本开始,输出将是:
Error: Main method not found in class A3, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
扫码进群记得备注:城市、昵称和技术方向。