Olá, no código abaixo, eu apenas coloquei o this no atributo tamanho porque tem um parâmetro com o mesmo nome que ele, para que o compilador não se confunda. Mas estou na dúvida se coloco nos outros também.
public class Pilha {
private int tamanho;
private Object[] vetor;
private int topo;
public Pilha(int tamanho) {
this.tamanho = tamanho;
vetor = new Object[this.tamanho];
topo = -1;
}
Eu sempre vejo meus professores referenciando todos os atributos da classe, em todos os métodos, com o this, independente se houver ou não uma variável local com mesmo nome que possa fazer o compilador entender errado. Se não há esse tipo de variável, o compilador já não entende que esses atributos são referentes aos da classe sem o uso do this?
Eu quero entender principalmente como funciona o compilador na hora de ler esse código.
Se pra ele fica melhor usar o this mesmo sem nada que possa o confundir ou não.
Caso vocês tenham algum material bom sobre esse tipo de assunto, estou aceitando indicações
O javap é sensacional para analisarmos qual código é mais eficiente.
Peguei o código da classe Pilha que o @kimi postou e fiz justamente isso:
Fonte utilizando o this:
public class Pilha {
private int tamanho;
private Object[] vetor;
private int topo;
public Pilha(int tamanho) {
this.tamanho = tamanho;
vetor = new Object[this.tamanho];
topo = -1;
}
}
Código descompilado:
public class Pilha {
private int tamanho;
private java.lang.Object[] vetor;
private int topo;
public Pilha(int);
Code:
0: aload_0
1: invokespecial #13 // Method java/lang/Object."<init>":()V
4: aload_0
5: iload_1
6: putfield #16 // Field tamanho:I
9: aload_0
10: aload_0
11: getfield #16 // Field tamanho:I
14: anewarray #3 // class java/lang/Object
17: putfield #18 // Field vetor:[Ljava/lang/Object;
20: aload_0
21: iconst_m1
22: putfield #20 // Field topo:I
25: return
LineNumberTable:
line 8: 0
line 9: 4
line 10: 9
line 11: 20
line 12: 25
LocalVariableTable:
Start Length Slot Name Signature
0 26 0 this Lsample/Pilha;
0 26 1 tamanho I
}
Fonte não utilizando o this:
public class Pilha {
private int tamanho;
private Object[] vetor;
private int topo;
public Pilha(int paramTamanho) {
tamanho = paramTamanho;
vetor = new Object[tamanho];
topo = -1;
}
}
Código descompilado:
public class Pilha {
private int tamanho;
private java.lang.Object[] vetor;
private int topo;
public Pilha(int);
Code:
0: aload_0
1: invokespecial #13 // Method java/lang/Object."<init>":()V
4: aload_0
5: iload_1
6: putfield #16 // Field tamanho:I
9: aload_0
10: aload_0
11: getfield #16 // Field tamanho:I
14: anewarray #3 // class java/lang/Object
17: putfield #18 // Field vetor:[Ljava/lang/Object;
20: aload_0
21: iconst_m1
22: putfield #20 // Field topo:I
25: return
LineNumberTable:
line 8: 0
line 9: 4
line 10: 9
line 11: 20
line 12: 25
LocalVariableTable:
Start Length Slot Name Signature
0 26 0 this Lsample/Pilha;
0 26 1 paramTamanho I
}
Observa-se que, neste exemplo, não houve diferença nas instruções geradas no bytecode.