English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Можем ли мы в Java использовать статическую ссылку на нестатическое поле?

В Java класс будет иметь три типа переменных, то есть статические (класс), переменные объекта и локальные переменные.

  • Локальные переменные- Эти переменные принадлежат методу/блоку/конструктору и объявлены/определены в них. Область действия этих переменных находится в методе (или блоке или конструкторе), и они уничтожаются после выполнения.

  • Переменные объекта- Эти переменные принадлежат экземпляру класса (объекту). Они объявлены в классе, но вне методов. Они инициализируются при инстанциации класса. К ним можно обращаться из любого метода, конструктора или блока этого класса.

    Вы должны использовать объект для доступа к переменным объекта. То есть, чтобы получить доступ к переменным объекта, вам нужно создать объект класса, и с помощью этого объекта вы можете обращаться к этим переменным.

  • Класс/статические переменные- Класс/статические переменные принадлежат классу, как и переменные объекта, они объявлены вне методов в классе, но с использованием ключевого слова static.

    Они могут быть доступны на этапе компиляции, и вы можете к ним обращаться до/без инстанциации класса. Всякий раз, когда доступ к статическому полю возможен, доступен только один экземпляр поля класса, то есть значение статического поля одинаково для всех объектов. Вы можете определить статическое поле с помощью ключевого слова static.

Статическая ссылка на нестатическую переменную e

Как указано выше, использование имени класса для ссылки (доступа) к статическим переменным.

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("Введите ваш математический балл:");
      double math = sc.nextDouble();
      System.out.println("Введите ваш научный балл:");
      double science = sc.nextDouble();
      System.out.println("Введите ваш английский балл:");
      double english = sc.nextDouble();
      StudentMarks marks = new StudentMarks(math, science, english);
      boolean bool = wasPromroted(marks);
      if(bool) {
         System.out.println("Поздравляем, вы получили повышение");
      }
         System.out.println("Извините, попробуйте еще раз");
      }
   }
}

Результат вывода

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 ошибок

Решение

Чтобы программа работала корректно, либо необходимо объявить переменные экземпляра статическими, либо использовать объект в методе для их обращения.

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("Введите ваш математический балл:");
      double math = sc.nextDouble();
      System.out.println("Введите ваш научный балл:");
      double science = sc.nextDouble();
      System.out.println("Введите ваш английский балл:");
      double english = sc.nextDouble();
      StudentMarks marks = new StudentMarks(math, science, english);
      boolean bool = wasPromroted(marks);
      if(bool) {
         System.out.println("Поздравляем, вы получили повышение");
      }
         System.out.println("Извините, попробуйте еще раз");
      }
   }
}

Результат вывода

Введите ваш математический балл:
89
Введите ваш научный балл:
85
Введите ваш английский балл:
86
Поздравляем, вы получили повышение
Вам может понравиться