查看原文
其他

【Java编程教程】详解Java 静态关键字

点击关注👉 Java面试那些事儿 2023-09-01


Java中的static关键字主要用于内存管理。我们可以将 static 关键字应用于变量、方法、块和嵌套类。static 关键字属于类而不是类的实例。


静态可以是:


  1. 变量(也称为类变量)

  2. 方法(也称为类方法)

  3. 嵌套类


# 1)Java静态变量


如果您将任何变量声明为静态,则它被称为静态变量。


  • 静态变量可以用来引用所有对象的公共属性(不是每个对象唯一的),例如,员工的公司名称,学生的大学名称等。

  • 静态变量在类加载时只在类区获得一次内存。


静态变量的优点


它使您的程序内存高效(即节省内存)。


理解没有静态变量的问题


class Student{ int rollno; String name; String college="ITS"; }


假设我的大学有500个学生,现在所有的实例数据成员在每次创建对象时都会获得内存。所有学生都有其唯一的 rollno 和 name,因此实例数据成员在这种情况下很好。在这里,“学院”是指所有对象的共同属性。如果我们让它成为静态的,这个字段将只获得一次内存。


Java 静态属性是所有对象共享的。


专属福利

👉点击领取:651页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 小卡 ITS222 小安 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(); } }


输出:

111


静态变量计数器程序


正如我们上面提到的,静态变量只会获得一次内存,如果任何对象改变了静态变量的值,它会保留它的值。


//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(); } }


输出:

123


# 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 小卡 BBDIT222 小安 BBDIT333 小宋 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


静态方法的限制


静态方法有两个主要限制。他们是:


  1. 静态方法不能使用非静态数据成员或直接调用非静态方法。

  2. 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



程序员技术交流群


扫码进群记得备注:城市、昵称和技术方向


热门推荐:


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存