[RESOLVIDO]Interface - acesso a variável dentro dela

Estou com uma dúvida com relação a interface…

package polimorfismoInterface;

public interface TesteInterface 
{
	int var = 19;
}

class AcessoInterface
{
	TesteInterface i;
	
	public static void main(String []args)
	{
		new AcessoInterface();
	}
	
}

Como é que eu faria o acesso à variável ‘var = 19’ ?
Testando, percebi que não consigo acessar ‘var’ estaticamente (toda variável dentro de uma interface é public static final ).

Outra coisa. No padrão de projeto “State”, uma classe possui uma instância de uma interface, tal como fiz acima.
Para que serve uma variável do tipo da interface?

Tentou isso?

TesteInterface.var;

Não existe instância de interface. Existe uma instância da classe que a implementou.

Por exemplo:

[code]
public interface Funcionario {
public double calculaSalario();

}

public Gerente implements Funcionario{
public double calculaSalario(){
//implementação aqui
}
} [/code]

E você pode chamar assim:

Funcionario f = new Gerente(); Funcionario f = new Diretor() ;// partindo do princípio que Diretor implementa a interface Funcionário

Mas nunca:

Funcionario f = new Funcionario(); 

A não ser que seja assim:

Funcionario f = new Funcionario(){ public double calculaSalario(){ //implementação aqui } };

Ai nesse caso você criou uma classe anônima que implementou a interface Funcionário.

E em relação a variável dentro de Interface, ela vira uma constante das classes que a implementaram. Então se eu colocasse uma variável x na interface Funcionários, ela seria uma constante de Gerente,Diretor e na própria interface. Mas na prática vi pouquíssimas vezes isso.

[quote=javablue]Não existe instância de interface. Existe uma instância da classe que a implementou.

Por exemplo:

[code]
public interface Funcionario {
public double calculaSalario();

}

public Gerente implements Funcionario{
public double calculaSalario(){
//implementação aqui
}
} [/code]

E você pode chamar assim:

Funcionario f = new Gerente(); Funcionario f = new Diretor() ;// partindo do princípio que Diretor implementa a interface Funcionário

Mas nunca:

Funcionario f = new Funcionario(); 

A não ser que seja assim:

Funcionario f = new Funcionario(){ public double calculaSalario(){ //implementação aqui } };

Ai nesse caso você criou uma classe anônima que implementou a interface Funcionário.

E em relação a variável dentro de Interface, ela vira uma constante das classes que a implementaram. Então se eu colocasse uma variável x na interface Funcionários, ela seria uma constante de Gerente,Diretor e na própria interface. Mas na prática vi pouquíssimas vezes isso.[/quote]

Eu me expressei errado…quando eu disse que no padrão de projeto uma classe tinha uma instância da interface, quis dizer que essa classe possui uma variável do tipo da interface, como expus no meu exemplo…

1 - Agora, para que que serve uma variável do tipo interface?

Interface i;

No meu exemplo, a classe não implementa a interface.

Quero acessar var, diferentemente do código abaixo:

public interface TesteInterface 
{
	int var = 19;
	
}

class AcessoInterface implements TesteInterface
{
	TesteInterface i;
	
	
	public static void main(String []args)
	{
		new AcessoInterface();
		System.out.println(var);
	}
	
}

2 - Tem jeito que acessar var sem o “implements”?

Com relação a variável da Interface, ela só poderá ser acessada se um classe implementar a interface, correto?
Não entendi pq não e possível acessar direto a varíavel static pelo nome da Interface, é uma regra específica para Interfaces?

[quote=gRoOve]Com relação a variável da Interface, ela só poderá ser acessada se um classe implementar a interface, correto?
Não entendi pq não e possível acessar direto a varíavel static pelo nome da Interface, é uma regra específica para Interfaces?[/quote]

Acredito que sim, na sua primeira pergunta.
Na segunda, não dá acesso à ‘var’ usando acesso estático direto (Interface.var).

[quote=ECO2004][quote=gRoOve]Com relação a variável da Interface, ela só poderá ser acessada se um classe implementar a interface, correto?
Não entendi pq não e possível acessar direto a varíavel static pelo nome da Interface, é uma regra específica para Interfaces?[/quote]

Acredito que sim, na sua primeira pergunta.
Na segunda, não dá acesso à ‘var’ usando acesso estático direto (Interface.var).[/quote]

Quem lhe disse que não? Você e o gRoOve estão enganados.
Toda e qualquer variavél declarada dentro de uma interface é public, static e final, ou seja, imutavél.

Isso:

public interface IExemplo { public static final String EXEMPLO = "Teste"; }

É igual a isto:

public interface IExemplo { String EXEMPLO = "Teste"; }

Assim como também todo método em uma interface é publico e abstrato.
Portanto, para esse exemplo, é perfeitamente possível acessar a variavel EXEMPLO fazendo simplesmente IExemplo.EXEMPLO.

Entenderam? :slight_smile:
Abraços.

[quote=nel][quote=ECO2004][quote=gRoOve]Com relação a variável da Interface, ela só poderá ser acessada se um classe implementar a interface, correto?
Não entendi pq não e possível acessar direto a varíavel static pelo nome da Interface, é uma regra específica para Interfaces?[/quote]

Acredito que sim, na sua primeira pergunta.
Na segunda, não dá acesso à ‘var’ usando acesso estático direto (Interface.var).[/quote]

Quem lhe disse que não? Você e o gRoOve estão enganados.
Toda e qualquer variavél declarada dentro de uma interface é public, static e final, ou seja, imutavél.

Isso:

public interface IExemplo { public static final String EXEMPLO = "Teste"; }

É igual a isto:

public interface IExemplo { String EXEMPLO = "Teste"; }

Assim como também todo método em uma interface é publico e abstrato.
Portanto, para esse exemplo, é perfeitamente possível acessar a variavel EXEMPLO fazendo simplesmente IExemplo.EXEMPLO.

Entenderam? :slight_smile:
Abraços.[/quote]

Então tá, amigo. Conversa com o Eclipse…
Já compilou esse código?

[quote=ECO2004]
Então tá, amigo. Conversa com o Eclipse…
Já compilou esse código?[/quote]

Eu compilei e funciona!

Em nenhum momento você postou um código que acesse a variável da interface conforme sugerido.

Que erro o Eclipse te dá? E com qual código exatamente?

Lembrando, quando você faz isso:

interface MinhaInterface {
  int minhaVariavel = 2;
}

classe MinhaClasse {
  public static void main(String[] args) {  
  }
}

MinhaInterface e MinhaClasse não compartilham informações por estarem no mesmo arquivo.

[quote=ECO2004][quote=nel][quote=ECO2004][quote=gRoOve]Com relação a variável da Interface, ela só poderá ser acessada se um classe implementar a interface, correto?
Não entendi pq não e possível acessar direto a varíavel static pelo nome da Interface, é uma regra específica para Interfaces?[/quote]

Acredito que sim, na sua primeira pergunta.
Na segunda, não dá acesso à ‘var’ usando acesso estático direto (Interface.var).[/quote]

Quem lhe disse que não? Você e o gRoOve estão enganados.
Toda e qualquer variavél declarada dentro de uma interface é public, static e final, ou seja, imutavél.

Isso:

public interface IExemplo { public static final String EXEMPLO = "Teste"; }

É igual a isto:

public interface IExemplo { String EXEMPLO = "Teste"; }

Assim como também todo método em uma interface é publico e abstrato.
Portanto, para esse exemplo, é perfeitamente possível acessar a variavel EXEMPLO fazendo simplesmente IExemplo.EXEMPLO.

Entenderam? :slight_smile:
Abraços.[/quote]

Então tá, amigo. Conversa com o Eclipse…
Já compilou esse código?[/quote]

Está precisando pegar um livro de Java e dar uma boa lida meu camarada.
Eu lhe dei um exemplo simples e que com certeza funciona.
Senão funcionar, é porque não tem Java instalado em sua máquina :slight_smile:

Bons estudos.
Abraços.

[quote=AbelBueno][quote=ECO2004]
Então tá, amigo. Conversa com o Eclipse…
Já compilou esse código?[/quote]

Eu compilei e funciona!

Em nenhum momento você postou um código que acesse a variável da interface conforme sugerido.

Que erro o Eclipse te dá? E com qual código exatamente?

Lembrando, quando você faz isso:

interface MinhaInterface {
  int minhaVariavel = 2;
}

classe MinhaClasse {
  public static void main(String[] args) {  
  }
}

MinhaInterface e MinhaClasse não compartilham informações por estarem no mesmo arquivo.[/quote]

Eu não postei porque não funciona…

package polimorfismoInterface;

public interface MinhaInterface 
{
	int var = 19;
}

class AcessarInterface
{
	MinhaInterface i;
	MinhaInterface.var;
}

Esse código acima não compila.

“Syntax error on token “var”, VariableDeclarator expected after this token”
ou se eu digitar apenas Interface, No Default Proposal

[quote=AbelBueno][quote=ECO2004]
Então tá, amigo. Conversa com o Eclipse…
Já compilou esse código?[/quote]

Eu compilei e funciona!

Em nenhum momento você postou um código que acesse a variável da interface conforme sugerido.

Que erro o Eclipse te dá? E com qual código exatamente?

Lembrando, quando você faz isso:

interface MinhaInterface {
  int minhaVariavel = 2;
}

classe MinhaClasse {
  public static void main(String[] args) {  
  }
}

MinhaInterface e MinhaClasse não compartilham informações por estarem no mesmo arquivo.[/quote]

Você leu isso amigo? Se leu, vai entender porque o erro ocorre :slight_smile:
Abraços.

Tenta assim:

int x = MinhaInterface.var;

Ai compila :wink:

Agradeço a todos pela ajuda!

O que aconteceu foi que, quando eu iniciava uma linha com

MinhaInterface. (esperando aparecer var como opção de acesso), o compilador via o resultado disso como um retorno de valor, apenas. Como “MinhaInterface.” não estava dentro de um System.out.print() ou havia uma variável recebendo o retorno, gerava um “No default proposal”.

Daí surgiram as dúvidas sobre variáveis dentro de uma interface!

Vlw mesmo pela luz!

[quote=nel][quote=ECO2004][quote=gRoOve]Com relação a variável da Interface, ela só poderá ser acessada se um classe implementar a interface, correto?
Não entendi pq não e possível acessar direto a varíavel static pelo nome da Interface, é uma regra específica para Interfaces?[/quote]

Acredito que sim, na sua primeira pergunta.
Na segunda, não dá acesso à ‘var’ usando acesso estático direto (Interface.var).[/quote]

Quem lhe disse que não? Você e o gRoOve estão enganados.
Toda e qualquer variavél declarada dentro de uma interface é public, static e final, ou seja, imutavél.

Isso:

public interface IExemplo { public static final String EXEMPLO = "Teste"; }

É igual a isto:

public interface IExemplo { String EXEMPLO = "Teste"; }

Assim como também todo método em uma interface é publico e abstrato.
Portanto, para esse exemplo, é perfeitamente possível acessar a variavel EXEMPLO fazendo simplesmente IExemplo.EXEMPLO.

Entenderam? :slight_smile:
Abraços.[/quote]
Nel, estou enganado com relação a qual afirmação? Falei que não entendia pq a variável NÃO podia ser acessada…
Compilei o código e rodou normalmente aqui.

[quote=gRoOve][quote=nel][quote=ECO2004][quote=gRoOve]Com relação a variável da Interface, ela só poderá ser acessada se um classe implementar a interface, correto?
Não entendi pq não e possível acessar direto a varíavel static pelo nome da Interface, é uma regra específica para Interfaces?[/quote]

Acredito que sim, na sua primeira pergunta.
Na segunda, não dá acesso à ‘var’ usando acesso estático direto (Interface.var).[/quote]

Quem lhe disse que não? Você e o gRoOve estão enganados.
Toda e qualquer variavél declarada dentro de uma interface é public, static e final, ou seja, imutavél.

Isso:

public interface IExemplo { public static final String EXEMPLO = "Teste"; }

É igual a isto:

public interface IExemplo { String EXEMPLO = "Teste"; }

Assim como também todo método em uma interface é publico e abstrato.
Portanto, para esse exemplo, é perfeitamente possível acessar a variavel EXEMPLO fazendo simplesmente IExemplo.EXEMPLO.

Entenderam? :slight_smile:
Abraços.[/quote]
Nel, estou enganado com relação a qual afirmação? Falei que não entendia pq a variável NÃO podia ser acessada…
Compilei o código e rodou normalmente aqui.[/quote]

IExemplo.EXEMPLO somente irá funcionar se sor parâmetro de algum método ou se tiver alguma var recebendo o seu valor. Caso contrário, não.

Cara,

cuide com o que afirma (usando somente), principalmente se não tem certeza sobre o que fala.
Uma variavél de uma interface quando é acessada, precisa existir uma operação de atribuição e/ou manipulação sobre ela.

Caso contrário, terás em tempo de compilação algo como “AssignmentOperator Expression”.
Você pode utiliza-la em um IF, Switch, passagem de parametro, enfim, manipular.

O que não pode é atribuir um novo valor e/ou acessar a variavél sem executar nenhum tipo de manipulação e/ou atribuição sobre ela.
Abraços.

[quote=nel]Cara,

cuide com o que afirma (usando somente), principalmente se não tem certeza sobre o que fala.
Uma variavél de uma interface quando é acessada, precisa existir uma operação de atribuição e/ou manipulação sobre ela.

Caso contrário, terás em tempo de compilação algo como “AssignmentOperator Expression”.
Você pode utiliza-la em um IF, Switch, passagem de parametro, enfim, manipular.

O que não pode é atribuir um novo valor e/ou acessar a variavél sem executar nenhum tipo de manipulação e/ou atribuição sobre ela.
Abraços.[/quote]

Ok!

[quote=javablue]Tenta assim:

Ai compila :wink: [/quote]
Com certeza :thumbup:

Apenas uma observação:
Essa variável é acessada apenas como leitura. Não será possível alterar seu conteúdo (como já foi citado, é imutável). Ou seja: