Atributo estático OUT?

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?

O static out, nesse caso, está dentro da classe System, não no seu código. Por isso você faz System.out.println(), não out.println() simplesmente. Veja em http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/cf44386c8fe3/src/share/classes/java/lang/System.java .

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!");
	}
}

Abraço.

2 curtidas

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).

System, jamais precisará ser declarada explicitamente pois pertence ao java.lang.System;
https://docs.oracle.com/javase/7/docs/api/java/lang/System.html

Já o out como você falou pertence ao java.io.PrintStream;
https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#out

Vai chegar a hora de isso não ser mais dúvida! :confounded:

Obrigado.

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 :joy:)…

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

2 curtidas

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.

2 curtidas