Dúvida com modificadores

18 respostas
F

Amigos, estou com uma dúvida que consta no seguinte.
Tenho duas classes, Car e Oficina que segue a seguir.

Classe Car
package carros;

class Car{

String getNome(){
return "Fusca";
}

}
Classe Oficina
package carros;

class Oficina extends Car {

public static void main(String args[]){
Oficina o = new Oficina();
System.out.println(o.getNome());
}

}

Até aqui sem novidades, roda legalzinho. Porém quando tiramos o método main, ficando dessa forma:

package carros;

class Oficina extends Car {

//public static void main(String args[]){
Oficina o = new Oficina();
System.out.println(o.getNome());
//}

}

dá erro na compilação do mesmo. Gostaria que alguém me explicasse o conceito aplicado nessa situação ou se é meu super Jcreator que está bugado ?

Desde já agradeço.

18 Respostas

S

cara tira esse tira o System.out.println() ou coloca em um metodo…

gerdec

cara e o seguinte toda aplicação java começa pelo metódo MAIN se vc tirar o metodo MAIN aplicação não ira funcionar ou seja o java entende que se vc quiser executar algo ele deve ser especificado no metodo MAIN espero ter ajudado

F
soudaniel_01:
cara tira esse tira o System.out.println() ou coloca em um metodo...

Realmente dentro de um método a coisa funciona direitinho, mas do outro jeito que você disse,
fora do System.out.println() ele continua dando erro.

package carros;

class Oficina extends Car {

Oficina o = new Oficina();

void imprimir(){
o.getNome();
}

o.getNome(); //ERRO

}

Erro: I:\Apostilas_Java\Exercícios\Exercício_16\Oficina.java:11: expected
o.getNome(); //ERRO
^
1 error

EugenioMonteiro

Isso não existe (pelo menos até onde eu sei). Você quer chamar um metodo de uma classe ‘x’ em uma classe ‘y’ fora de um método da classe ‘y’.
A chamada de um método não pode ser feita de forma ‘solta’ no corpo de uma classe.

F
gerdec:
cara e o seguinte toda aplicação java começa pelo metódo MAIN se vc tirar o metodo MAIN aplicação não ira funcionar ou seja o java entende que se vc quiser executar algo ele deve ser especificado no metodo MAIN espero ter ajudado

Um certo kra, entendo essa parte do main. Minha classe com o método main seria outra.
Mais blz kra, acho que saquei, mas não para por aih, tenho outra dúvida que é o seguinte.,

Classe Carros
package carros;

public class Car{

protected  String getColor(){
return "Yellow";
}

}
Classe Oficina
package Oficina;
import carros.Car;

class Oficina extends Car {

void teste(){
Car c = new Car();
c.getColor();
}

}

Porém ao compilar me retorna o seguinte,

Erro: getColor() has protected access in carros.Car

A situação se dá no seguinte então. Temos duas classes uma em cada pacote, chamaremos elas de classe A e B.

Classe B(Oficina) herda de classe A(Car)
Em classe A(Car), há um método protected, que permite que classes filhas mesmo em outro pacotes tenham acesso certo ?
Porém ao compilar me retorna o erro citado acima. Qual seria o problema nesse caso ?

F

EugenioMonteiro:
Isso não existe (pelo menos até onde eu sei). Você quer chamar um metodo de uma classe ‘x’ em uma classe ‘y’ fora de um método da classe ‘y’.
A chamada de um método não pode ser feita de forma ‘solta’ no corpo de uma classe.

Hummm certo, era isso que queria saber. Não se pode fazer chamadas ‘soltas’ no corpo da classe. Brigadão!

vanzella
fenemeth:
gerdec:
cara e o seguinte toda aplicação java começa pelo metódo MAIN se vc tirar o metodo MAIN aplicação não ira funcionar ou seja o java entende que se vc quiser executar algo ele deve ser especificado no metodo MAIN espero ter ajudado

Um certo kra, entendo essa parte do main. Minha classe com o método main seria outra.
Mais blz kra, acho que saquei, mas não para por aih, tenho outra dúvida que é o seguinte.,

Classe Carros
package carros;

public class Car{

protected  String getColor(){
return "Yellow";
}

}
Classe Oficina
package Oficina;
import carros.Car;

class Oficina extends Car {

void teste(){
Car c = new Car();
c.getColor();
}

}

Porém ao compilar me retorna o seguinte,

Erro: getColor() has protected access in carros.Car

A situação se dá no seguinte então. Temos duas classes uma em cada pacote, chamaremos elas de classe A e B.

