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.
GO TO FULL VERSION