Propriedade privada, herda ou não herda?

Opa,

pessoal, membros (atributos e metodos) privados sao herdados ou não? Pode parecer besta essa pergunta, mas olhando o livro da Kath vi q ela fala q nao eh herdado…e ao meu ver, herdar eh uma coisa, ter acesso é outra…

flw

Never!!!

pardal to discutindo isso contigo desde de manha e tu sabe o q acho uhauhaua entao nao herda… um exemplo classico.

“seu pai tem uma cueca que é private, algo pessoal dele, vc nao vai querer herdar uma cueca dele ne? pq é algo pessoal e foi declardo como private.” Agora tu vai querer herdar a casa, o carro etc…
entao aquilo que é pessoal tu declara como private… :smiley:

flw"

Never, mas com umas sacanagens de reflection eu vejo ela… :slight_smile:

Como saoj disse, via reflection dar para ler os atributos privados.

Dessa forma:

[code]public class Aluno {
private String teste = “Feliz Natal”;
}

import java.lang.reflect.Field;

public class AlunoMain extends Aluno {

public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
	AlunoMain alunoMain = new AlunoMain();
	Field fields[] = alunoMain.getClass().getSuperclass().getDeclaredFields();
    for (int i = 0; i < fields.length; i++){  
       fields[i].setAccessible(true); 
       System.out.println("Nome: "+fields[i].getName());
       System.out.println("Valor: "+fields[i].get(alunoMain));
    }
}

}[/code]

[]'s

“Membros marcados como privados não podem ser acessados por código em nenhuma outra classe que não aquela na qual o membro privado foi declarado.”

“Quando um membro é declarado como privado uma subclasse não pode herdar dele.”

Fonte: Certificação Sun para Programador Java? 5.

SCJP Exame 310-055

[quote=pardal_nb]Opa,

pessoal, membros (atributos e metodos) privados sao herdados ou não? Pode parecer besta essa pergunta, mas olhando o livro da Kath vi q ela fala q nao eh herdado…e ao meu ver, herdar eh uma coisa, ter acesso é outra…

[/quote]

Não. São a mesma coisa.
Se algo não é herdado isso significa que não pertence ao escopo do objeto filho. Se não pertence ao escopo não ha como ter acesso. Se ele é private ele não pertence ao escopo do objeto filho, logo não tem acesso.

Reflection não vem ao caso porque o livro da Kathy não se mete por ai.

[quote=crpablo]“Membros marcados como privados não podem ser acessados por código em nenhuma outra classe que não aquela na qual o membro privado foi declarado.”

“Quando um membro é declarado como privado uma subclasse não pode herdar dele.”

Fonte: Certificação Sun para Programador Java? 5.

SCJP Exame 310-055[/quote]

eu ja falei isso para ele, scanei a pag e envei mais ele nao acredita… ohh my god!

Cara, eu não me lembro onde, mas eu já li que os membros private são herdados, porém, não são acessados… só não lembro onde foi que eu li.

Foi mal chegar assim, mas se eu precisasse de um atributo que só as subclasses pudessem acessar, quem eu usaria? Protected ou public? Se eu usar publc ficaria uma variável global :S

foi aki:
http://ctp.di.fct.unl.pt/lei/lp1/teoricas/28.html

???

Mas e qual seria a vantagem de herdar e não acessar?

Continuo com a pergunta feita pela minha pessoa acima.

sabe o q eh HERANÇA ??

me fala o q é ?! :wink:

foi aki:
http://ctp.di.fct.unl.pt/lei/lp1/teoricas/28.html

[/quote]

Ai diz o seguinte :

É bem claro.

Essa é engraçada… herda mas não tem acesso…
a explicação é esta

Eles não seguem a mesma “visão” que as pessoas normais.

Senhores,

  1. herança sempre herda tudo (absolutamente tudo) da classe pai.
  2. herança deve ser usado para “especializar” uma classe, ou seja, ampliar o escopo ou fazer algo para situações particulares.
    Exemplo classico:

