在Java中,我们能否对非静态字段进行静态引用?
Java类包含三种变量:静态(类)变量、实例变量和局部变量。
局部变量 − 这些变量属于并声明/定义在方法/块/构造器内。这些变量的作用域仅限于方法(或块或构造器),并在其执行完毕后被销毁。
实例变量 − 这些变量属于类的实例(对象)。它们在类内但方法外声明。在类实例化时初始化。可以从该类的任何方法、构造器或块中访问它们。
必须使用对象访问实例变量。即,要访问实例变量,需要创建类的对象,并使用此对象访问这些变量。
类/静态变量 − 类/静态变量属于类,与实例变量一样,它们在类内、任何方法之外声明,但使用`static`关键字。
它们在编译时可用,可以在实例化类之前/无需实例化类即可访问它们,在整个类中只有一个静态字段的副本可用,即静态字段的值在所有对象中都相同。可以使用`static`关键字定义静态字段。
对非静态变量的静态引用
如上所述,静态变量使用类名引用(访问)。
System.out.println(MyClass.data);
即,使用静态引用引用变量意味着使用类名引用。
但是,要访问实例变量,必须创建一个对象,这些变量在实例化之前在内存中不可用。
因此,不能在Java中对非静态字段(变量)进行静态引用。如果仍然尝试这样做,则会生成一个编译时错误,提示“无法从静态上下文中引用非静态变量math”。
示例
下面的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
广告