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?
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:
Membros private somente serão acessíveis pela própria classe em que foram declarados :)
L
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?
D
davidbasto
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
giulianocosta
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
Tecno-Java
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
lopima
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)
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
lopima
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
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.
T
Tecno-Java
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
Bruno_Laturner
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
Tecno-Java
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
Bruno_Laturner
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
Tecno-Java
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.