Concurso Petrobras (set 2008) - Dúvida em uma questão!

22 respostas
M

Galera, java bem básico, mas fiquei com dúvida em relação ao gabarito oficial em uma das questões:

46 - Considere o uso da linguagem de programação Java e desconsidere o uso de classes aninhadas (inner class) e de classes
definidas no mesmo arquivo.
Uma variável inteira privada de um objeto obj, que é instância de uma classe cl, pode ser acessada diretamente (sem ser
através de métodos) APENAS por
(A) objeto obj
(B) objetos que são instâncias da classe cl, incluindo as que são instâncias de subclasses da classe cl
© objetos que são instâncias da classe cl, mas que não são instâncias de subclasses da classe cl
(D) objetos que herdam da classe cl
(E) objetos que herdam do objeto obj

Qual vocês acham que é a correta, e pq? O gabarito oficial é [[color=white]C[/color]]

22 Respostas

Mauricio_Linhares

(A) e © são a mesma coisa, mas assumindo que quem fez essa questão não sabia o que estava dizendo, deve ser letra (A).

Edit:

Oh Shit :wink:

wagnerfrancisco

Pra mim A e C não são a mesma coisa. E eu responderia A. :shock:

Pelo que eu entendi, em A eu só posso acessar o atributo do objeto obj. Na C parece que eu poderia acessar o atributo de outros objetos que são instâncias da mesma classe (obj1, obj2, desde que todos sejam do “tipo” cl).

M

Então galera! Respondi A.

A e C não são a mesma coisa não. Para mim, a C está dizendo que um outro objeto obj2, instancia de também c1, pode acessar uma variavel privada de obj. Isso não é verdade, concordam?

O gabarito oficial é C! Não concordo!

Ainda dá para entrar com recurso… Vou procurar saber sobre isso, o que acham?

S
A pergunta está muito mau formulada. Mas imagino que o caso seria o abaixo:
public class Test {

	private String atributo;

	public void copiaAtributo(Test obj2) {
		//acessando o atributo private de obj2
		obj2.atributo = this.atributo;
	}

	public Test(String valor) {
		atributo = valor;
	}

}

public class Main {
	public static void main(String[] args) {
		Test obj1 = new Test("obj1");
		Test obj2 = new Test("obj2");
		
		obj2.copiaAtributo(obj2);
	}
}
M
Ssalgado:
A pergunta está muito mau formulada. Mas imagino que o caso seria o abaixo:
public class Test {

	private String atributo;

	public void copiaAtributo(Test obj2) {
		//acessando o atributo private de obj2
		obj2.atributo = this.atributo;
	}

	public Test(String valor) {
		atributo = valor;
	}

}

public class Main {
	public static void main(String[] args) {
		Test obj1 = new Test("obj1");
		Test obj2 = new Test("obj2");
		
		obj2.copiaAtributo(obj2);
	}
}

Não acredito ser o caso não, pois a questão é explicita em informar que o acesso não deve ser feito por métodos! Por métodos públicos, qualquer um poderia ter acesso à variável!

S

Verdade.

É difícil ficar adivinhando o que o cara quis dizer.

victorwss

O gabarito está correto e a questão está corretamente elaborada. É verdade que o texto é um tanto confuso (e acredito que isso seja proposital), mas não há nada de errado na questão que possa anulá-la ou mudar o gabarito.

Mauricio_Linhares

mmmauro:
Então galera! Respondi A.

A e C não são a mesma coisa não. Para mim, a C está dizendo que um outro objeto obj2, instancia de também c1, pode acessar uma variavel privada de obj. Isso não é verdade, concordam?

O gabarito oficial é C! Não concordo!

Ainda dá para entrar com recurso… Vou procurar saber sobre isso, o que acham?

Não, não é isso que ele está dizendo. Ele está dizendo que um objeto qualquer que seja instância da classe “cl” pode acessar uma variável privada de si mesmo, o que é correto, que é exatamente o que “obj” é, uma instância da classe “cl” e que, portanto, pode acessar uma variável privada de si mesmo.

Veja o enunciado:

“…objeto obj, que é instância de uma classe cl…”

E veja a letra ©:

“objetos que são instâncias da classe cl, mas que não são instâncias de subclasses da classe cl”

“obj” é uma instância da classe “cl” e ao mesmo tempo ele não é uma instância de uma subclasse de “cl”, então a letra (A) também estaria correta.

bsl.lacerda

Essa eu acertei mas não fui muito bem na prova não.

victorwss

Mauricio Linhares:
mmmauro:
Então galera! Respondi A.

A e C não são a mesma coisa não. Para mim, a C está dizendo que um outro objeto obj2, instancia de também c1, pode acessar uma variavel privada de obj. Isso não é verdade, concordam?

O gabarito oficial é C! Não concordo!

Ainda dá para entrar com recurso… Vou procurar saber sobre isso, o que acham?

