O OUT é um atributo estático do tipo java.io.PrintStream que representa o fluxo padrão de saída de dados. A minha dúvida é: por que não é preciso declarar o import java.io.PrintStream para utilizá-lo?
Ou seja, eu posso ter o seguinte código compilado sem a declaração import:
public class BemVindo{
public static void main (String[] args){
System.out.println("Bem-vindo!";
}
}
Até onde eu sei, o único pacote que jamais precisará ser importado explicitamente é o java.lang. Já que o atributo OUT não pertence à este pacote, por que ele funciona perfeitamente? Será pela natureza dele ser estático?
Tanto que, se você quiser uma referência no seu código para esse out, precisará fazer o import da classe:
import java.io.PrintStream; // se tirar esse import, dá erro
class BemVindo{
public static void main (String[] args){
PrintStream pi = System.out;
pi.println("Bem-vindo!");
}
}
Entendi… eu acho. Eu sei que vou entender isso mais pra frente à medida que vou estudando, mas fiquei confuso, pois o out pertence a classe PrintStream (java.io) e não a classe System (java.lang).
Não é porque você não declara java.lang.QualquerCoisa que não será importada, são coisas distintas… a diferença é que o compilador faz o import desse pacote para você. ou seja por uma simples questão de comodidade, já que esse pacote é a base para todos os outros vide a classe Object (Odin o pai de todos )…
E na classe System existe um import java.io.*, onde todas as classes desse pacote estarão disponíveis para a classe System utilizar… ou seja, o import aconteceu em algum ponto no código, nem que isso seja feito somente na fase de compilação…
E só pra ficar claro alguns conceitos que vc citou:
O atributo out não pertence a classe PrintStream. Ele é, na verdade, uma instancia de PrintStream. Ao invés de dizer que ele “pertence a”, é mais correto dizer que ele “é um”.
Já a classe System tem um atributo do tipo PrintStream chamado out. Neste caso é correto dizer que out pertence a System.
O import de um tipo só precisa aparecer no código fonte onde o tal tipo foi declarado. Depois deste ponto, a JVM já é capaz de conhecer aquela classe e saber quais métodos e atributos ela possui.