CodeGym /Blogue Java /Random-PT /Escopo Java
John Squirrels
Nível 41
San Francisco

Escopo Java

Publicado no grupo Random-PT
Todos sabemos que os países têm fronteiras e leis próprias. As leis do país operam dentro das fronteiras. Também no país existem, por exemplo, organizações, como escolas ou museus, que têm regras locais próprias. Eles não contradizem as leis do país, mas operam apenas dentro da estrutura da organização especificada. O mesmo ocorre na programação. Portanto, na programação, e principalmente na linguagem Java, existe o termo "escopo". Refere-se a áreas do programa onde certos dados, como variáveis ​​ou métodos, funcionam. Neste artigo, vamos descobrir quais são os escopos das variáveis ​​em Java e como defini-los.

Escopo Java em geral

Por que é necessário separar escopos de variáveis ​​e métodos? O fato é que às vezes os programas são muito grandes e pode ser difícil rastrear uma ou outra variável. Além disso, em grandes projetos, a nomenclatura clara das variáveis ​​é desejável para que fique claro para que servem. O escopo especificamente permite que você tenha diferentes variáveis ​​com o mesmo nome em diferentes partes do programa. Esse código é mais fácil de manter e ler. O escopo Java define onde uma determinada variável ou método é acessível em um programa. Brevemente:
  • Uma variável declarada em um método é visível desde o início da declaração até o final do método (escopo do método).
  • Uma variável declarada em um bloco de código existe até o final desse bloco de código.
  • Variáveis ​​que são argumentos de método existem até o final do método.
  • As variáveis ​​de classe/objeto existem durante o tempo de vida do objeto que as contém. Sua visibilidade é regulada por modificadores de acesso especiais.
  • As variáveis ​​de classe estáticas existem o tempo todo em que o programa está sendo executado. Sua visibilidade também é determinada por modificadores de acesso.

Escopo do nível do método

Qualquer variável declarada em um método, incluindo argumentos, não é acessível fora desse método. Todas as variáveis ​​declaradas dentro dos métodos são visíveis desde o início de sua declaração até o final do método. Aqui está um exemplo de escopo de variável de método:

public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
Aqui temos secondArg , uma variável local ou argumento de método. Não podemos usar esta variável fora do método myMethod ou antes de ser declarada. Se uma variável for um argumento de função, ela ficará visível em todo o corpo desse método. No exemplo acima, temos dois desses argumentos: arg in myMethod e args in main method.

Escopo do nível de classe

Escopo em nível de classe (variáveis ​​de instância) — qualquer variável declarada em uma classe está disponível para todos os métodos dessa classe. Dependendo de seu modificador de acesso (ou seja, público ou privado), às vezes pode ser acessado fora da classe. Portanto, se uma variável é uma variável de classe, ela está vinculada a um objeto específico e existe enquanto houver um objeto dessa classe. Se não houver objeto, não haverá cópia da variável. A variável é visível de todos os métodos da classe, independentemente de serem declarados antes ou depois dela. Cada objeto tem sua própria variável independente de outros objetos. O acesso a uma variável de métodos estáticos não é possível.

Exemplo de código


public class Student {
   
//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
Surname , name , secondName e birthday são variáveis ​​de instância.

Escopo do bloco

Se uma variável é definida/declarada em algum bloco de código, ela existe até o final desse bloco de código. Normalmente, essas variáveis ​​existem entre as chaves em que são definidas. Muitas vezes, o escopo do bloco pode ser uma variável de loop. Uma variável declarada em uma condição de loop for não é acessível fora do loop, a menos que você a tenha definido previamente.

public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }
      
       int sum = 1;
       System.out.println(sum);
   }
}
As variáveis ​​first sum e i são declaradas dentro do loop e não existem fora desse loop. No entanto, a segunda soma foi declarada fora do loop, portanto, essa variável específica será impressa.

variáveis ​​estáticas

Se uma variável for declarada como estática (marcada com a palavra-chave static), ela existirá enquanto sua classe existir. Normalmente, a JVM carrega uma classe na memória no primeiro uso, quando as variáveis ​​estáticas são inicializadas.

import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

 
   public static void main(String[] args) {
       System.out.println(today);
   }

}
Você não deve criar uma nova instância da classe Student para usar a variável estática today . Aqui será impresso “2022”.

Modificadores de acesso

Java tem 4 modificadores de acesso para restringir o acesso ao método ou variável. Você pode usá-los dentro de classes, não dentro de métodos.
  • private é o modificador mais restritivo. Ele restringe o acesso a métodos e variáveis ​​à classe em que foram declarados. Se não houver necessidade de usar determinados métodos ou variáveis ​​fora da classe, use private. As variáveis ​​de classe geralmente são privadas em Java.

  • Se nenhum modificador de acesso for especificado, o método ou variável aceitará o modificador padrão . padrão permite acesso somente do pacote atual.

  • O modificador protegido permite acesso a um método ou variável somente de dentro do pacote atual, a menos que seja acessado por meio de uma classe filha fora do pacote.

  • public é o modificador menos restritivo. Ele permite que você acesse uma classe, método ou variável não apenas da classe em que estão declarados, mas também de fora. Este modificador é usado com muita frequência.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION