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

Podemos fazer referência estática a campos não estáticos em Java?

As classes no Java terão três tipos de variáveis, ou seja, estáticas (classe), instância e locais.

  • Variáveis locais-Essas variáveis pertencem ao método/Bloco/Construtor e declaração dentro/Definição. O escopo dessas variáveis está dentro do método (ou bloco ou construtor), e será destruído após a execução.

  • Variáveis de instância-Essas variáveis pertencem ao instância da classe (objeto). Eles são declarados dentro da classe, mas fora de qualquer método. Eles são inicializados quando a classe é instanciada. Eles podem ser acessados a partir de qualquer método, construtor ou bloco específico da classe.

    Você deve usar o objeto para acessar variáveis de instância. Ou seja, para acessar variáveis de instância, você precisa criar o objeto da classe e usar o objeto, você precisa acessar essas variáveis.

  • Classe/Variáveis estáticas-Classe/Variáveis estáticas pertencem à classe, como variáveis de instância, são declaradas fora de qualquer método dentro da classe, mas declaradas usando a palavra-chave static.

    Elas podem ser acessadas em tempo de compilação, você pode acessá-las antes/Acessar sem instanciar a classe, há apenas uma cópia do campo estático disponível em todo o classe, ou seja, o valor do campo estático é o mesmo em todos os objetos. Você pode usar a palavra-chave static para definir um campo estático.

Referência estática a variável não estática e

Como mencionado acima, usar referência de nome de classe (acesso) a variáveis estáticas.

System.out.println(MyClass.data);

Isso significa que fazer referência a uma variável usando referência estática é usar o nome da classe.

Mas, para acessar variáveis de instância, é necessário criar um objeto, que antes da instância, não está disponível na memória.

Portanto, você não pode fazer referência estática a um campo não estático (variável) em Java. Se ainda assim, tente fazer isso, gerando um erro de compilação que indica “Impossível referenciar variável não estática matemática a partir de contexto estático”.

Exemplo

Seguindo o programa Java, aceita as marcas do usuário e determina se ele foi promovido.

Aqui, a partir do método estático wasPromroted(), acessamos diretamente as variáveis de instância (apenas especificando seu nome, como em variáveis estáticas). Isso não é permitido e resulta em um erro de compilação.

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("Insira sua pontuação em matemática: ");
      double math = sc.nextDouble();
      System.out.println("Insira sua pontuação em ciências: ");
      double science = sc.nextDouble();
      System.out.println("Insira sua pontuação em inglês: ");
      double english = sc.nextDouble();
      StudentMarks marks = new StudentMarks(math, science, english);
      boolean bool = wasPromroted(marks);
      if(bool) {
         System.out.println("Parabéns, você foi promovido");
      } else {
         System.out.println("Desculpe, tente novamente");
      }
   }
}

Resultados de saída

StudentMarks.java:16: erro: não-variável estática math não pode ser referenciada a partir de um contexto estático
   if(math >=85 && science >=75 && english >=65)
^
StudentMarks.java:16: erro: não-variável estática science não pode ser referenciada a partir de um contexto estático
   if(math >=85 && science >=75 && english >=65)
^
StudentMarks.java:16: erro: não-variável estática english não pode ser referenciada a partir de um contexto estático
   if(math >=85 && science >=75 && english >=65)
^
3 erros

Para que o programa funcione corretamente, ou é necessário declarar as variáveis de instância como estáticas, ou deve-se usar o objeto no método.

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("Insira sua pontuação em matemática: ");
      double math = sc.nextDouble();
      System.out.println("Insira sua pontuação em ciências: ");
      double science = sc.nextDouble();
      System.out.println("Insira sua pontuação em inglês: ");
      double english = sc.nextDouble();
      StudentMarks marks = new StudentMarks(math, science, english);
      boolean bool = wasPromroted(marks);
      if(bool) {
         System.out.println("Parabéns, você foi promovido");
      } else {
         System.out.println("Desculpe, tente novamente");
      }
   }
}

Resultados de saída

Insira sua pontuação em matemática:
89
Insira sua pontuação em ciências:
85
Insira sua pontuação em inglês:
86
Parabéns, você foi promovido
Você também pode gostar