O que é importado pelo comando meu_pacote.minhaClasse.*?

10 respostas
ECO2004

Em um comando do tipo:

import xcom.Stuff.*;

O que está sendo importado por ele?

A dúvida surgiu pelo seguinte: não estou realizando um static import e o import acima não gera erro de compilação. Acredito que não esteja importando os elementos não estáticos da classe Stuff, pois eu não poderia usar os seus métodos, por exemplo, sem uma instância da classe.

Vou dar um exemplo para ficar mais claro:

package xcom;

public class Stuff {

	public final int MY_CONSTANT = 5;

	public int doStuff(int x) { 

		return (x++)*x;
	}
}
import xcom.Stuff.*;
import static java.lang.System.out;

class User {
	
	public static void main(String[] args) {

		new User().go();
	}

	void go() { 

		out.println(doStuff(MY_CONSTANT)); 
	}
}

A classe User não compila. Isso era de se esperar. O único modo de fazer User compilar é modificar import xcom.Stuff.*; por import static xcom.Stuff.*; e na classe Stuff, doStuff e a constante sejam ambos estáticos.

Voltando ao programa original e comentado a linha 13 de User, o programa compila. Afinal, o import import xcom.Stuff.*; não estático está fazendo o quê?

10 Respostas

ECO2004

Ninguém, pessoal??

Erick09
Em Java você só pode importar Tipos ou Métodos/Variáveis estáticas, com isso esse comando:
import xcom.Stuff.*;
importaria eventuais subclasses que existissem na Classe Stuff. algo do tipo
package xcom;  
  
public class Stuff {  
  
    public final int MY_CONSTANT = 5;  
  
    public int doStuff(int x) {   
  
        return (x++)*x;  
    }  
    public class MoreStuff {
    	public final int S_CONSTANT = 5; 
    	
    	public int doMoreStuff(int x) {       		  
            return (x++)*x;  
        }
    }
    public class AnotherStuff {
    	public final int S_CONSTANT = 6; 
    	
    	public int doMoreStuff(int x) {       		  
            return (x++)*x;  
        }
    }
}
User
import xcom.Stuff;
import xcom.Stuff.*;//serve como import xcom.Stuff.AnotherStuff e import xcom.Stuff.MoreStuff; ao mesmo tempo
import static java.lang.System.out;  
      
class User {  
          
	public static void main(String[] args) {  
		
		new User().go();  
    }  
      
	void go() {   
		Stuff st = new Stuff();
		MoreStuff ms = st.new MoreStuff();
		out.println(ms.doMoreStuff(ms.S_CONSTANT));
		AnotherStuff as = st.new AnotherStuff();
		out.println(as.doMoreStuff(as.S_CONSTANT));
    }  
}
Veja que eu não preciso importar as duas classes internas separadamente.
A

ECO2004:
Em um comando do tipo:

import xcom.Stuff.*;

O que está sendo importado por ele?

A dúvida surgiu pelo seguinte: não estou realizando um static import e o import acima não gera erro de compilação. Acredito que não esteja importando os elementos não estáticos da classe Stuff, pois eu não poderia usar os seus métodos, por exemplo, sem uma instância da classe.

Vou dar um exemplo para ficar mais claro:

package xcom;

public class Stuff {

	public final int MY_CONSTANT = 5;

	public int doStuff(int x) { 

		return (x++)*x;
	}
}
import xcom.Stuff.*;
import static java.lang.System.out;

class User {
	
	public static void main(String[] args) {

		new User().go();
	}

	void go() { 

		out.println(doStuff(MY_CONSTANT)); 
	}
}

A classe User não compila. Isso era de se esperar. O único modo de fazer User compilar é modificar import xcom.Stuff.*; por import static xcom.Stuff.*; e na classe Stuff, doStuff e a constante sejam ambos estáticos.

Voltando ao programa original e comentado a linha 13 de User, o programa compila. Afinal, o import import xcom.Stuff.*; não estático está fazendo o quê?

Quando você utiliza xcom.Stuff.* , significa que todas as subclasses dentro da Stuff foram importados e podem ser utilizadas.

Porém, quando você utiliza .* você deve passar o caminho completo para utilizar atributos e métodos staticos por exemplo Stuff.doStuff();

acredito que se você modificar essa linha e colocar o doStuff como static vai compilar:

out.println(doStuff(MY_CONSTANT));

para

out.println(Stuff.doStuff(MY_CONSTANT));

Em relação ao static, você mesmo utilizou algo que podemos tirar como exemplo:

import static java.lang.System.out;
out.println(MoreStuff.doMoreStuff(MoreStuff.S_CONSTANT));

quando você utiliza o static você não precisa especificar o caminho todo.
por exemplo tirando:

import static java.lang.System.out;

você teria que especificar o caminho:

System.out.println();

Obs: lembrando que você não precisa especificar o java.lang pois ele é um pacote especial e por padrão ele já é importado, também vale lembrar que todo atributo ou método static, para utiliza-los devem ser especificada a classe.

Espero ter ajudado.

Artur Martini

Ataxexe

Esse import apenas importa as classes declaradas dentro da classe Stuff. Como sua classe não declara nenhuma outra internamente, esse import não serve de nada.

ECO2004

Muito obrigado, pessoal. Isso foi novo para mim!

ECO2004

Para confirma, esse import está importando apenas as classes internas concretas, né? Isso não vale para as classes internas estáticas?

Ataxexe

Vale pra qualquer classe, independente do tipo (claro que respeitando os modificadores de acesso).

ECO2004

Para que eu utilizaria uma classe interna? Tou precisando de uma motivação para o seu uso…

ViniGodoy

Só lembrando que também existe o import static:

import static xcom.Stuff.*;

Isso vai importar também métodos e variáveis estáticas para dentro do código. Por exemplo, se você fizer:

import static java.lang.Math.*;

Será possível usar seus métodos sem se referenciar a classe:

int x = max(a, b);
ECO2004

ViniGodoy:
Só lembrando que também existe o import static:

import static xcom.Stuff.*;

Isso vai importar também métodos e variáveis estáticas para dentro do código. Por exemplo, se você fizer:

import static java.lang.Math.*;

Será possível usar seus métodos sem se referenciar a classe:

int x = max(a, b);

Eu queria saber quando deve usar uma classe interna. Sei usar, mas não quando!

Criado 1 de outubro de 2013
Ultima resposta 3 de out. de 2013
Respostas 10
Participantes 5