[code]public Ponto { public double x,y; }
public Poligono {
private Ponto[] pontos;
public double perimetro() {
double soma =0d;
for( int i=1 ; i<pontos.length()~; i++) {
soma += distancia(pontos[i],pontos[i-1]);
}
}
abstract double area();
public Ponto getPonto(int ponto) {
if(ponto < pontos.length) return pontos[ponto];
return null;
}
public void initPontos(int qtos) {
pontos = new Ponto[qtos];
}
public double distancia(Ponto a, Ponto b) {
return Math.sqrt( (a.x-b.x)(a.x-b.x) +
(a.y-b.y)
(a.y-b.y) );
}
// outros métodos omitidos…
}

public class Quadrado extends Poligono {
public Quadrao() {
initPontos(4);
}
public double area() {
double lado=distancia( getPonto(1), getPonto(0) );
return lado*lado;
}
}[/code]

observe que se o objetos da classe Quadrado não tivesse herdado os atributos e métodos, o seu funcionamento não seria o mesmo.

fw

Guizelini,

Eu também achava que heradava tudo… mas pelo que dizem estou errado.

Sim eu sei o que é HERANÇA!

[quote=dedejava]Guizelini,

Eu também achava que heradava tudo… mas pelo que dizem estou errado.

Sim eu sei o que é HERANÇA![/quote]

Então eu vou mudar a pergunta, você já viu ou alguém conseguiu te demonstrar que uma subclasse não herda todos os recursos (inclusive os privados)?

Tenho algumas propostas para avaliar a implementação do Java com relação a esse ponto:

A primeira:
Crie uma classe base com um tipo int como campo private e atribua a ele um inteiro qualquer.
Veja a quantidade de memória disponível
instancie e armazene em um array list 1000 desses objetos
Veja a quantidade de memória disponível
repita para 10.000 e 100.000.
Você conseguirá ver o quanto de memória esse objeto está ocupando.
Depois crie uma subclasse da primeira classe com mais um único atributo inteiro e faça o mesmo teste.
Qual será o resultado esperado? o dobro do consumo de memória.

A segunda:
Use o profile do netbenas e verifique os objetos.

A terceira:
faça a serialização de uma classe base e de uma subclasse, e armazene em disco.

eu dei uma procurada por cima na especificação da VM do java e não encontrei onde descreve isso, e deveria ser na parte de memória da VM. Mas o comportamento das linguagens como elas são implementadas internamente são muito similares. Lembrei de ter lido isso no manual do Delphi a alguns anos, procurei o manual no google e:

[quote]The internal data format of an object resembles that of a record. The fields of an
object are stored in order of declaration as a contiguous sequences of variables. Any
fields inherited from an ancestor class are stored before the new fields defined in the
descendant class.[/quote]
fonte: Object Pascal Language Guide, 167
link: http://portal.aauj.edu/portal_resources/downloads/programming/delphi_object_pascal_language_guide.pdf

então quem te disse que uma subclasse não herda tudo da superclasse está definitivamente errado.

fw

Vejo que cada um fala uma coisa…

herda TUDO, nao herda PRIVATE…

afinal, HERDA ou NAO HERDA ???
:twisted:

:smiley:

[quote=pardal_nb]Vejo que cada um fala uma coisa…

herda TUDO, nao herda PRIVATE…

afinal, HERDA ou NAO HERDA ???
:twisted:

:smiley: [/quote]

baseado na kathy ex-engenheira da sun, co-desenvolvedora do exame nao herda. e para com essa agonia pardal ja tem dois dias… uauauhauh

Teste muito simples…

class A {
    private int i;
    short s;
}

class B extends A {
	
    void testeDeHeranca() {
        System.out.println(s);
        System.out.println(i); // não compila
        System.out.println(super.i); // não compila
    }
	
}

Como você pode ver, o atributo i não é herdado.
Membros privados de uma classe não são acessíveis por nenhuma outra. NENHUMA. As outras classes não sabem sequer se os membros privados existem.
Dada a afirmação acima, pense nisso: como uma classe pode herdar aquilo que ela nem sabe se existe?

OBS: Por membro, leia atributos e métodos.