Não, não é isso que ele está dizendo. Ele está dizendo que um objeto qualquer que seja instância da classe “cl” pode acessar uma variável privada de si mesmo, o que é correto, que é exatamente o que “obj” é, uma instância da classe “cl” e que, portanto, pode acessar uma variável privada de si mesmo.

Veja o enunciado:

“…objeto obj, que é instância de uma classe cl…”

E veja a letra ©:

“objetos que são instâncias da classe cl, mas que não são instâncias de subclasses da classe cl”

“obj” é uma instância da classe “cl” e ao mesmo tempo ele não é uma instância de uma subclasse de “cl”, então a letra (A) também estaria correta.

A letra A é falsa por causa do APENAS em letras maiúsculas do enunciado. Um outro objeto da classe cl poderia acessar os atributos de obj também.

M

victorwss:

A letra A é falsa por causa do APENAS em letras maiúsculas do enunciado. Um outro objeto da classe cl poderia acessar os atributos de obj também.

victorwss, outros objetos (digamos obj2, obj3, etc), mesmo sendo instância de cl, não conseguiriam acessar variáveis privadas de obj. É “cada um no seu quadrado” :smiley:

Cada um acessaria seus próprios atributo private, concorda? A questão aqui é que o gabarito deve considerar que os atributos são os mesmos, mas sabemos que em tempo de execução um atributo x de obj2 não tem nada a ver com outro atributo x de obj. Para o gabarito, obj.x == obj2.x

Pelo menos é o que eu estou entendendo… No mínimo a questão não é muito clara, concordam? Esse tipo de questão NÃO SERVE PARA P*$$@ NENHUMA!!

J

você pode em um método de obj (classe ClasseTeste) fazer:

public void copiaAtributo(ClasseTeste outroObj) { this.atributo = outroObj.atributo; }

então você pode em uma instancia da classe acessar atributos privados de outras instancias (da mesma classe)

M

jukkinha:
você pode em um método de obj (classe ClasseTeste) fazer:

public void copiaAtributo(ClasseTeste outroObj) { this.atributo = outroObj.atributo; }

então você pode em uma instancia da classe acessar atributos privados de outras instancias (da mesma classe)

A questão é explícita em dizer que a variável privada “pode ser acessada diretamente (sem ser
através de métodos)”…

J

outroObj.atributo é um método?

obs: errei essa questão também :stuck_out_tongue:

M

jukkinha:
outroObj.atributo é um método?

obs: errei essa questão também :P

copiaAtributo(…) é que é um método… :?

victorwss
public class X {
    private int atributo;

    public void fazQualquerCoisa(X outroX) {
        outroX.atributo = 5; // Compila, logo a alternativa A é falsa.
    }
}
M
victorwss:
public class X {
    private int atributo;

    public void fazQualquerCoisa(X outroX) {
        outroX.atributo = 5; // Compila, logo a alternativa A é falsa.
    }
}

Faz sentido. Feio, mas faz sentido. :shock:

Valeu aí!

ViniGodoy

Questão mal formulada.
Mas respondendo ao Jukkinha, pode sim, e é muito comum se fazer isso, especialmente no método equals.

Faltou também dizer que um método estático da classe também pode acessar os membros privados dos seus próprios objetos.

No fundo, no fundo, as regras de visibilidade são entre classes, não entre instâncias. O que torna a questão ainda mais mal formulada.

victorwss

Questão mal formulada.
Mas respondendo ao Jukkinha, pode sim, e é muito comum se fazer isso, especialmente no método equals.

Faltou também dizer que um método estático da classe também pode acessar os membros privados dos seus próprios objetos.

No fundo, no fundo, as regras de visibilidade são entre classes, não entre instâncias. O que torna a questão ainda mais mal formulada.

No método clone() isto também é comum.

Mas, Vini, você acha que a questão, do jeito que está é passível de anulação ou de alteração de gabarito? Não vejo como isso poderia ocorrer.

ViniGodoy

Não, acho que não.
Mas que pode gerar muita discussão (como essa) isso pode.

S

ViniGodoy:

Questão mal formulada.
Mas respondendo ao Jukkinha, pode sim, e é muito comum se fazer isso, especialmente no método equals.

Eu acho isso horrível. Estranhei quando vi pela primeira vez… não achava que fosse possível.
Isso já me causou problemas com o Hibernate. O atributo id sempre vinha null no proxy, sendo que a entidade tinha o atributo preenchido. Tive que trocar por getId().

victorwss

Schuenemann:
ViniGodoy:

Questão mal formulada.
Mas respondendo ao Jukkinha, pode sim, e é muito comum se fazer isso, especialmente no método equals.

Eu acho isso horrível. Estranhei quando vi pela primeira vez… não achava que fosse possível.
Isso já me causou problemas com o Hibernate. O atributo id sempre vinha null no proxy, sendo que a entidade tinha o atributo preenchido. Tive que trocar por getId().

Na prova da SCJP também é comum acessar-se os atributos dessa forma. :wink:

Criado 29 de setembro de 2008
Ultima resposta 2 de out. de 2008
Respostas 22
Participantes 9