我们可以在 Java 中对非静态字段进行静态引用吗?
Java 中的类有三种变量,即静态(类)、实例和本地变量。
本地变量 − 这些变量属于方法/块/构造函数并在其中声明/定义。这些变量的范围位于方法(或块或构造函数)内,并在执行后被销毁。
实例变量 − 这些变量属于类的实例(对象)。它们在类内但在方法之外声明。它们在类实例化时初始化。它们可以从该特定类的任何方法、构造函数或块访问。
您必须使用对象访问实例变量。即,要访问实例变量,您需要创建该类的一个对象,然后使用此对象访问这些变量。
类/静态变量 − 类/静态变量属于一个类,就像实例变量一样,它们在类内声明,在任何方法之外,但是使用 static 关键字。
它们可以在编译时访问,您可以在实例化类之前/不实例化类的情况下访问它们,整个类中只有一个静态字段的副本可用,即静态字段的值在所有对象中都是相同的。您可以使用 static 关键字定义静态字段。
对非静态变量的静态引用
如上所述,使用类名引用(访问)静态变量。
System.out.println(MyClass.data);
即使用静态引用引用变量意味着使用类名进行引用。
但是,要访问实例变量,必须创建一个对象,这些对象在实例化之前在内存中不可用。
因此,您不能在 Java 中对非静态字段(变量)进行静态引用。如果您仍然尝试这样做,则会产生编译时错误,提示"非静态变量数学不能从静态上下文中引用"。
示例
以下 Java 程序接受用户的标记并决定他是否得到提升。
在这里,我们从静态方法 wasPromroted() 直接访问实例变量(只需指定它们的名称,就像我们对静态变量所做的那样)。由于不允许这样做,这将产生编译时错误。
import java.util.Scanner; public class StudentMarks { Scanner scan1 = new Scanner(System.in); private double math; private double science; private double english; public StudentMarks(double math, double science, double english) { this.math = math; this.science = science; this.english = english; } public static boolean wasPromroted(StudentMarks marks) { if(math>=85 && science>=75 && english>=65) { return true; } return false; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("Enter your math score: "); double math = sc.nextDouble(); System.out.println("Enter your science score: "); double science = sc.nextDouble(); System.out.println("Enter your english score: "); double english = sc.nextDouble(); StudentMarks marks = new StudentMarks(math, science, english); boolean bool = wasPromroted(marks); if(bool) { System.out.println("Congratulations you've got promoted"); } else { System.out.println("Sorry try again"); } } }
输出
StudentMarks.java:16: error: non-static variable math cannot be referenced from a static context if(math>=85 && science>=75 && english>=65) ^ StudentMarks.java:16: error: non-static variable science cannot be referenced from a static context if(math>=85 && science>=75 && english>=65) ^ StudentMarks.java:16: error: non-static variable english cannot be referenced from a static context if(math>=85 && science>=75 && english>=65) ^ 3 errors
解决方案
要使该程序正常运行,我们要么需要将实例变量声明为静态,要么应该在方法中使用对象引用它们。
import java.util.Scanner; public class StudentMarks { Scanner scan1 = new Scanner(System.in); private double math; private double science; private double english; public StudentMarks(double math, double science, double english) { this.math = math; this.science = science; this.english = english; } public static boolean wasPromroted(StudentMarks marks) { if(marks.math>=85 && marks.science>=75 && marks.english>=65) return true; return false; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("Enter your math score: "); double math = sc.nextDouble(); System.out.println("Enter your science score: "); double science = sc.nextDouble(); System.out.println("Enter your english score: "); double english = sc.nextDouble(); StudentMarks marks = new StudentMarks(math, science, english); boolean bool = wasPromroted(marks); if(bool) { System.out.println("Congratulations you've got promoted"); } else { System.out.println("Sorry try again"); } } }
输出
Enter your math score: 89 Enter your science score: 85 Enter your english score: 86 Congratulations you've got promoted