Dúvidas sobre membros private

16 respostas
L

Olá, estou com uma dúvida sobre visibilidade de membros de uma classe.
minha dúvida acho que é bem simples de ser explicada, primeiro tenho a classe Vehicle que tem uma variável privada type e dois métodos de acesso públicos.

Em seguida tenho a classe Mini que estende a classe Vehicle, minha dúvida é: se a variável ‘type’ não é herdada pela classe Mini como eu posso ‘setar’ o valor dela?

grato.

public class Vehicle
{
    private String type = "SEDAN";

    public void setType(String type)
    {
        this.type = type;
    }

    public String getType()
    {
        return type;
    }
}
public class Mini extends Vehicle
{    
    public void Syso()
    {
        setType("SUV");
        System.out.println(getType());
    }

    public static void main (String [] args)
    {
        Mini v = new Mini();
        v.Syso();
    }
}

16 Respostas

T

A variável não é acessível, mas ela continua estando presente na implementação da subclasse. É como se fosse o motor do seu carro; a tampa estando fechada, você não vê o motor, mas ele continua existindo e sendo acessível pelo acelerador.

ebortolatto
Olá Através do método público setType(String type) que você herdou da superclasse é possível modificar a variável type. Isso quer dizer que o código a seguir não seria válido:
public class Mini extends Vehicle  
{      
    public void Syso()  
    {  
        type = "SUV";
    }  

    public static void main (String [] args)  
    {  
        Mini v = new Mini();  
        v.Syso();  
    } 
}

Membros private somente serão acessíveis pela própria classe em que foram declarados :)

L

Mas pelo que entendo quando uma variável é marcada como private, ela não é herdada por nenhum subclasse.
nesse eu tenho um método public (que é herdado) que acessa uma variável que não existe, não era pra dar errado?

D

Bem,

Por ser uma variável private, ela não pode ser acessada diretamente. A única forma de fazer isso, é acessá-la através de um método da própria classe.
É isso que você está fazendo na classe Mini, modificando a variável type através do método herdado de Vehicle.
Na verdade, a subclasse não sabe da existência da variável type, e nem sabe como o método setType a modifica.

Acho que é isso. Era essa sua dúvida??

ebortolatto

A variável type existe, e você está certo, ela não é herdada.
O que acontece é que você usa um método público para modificar o valor dela.
A subclasse nem se quer sabe da existência de type na superclasse.

G

Se tu quer deixar ela visível para subclasses tu coloca ela como protected. Tu só coloca private em propriedades que deve ser controladas (SOMENTE) pela entidade que a possui. Se não é este o problema então coloca como protected.

Tipo, digamos que tu queira restringir um valor expecifico para a propriedade. Esta restrição será posta no método setType para que somente a classe que a contem a propriedade tenha controle sobre ela e que isso não fuja da jurisdição dela.

T

lopima:
Mas pelo que entendo quando uma variável é marcada como private, ela não é herdada por nenhum subclasse.
nesse eu tenho um método public (que é herdado) que acessa uma variável que não existe, não era pra dar errado?

A duvida dele esta referente a palavra chave this.

Nao sei lhe responder com convicção mas pelo o que da para perceber, voce nao ‘tem’ os membros e sim uma copia deles. Deve ser mais ou menos isso cara.

Abraços

L

Deixa eu tirar uma dúvida sobre como a classe ‘Mini’ ira ficar?
A classe ‘Mini’ fica dessa maneira certo? (sem a variável e com os métodos de acesso)

public class Mini extends Vehicle  
{  
    public void setType(String type)  
    {  
        this.type = type;  
    }  
  
    public String getType()  
    {  
        return type;  
    }  

    public void Syso()  
    {  
        setType("SUV");  
        System.out.println(getType());  
    }  
  
    public static void main (String [] args)  
    {  
        Mini v = new Mini();  
        v.Syso();  
    }  
}

Então quando eu chamar “this.type = type”, não era pra dar pau?
Pelo que eu entendo a variável existe só na classe pai, e não nas filhas, é como se eu estivesse acessando uma variável que eu não tenho.

desculpe a ignorância xD.

L

ENTENDI!!! mas gostaria que vocês me respondessem a pergunta acima. XD!!

Estou muito agradecido!

malves_info

Tem certeza que “type” esta como private??? poste o código das duas classes…

[]'s

D

Acho que vc está confundindo algumas coisas.

A classe Mini não fica como vc escreveu agora. Ela ficaria como vc escreveu no post inicial.
Os métodos de acesso (set e get), ela herda automaticamente da classe Vehicle. Não é necessário redefinir na class Mini. Ou melhor ainda, vc não pode reescrever esses métodos do jeito que vc escreveu no seu último post. Isso não é possível, pq vc não tem acesso à variavel type diretamente através da classe Mini. Pode acessá-la somente através dos métodos herdados.

Bom, respondendo a sua pergunta: não é possível escrever

this.type = type

na classe Mini, pq ela não pode acessar a variavel type.

Percebeu a idéia? Não sei se consegui ser mto claro.

T

Pessoal, vai no primeiro post dele deste topico e vejam o que ele fez.

Executou normal o aplicativo aqui.

A duvida dele é referente a this, porque ao herdar um metodo public ele vai usar o this.type = type.

este this.type seria referente a uma variavel da subclasse ou da superclasse?

B

Seria referente à um atributo do objeto.

Vocês tem que pensar ó o que acontece no final, quando o objeto é instanciado. Ele é a união de todas as classes que o compõem, numa ordem específica, começando por Object e terminando na sua classe concreta.

T

Seria referente à um atributo do objeto.

Vocês tem que pensar ó o que acontece no final, quando o objeto é instanciado. Ele é a união de todas as classes que o compõem, numa ordem específica, começando por Object e terminando na sua classe concreta.

Entao quer dizer que ao ser usado a palavra chave extends é como se estivesse sendo criado um objeto da superclasse?

B

Seria referente à um atributo do objeto.

Vocês tem que pensar ó o que acontece no final, quando o objeto é instanciado. Ele é a união de todas as classes que o compõem, numa ordem específica, começando por Object e terminando na sua classe concreta.

Entao quer dizer que ao ser usado a palavra chave extends é como se estivesse sendo criado um objeto da superclasse?

Não, está sendo criado um objeto que tem a característica(pública) de todos as classes que o compõem.

Obs:

Esqueci de avisar, o classe nem vai compilar se você tentar acessar um atributo privado da superclasse.

T

davidbasto:
Acho que vc está confundindo algumas coisas.

A classe Mini não fica como vc escreveu agora. Ela ficaria como vc escreveu no post inicial.
Os métodos de acesso (set e get), ela herda automaticamente da classe Vehicle. Não é necessário redefinir na class Mini. Ou melhor ainda, vc não pode reescrever esses métodos do jeito que vc escreveu no seu último post. Isso não é possível, pq vc não tem acesso à variavel type diretamente através da classe Mini. Pode acessá-la somente através dos métodos herdados.

Bom, respondendo a sua pergunta: não é possível escrever

this.type = type

na classe Mini, pq ela não pode acessar a variavel type.

Percebeu a idéia? Não sei se consegui ser mto claro.

Entendi o que voce quiz dizer cara, mas entao quer dizer que é como se tivesse sido criado um tipo de referencia dos membros nao private da superclasse para a subclasse ne?

Porque se fosse mesmo copiado o codigo em si, nao teria como acessar o this.type visto que nao é um atributo da classe concreta.

Criado 17 de julho de 2009
Ultima resposta 18 de jul. de 2009
Respostas 16
Participantes 8