Classe B(Oficina) herda de classe A(Car)
Em classe A(Car), há um método protected, que permite que classes filhas mesmo em outro pacotes tenham acesso certo ?
Porém ao compilar me retorna o erro citado acima. Qual seria o problema nesse caso ?

vixi você ta trocando as bolas todas, protected só é visivel atraves de herança, você utilizou uma instancia da classe, não vai ser visivel mesmo.

F

Cara não tenho certeza, mas acho que do jeito que vc ta falando só daria certo se o método fosse static, tipo assim:

package carros;   
  
public class Car{   
  
protected static  String getColor(){   
return "Yellow";   
}   
  
}

então eu poderia usar na minha outra classe uma referência direta, sem instancia, ficaria assim:

package Oficina;   
import carros.Car;   
  
class Oficina extends Car {   
  
void teste(){   
System.out.println(getColor() );
}   
  
}

Dá uma olhada nesse outro esquema que fiz aqui

Classe Car
package carros;

public class Car{
protected int a;

protected  void setA(int b){
	a = b;
}

}

Tanto variável como método são protected. Agora a

Classe Oficina

package oficina;
import carros.Car;

public class Oficina extends Car{

void Teste(){
	Oficina of = new Oficina();
	of.setA(5);
	System.out.print(a);
}

}

A classe oficina esta em um outro pacote, porém herda a classe Car. Na classe oficina tenho um método teste. Dentro dele crio um objeto da própria classe e faço acesso com sucesso ao método quanto a variável da classe Car. Porém na

Classe Conserto
package conserto;
import oficina.Oficina;

public class Conserto {

public static void main(String args[]){
	
Oficina ofici = new Oficina();
ofici.setA(6); // Erro, setA(int) has protected access in carros.Car

} 
    
}

ocorre erro. Tenho as seguintes dúvidas:

para um objeto ter acesso a membros protected de classes herdada, ele precisa ser criado dentro da classe em que é definido, ou ele pode ser criado em outras classes, como no exemplo a classe Conserto cria o objeto tipo Oficina que herda de Car,

Resumindo minha dúvida (parece que não me expressei bem): O objeto Oficina para poder ter acesso aos membros protected da superclasse só pode ser criado dentro da clase Oficina ? Ou ele pode ser criado em outra classe como em conserto ?

vanzella

Velho, da uma olhada
http://www.javafree.org/javabb/viewtopic.jbb?t=6941

rmala_ti

Amigo,
pelo pouco que sei sobre modificadores protected, é o seguinte.
Um membro(método ou variável) marcado como protect só pode ser visto de fora da classe onde foi declarado, através de herança (Considerando que as classe estão em pacotes diferentes).
Subclasses da subclasse que herdou esse membro, tem acesso ao membro herdado também através de herança.
Para classes que não estão no mesmo pacote e que não herdam a superclasse, o membro tem acesso private.
Espero ter ajudado.
Abraço.

T

Sei que não é o melhor a se dizer aqui, mas que diabos vc quer com uma OFICINA que é UM CARRO??? rs

obs: desculpem, mas essa eu não poderia deixar de perguntar… hehehe

adriano_si

Sei que não é o melhor a se dizer aqui, mas que diabos vc quer com uma OFICINA que é UM CARRO??? rs

obs: desculpem, mas essa eu não poderia deixar de perguntar… hehehe

Fazer um Carro Oficina, seria até interessante, seu carro quebraria no meio da estrada e de repente passaria um Carro Oficina, aí era só chamar e tentar resolver a bronca… hauahuaauauah

Quanto à dúvida do amigo tbm fiquei na dúvida em relação à isso, mas acho que vc está querendo chamar um método Protegido (menos restritivo) de um com acesso Default (mais restritivo)… aff sei lá… acho que deveria dá certo… vou dá uma estudada e depois posto aqui…

Falows :wink:

F

Tecnoage:
Sei que não é o melhor a se dizer aqui, mas que diabos vc quer com uma OFICINA que é UM CARRO??? rs

obs: desculpem, mas essa eu não poderia deixar de perguntar… hehehe

HAHHAHA só pra exemplificar neh kra…É o mesmo exemplo usado no tuto de modificadores, em certificação.

C
fenemeth:
gerdec:
cara e o seguinte toda aplicação java começa pelo metódo MAIN se vc tirar o metodo MAIN aplicação não ira funcionar ou seja o java entende que se vc quiser executar algo ele deve ser especificado no metodo MAIN espero ter ajudado

Um certo kra, entendo essa parte do main. Minha classe com o método main seria outra.
Mais blz kra, acho que saquei, mas não para por aih, tenho outra dúvida que é o seguinte.,

Classe Carros
package carros;

public class Car{

protected  String getColor(){
return "Yellow";
}

}
Classe Oficina
package Oficina;
import carros.Car;

