在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

更新于:2020年7月2日

11K+ 次浏览

启动您的职业生涯

通过完成课程获得认证

开始学习
广告