Objeto
Existem dois tipos de tipos em Java: tipos primitivos e tipos de objeto. Primitivos, como int
e boolean
, começam com letras minúsculas; tipos de objeto começam com letras maiúsculas. Essa distinção é útil porque nos lembra de algumas das diferenças entre eles:
Quando você declara uma variável primitiva, você obtém espaço de armazenamento para um valor primitivo. Quando você declara uma variável de objeto, você obtém um espaço para uma referência a um objeto. Para obter espaço para o próprio objeto, você deve usar o operador new
.
Se você não inicializar uma variável primitiva, ela receberá um valor padrão que depende do seu tipo. Por exemplo, 0
para int
s e false
para boolean
s. O valor padrão para tipos de objeto é null
, que indica que nenhum objeto está sendo referenciado pelas variáveis de referência.
Variáveis primitivas são bem isoladas no sentido de que não há nada que você possa fazer em um método que afete uma variável em outro método. Variáveis de objeto podem ser complicadas de trabalhar porque não são tão bem isoladas. Se você passar uma referência a um objeto como argumento, o método que você invoca pode modificar o objeto, caso em que você verá o efeito. Claro, isso pode ser bom, mas você precisa estar ciente disso.
Se passarmos variáveis primitivas para um método (passagem de parâmetro por valor), na verdade, copiamos os valores dos primitivos e usamos as cópias dentro do método. Todas as operações dentro do método funcionam nas cópias; e, fora do método, os valores das variáveis primitivas permanecem inalterados. Mas, se passarmos objetos não primitivos para um método (passagem de parâmetro por referência), passamos as variáveis de referência para o método. Todas as operações realmente usarão e/ou afetarão os objetos originais.
Exemplo:
Escreva o seguinte código no arquivo /home/labex/project/objectTest.java
:
public class objectTest {
public static void main(String[] args){
// use new to create an Array object with two items
int[] numbers = new int[2];
// assign values to the array object
numbers[0] = 1;
numbers[1] = 2;
// create primitive variables in this way
int a = 1 , b = 2;
// create a test object
objectTest test = new objectTest();
test.changeInt(a, b);
System.out.println("Now a is " + a + ", b is " + b);
test.changeArray(numbers);
System.out.println("Now numbers contain:");
for(int i : numbers){
System.out.print(i + "\t");
}
}
// define an object method, change int value
public void changeInt(int a,int b){
a = 2;
b = 3;
System.out.println("In changeInt method, a is " + a + ", b is " + b);
}
// define an object method, change array value
public void changeArray(int[] number){
for(int i = 0;i < number.length;i++){
number[i] = number[i]+1; // change value of array item increasing by 1
}
System.out.println("In changeArray method, numbers contain:");
for(int i : number){
System.out.print(i + "\t");
}
System.out.println();
}
}
Saída:
Execute o arquivo objectTest.java
usando o seguinte comando no terminal:
javac /home/labex/project/objectTest.java
java objectTest
Veja a saída:
In changeInt method, a is 2, b is 3
Now a is 1, b is 2
In changeArray method, numbers contain:
2 3
Now numbers contain:
2 3
Há uma outra diferença entre primitivos e tipos de objeto. Você não pode adicionar novos primitivos ao Java (a menos que você se candidate ao comitê de padrões), mas você pode criar novos tipos de objeto! Veremos como no próximo capítulo.