class Oficina extends Car {

void teste(){
Car c = new Car();
c.getColor();
}

}

Porém ao compilar me retorna o seguinte,

Erro: getColor() has protected access in carros.Car

A situação se dá no seguinte então. Temos duas classes uma em cada pacote, chamaremos elas de classe A e B.

Classe B(Oficina) herda de classe A(Car)
Em classe A(Car), há um método protected, que permite que classes filhas mesmo em outro pacotes tenham acesso certo ?
Porém ao compilar me retorna o erro citado acima. Qual seria o problema nesse caso ?

Assim:

Na tua classe Oficina você está criando um objeto da classe Car e chamando c.getColor(). Isso tá errado porque getColor() é protected. Você somente conseguiria chamar getColor() através de uma instância se e somente se as classes Oficina e Car estivessem no mesmo pacote.

Para o teu código funcionar faça uso da herança... você já declarou extends Car, agora chama direto o getColor().

package Oficina;
import carros.Car;

class Oficina extends Car {

void teste(){
   //aqui voce esta chamando o método herdado de Car
   getColor();
}

}

e isso só funcionaria se Car e Oficina estivessem no mesmo Pacote

package Oficina;

class Oficina extends Car {

void teste(){
Car c = new Car();
c.getColor();
}

}

espero ter ajudado,

F

Humm vejamos.

Então a situação fica na seguinte:

Tenho classe A e B.

A no pacote PA, sendo todos métodos e variáveis com modif. protected.
B no pacote PB

B herda de A. Então todas as variáveis e métodos de A são acessíveis à B sem instanciação. Deixo supor o seguinte código para ver se entendi mesmo. Me corrijam se estiver errado.

Classe A
package pacoteA;

class A{
protected int a = 1;

protected void setA(int a){
this.a = a; 
}

}
Classe B
package pacoteB;
import pacoteA.A;

class B extends A{

void testeB(){
setA(6); //Aqui não teria problemas..
a = 5;   // Nem aqui..
 }

}
Classe C
package pacoteB;

class C{

void teste(){
B objB = new B();
objB.setA(5); //Aqui daria o erro.
objB.a = 6;   //Tbm não seria possível
}
}

Creio que seja isso, a classe C não consegue o acesso com a instancia da classe B certo ?
Falows

fabim
fenemeth:
Amigos, estou com uma dúvida que consta no seguinte. Tenho duas classes, Car e Oficina que segue a seguir. Classe Car
package carros;

class Car{

String getNome(){
return "Fusca";
}

}
Classe Oficina
package carros;

class Oficina extends Car {

public static void main(String args[]){
Oficina o = new Oficina();
System.out.println(o.getNome());
}

}

Até aqui sem novidades, roda legalzinho. Porém quando tiramos o método main, ficando dessa forma:

package carros;

class Oficina extends Car {

//public static void main(String args[]){
Oficina o = new Oficina();
System.out.println(o.getNome());
//}

}

dá erro na compilação do mesmo. Gostaria que alguém me explicasse o conceito aplicado nessa situação ou se é meu super Jcreator que está bugado ?

Desde já agradeço.

Respondendo a pergunta inicial: pra executar uma instrução, ela deve estar dentro do corpo de um método.
Já o mesmo nao se aplica à atribuições

C
fenemeth:
Humm vejamos.

Então a situação fica na seguinte:

Tenho classe A e B.

A no pacote PA, sendo todos métodos e variáveis com modif. protected.
B no pacote PB

B herda de A. Então todas as variáveis e métodos de A são acessíveis à B sem instanciação. Deixo supor o seguinte código para ver se entendi mesmo. Me corrijam se estiver errado.

Classe A
package pacoteA;

class A{
protected int a = 1;

protected void setA(int a){
this.a = a; 
}

}
Classe B
package pacoteB;
import pacoteA.A;

class B extends A{

void testeB(){
setA(6); //Aqui não teria problemas..
a = 5;   // Nem aqui..
 }

}
Classe C
package pacoteB;

class C{

void teste(){
B objB = new B();
objB.setA(5); //Aqui daria o erro.
objB.a = 6;   //Tbm não seria possível
}
}

Creio que seja isso, a classe C não consegue o acesso com a instancia da classe B certo ?
Falows

Ok! :thumbup:

F

fabiocsi:

Respondendo a pergunta inicial: pra executar uma instrução, ela deve estar dentro do corpo de um método.
Já o mesmo nao se aplica à atribuições

Blz Fabio, me ajudou ainda mais. Brigadão!

Criado 17 de janeiro de 2008
Ultima resposta 21 de jan. de 2008
Respostas 18
Participantes 10