Classes Internas private

15 respostas
I

Olá pessoal, deem uma olhada nesse código, não sei pq ele não compila, sendo que no livro diz que
ele compila

public class MyOuter {
	private class MyInner {
		float f() {
			return 1.2f;
		}

	}

	MyInner getMyInner() {
		return new MyInner();
	}
}

class Y {
	public static void main(String[] args) {
		MyOuter t = new MyOuter();

		System.out.println(t.getMyInner().f());

	}
}

Fala que MyInner não esta visivel, mas eu instanciei num metodo da classe externa dela,
e depois usei esse metodo numa outra classe, isso é permitido, nao to entendendo!!
Alguém saberia dizer??
Obrigado

15 Respostas

alexandref93

IronM:
Olá pessoal, deem uma olhada nesse código, não sei pq ele não compila, sendo que no livro diz que
ele compila

public class MyOuter {
	private class MyInner {
		float f() {
			return 1.2f;
		}

	}

	MyInner getMyInner() {
		return new MyInner();
	}
}

class Y {
	public static void main(String[] args) {
		MyOuter t = new MyOuter();

		System.out.println(t.getMyInner().f());

	}
}

Fala que MyInner não esta visivel, mas eu instanciei num metodo da classe externa dela,
e depois usei esse metodo numa outra classe, isso é permitido, nao to entendendo!!
Alguém saberia dizer??
Obrigado

de que livro vc tirou???

por que uma classe private é altamente inutel, por que ela nunca vai pode ser instânciada, que é o caso que o método getMyInner(); está fazendo!!!

I

entao alexandre, mas olha so isso, remove a chamada ao metodo “f()”, dai funciona, ele
consegue pegar a referencia dessa classe interna. Ficaria assim:

System.out.println(t.getInner());
alexandref93
IronM:
entao alexandre, mas olha so isso, remove a chamada ao metodo "f()", dai funciona, ele consegue pegar a referencia dessa classe interna. Ficaria assim:
System.out.println(t.getInner());

compila, mais dá um erro de execução: Exception in thread "main" java.lang.NoSuchMethodError: main
Java Result: 1
:D

I

oq?? não é possivel, aqui imprimiu a referencia da classe Interna: MyOuter$MyInner@addbf1
ve c ta certo o codigo ai

olha o codigo so pra conferir:

public class MyOuter {
	private class MyInner {
		float f() {
			return 1.2f;
		}

	}

	MyInner getInner() {
		return new MyInner();
	}
}

class Y {
	public static void main(String[] args) {
		MyOuter t = new MyOuter();

		System.out.println(t.getInner()); //sem .f()

	}
}
alexandref93

IronM:
oq?? não é possivel, aqui imprimiu a referencia da classe Interna: MyOuter$MyInner@addbf1
ve c ta certo o codigo ai

olha o codigo so pra conferir:

public class MyOuter {
	private class MyInner {
		float f() {
			return 1.2f;
		}

	}

	MyInner getInner() {
		return new MyInner();
	}
}

class Y {
	public static void main(String[] args) {
		MyOuter t = new MyOuter();

		System.out.println(t.getInner()); //sem .f()

	}
}

fiz igual o seu código, e dá erro de execução normal como o outro!!!

alexandref93

alexandref93:
IronM:
oq?? não é possivel, aqui imprimiu a referencia da classe Interna: MyOuter$MyInner@addbf1
ve c ta certo o codigo ai

olha o codigo so pra conferir:

public class MyOuter {
	private class MyInner {
		float f() {
			return 1.2f;
		}

	}

	MyInner getInner() {
		return new MyInner();
	}
}

class Y {
	public static void main(String[] args) {
		MyOuter t = new MyOuter();

		System.out.println(t.getInner()); //sem .f()

	}
}

fiz igual o seu código, e dá erro de execução normal como o outro!!!

se eu fizer o contrário:

public class MyOuter {


public static void main(String[] args) {
		Y t = new Y();

		System.out.println(t.getInner()); //sem .f()
}

class Y {

	private class MyInner {
		float f() {
			return 1.2f;
		}

	}

	MyInner getInner() {
		return new MyInner();
	}

}

dae funciona como o seu resultado!!!

I

c ta fazendo em que IDE?? bem vc tem q executa a classe Y e nao a classe publica que é MyOuter
Por padrão ela executa a classe publica, ve c é isso, mas de qualquer maneira isso nao resolve o problema
do método f(), que nao ta compilando
Obrigado

alexandref93

IronM:
c ta fazendo em que IDE?? bem vc tem q executa a classe Y e nao a classe publica que é MyOuter
Por padrão ela executa a classe publica, ve c é isso, mas de qualquer maneira isso nao resolve o problema
do método f(), que nao ta compilando
Obrigado

aff, era isso mesmo =x, agora arrumei e funfou!!
mais o seu problema ali de não conseguir acessar o f(); é por que a classe MyInner é private ela não pode ser instânciada, e é isso que o método getInner(); faz, tira o private da class MyInner que vai conseguir!!!
testa ae, depois me diz que deu certo??? blz??? :smiley:

I

entao, so se for assim mesmo. Mas nossa senhora, esse livro ta cheio de erros.

Alexandre, obrigado veio, foi de grande ajuda mesmo.

alexandref93

IronM:
entao, so se for assim mesmo. Mas nossa senhora, esse livro ta cheio de erros.

Alexandre, obrigado veio, foi de grande ajuda mesmo.

dá uma estudada nos modificadores de acesso :smiley:
só por curiosidade, qual livro vc está vendo???

I

aquele “A blibia certificãção java 6”.

alexandref93

:shock: cuida com o livro, sempre testa :lol:

ViniGodoy

Alguns esclarecimentos:

  1. Inner classes privadas não tem nada de inúteis. Elas contribuem para o encapsulamento do sistema, e são acessíveis pelas suas outer classes. Existem bons exemplos de locais onde se deveria usar uma inner class privada, como por exemplo, na implementação de listeners, de nós de uma lista, etc;

Essa não é uma RuntimeException. Como o nome indica, é um Error.

De onde você tirou que inner classes privadas não podem ser instanciadas?

ViniGodoy

O problema que você tem aqui é o seguinte:

A classe MyInner é privada. Portanto, ela só pode ser acessada a partir da classe MyOuter, mas não da classe Y. O método getMyInner tenta retornar um objeto do tipo MyInner, que não será visível em Y, e daí o erro.

Você pode consertar isso fazendo a delegação da chamada a f() na classe myOuter:
class Y {
    public static void main(String[] args) {
        MyOuter t = new MyOuter();
        System.out.println(t.f());
    }
}

public class MyOuter {
    public float getF()
    {
        return getMyInner().f();
    }

    private class MyInner {
            float f() {
                    return 1.2f;
            }

    }

    MyInner getMyInner() {
            return new MyInner();
    }
}

Note que o método getMyInner tem, portanto, um tipo de retorno inconsistente, já que retorna um objeto que não poderá ser visto por mais ninguém. Por isso, seria adequado que esse método também fosse private.

Agora, do contrário do que o alexandre falou, note que a classe MyInner está sim sendo instanciada. E seus métodos podem ser chamados normalmente. Desde que seja no contexto certo.

alexandref93

foi mal vini, acho que vacilei ontem :oops:

Criado 31 de outubro de 2010
Ultima resposta 1 de nov. de 2010
Respostas 15
Participantes 3