Constante em Interface

6 respostas
W

Amigos,
Podemos fazer de um atributo de uma interface ser uma cosntante. OK, mas fiz o seguinte código a nivel de exemplo, e notei que o valor do atributo “VALOR” esta sofrendo alteração.
Alguém poderia explicar o porque de tal situação ?

interface InterFaceTeste
{
  public final static int VALOR = 0;
  void metodoInter();
}

class InterfaceAtributos implements InterFaceTeste{
    static int VALOR = 1;
    
    public void metodoInter()
    {
      System.out.println(VALOR + 1 );
    }
    
    public static void main(String[] args)
    {
      System.out.println("valor 'e : "  + VALOR); // situacao A
      InterfaceAtributos ia = new InterfaceAtributos();
      ia.metodoInter();// situacao B
    }
}

situacao A = 1 e
situacao B = 2 !!
Obrigado.

6 Respostas

G

Duas coisas:

  • Você não alterou valor de variável alguma, pq vc não setou valor em nada, vc só somou 1 mais a variavel estatica da classe InterfaceAtributos
  • A não ser que você declare o nome da interface ele vai usar a variável estática local.

Pra fazer o teste use a constante prefixada, como: InterFaceTeste.VALOR

LPJava

as variaveis nao são herdadas, apenas os metodos, entao sua classe ai criou uma variavel que tem o mesmo nome, e tipo e nivel de acesso ue a variavel da interface. Mas ela não é a mesma da interface.
experimente usar o nome da interface.variavel = 2; para vc ver se compila…

Lembre-se: Apenas os os métodos sao herdados!!!

espero ter ajudado qualquer coisa tamos na area…

diego2005

Interfaces não possuem atributos, apenas constantes. Se você fizer:

interface InterFaceTeste { int VALOR = 0; }

É o mesmo que:

interface InterFaceTeste { public int VALOR = 0; }

Que é o mesmo que:

interface InterFaceTeste { public final int VALOR = 0; }

Que por fim, é o mesmo que:

interface InterFaceTeste { public final static int VALOR = 0; }

T+

T

boa noite,

Você esqueceu do Final, todas as constantes são Finais e Static.

Abraços!

T

Use enums em vez de campos “public static final” em uma interface.

Eu entendi o que você quis fazer - setar “1” em teste e “0” em produção; mas membros “public static final” em classes dão muita confusão, a menos que você possa recompilar todos seus arquivos e recopiar todos eles (já tomamos na cabeça algumas vezes porque as pessoas achavam que “public static final” servia para configuração, e não é bem assim.)

bernardo.rafael

Wilhans:
Amigos,
Podemos fazer de um atributo de uma interface ser uma cosntante. OK, mas fiz o seguinte código a nivel de exemplo, e notei que o valor do atributo “VALOR” esta sofrendo alteração.
Alguém poderia explicar o porque de tal situação ?

interface InterFaceTeste
{
  public final static int VALOR = 0;
  void metodoInter();
}

class InterfaceAtributos implements InterFaceTeste{
    static int VALOR = 1;
    
    public void metodoInter()
    {
      System.out.println(VALOR + 1 );
    }
    
    public static void main(String[] args)
    {
      System.out.println("valor 'e : "  + VALOR); // situacao A
      InterfaceAtributos ia = new InterfaceAtributos();
      ia.metodoInter();// situacao B
    }
}

situacao A = 1 e
situacao B = 2 !!
Obrigado.

Cara, acho que temos alguns problemas com conceitos do java aqui.
Vamos lá:
1º - O valor da constante não está sendo alterado.
Quando vc escreve:

System.out.println(VALOR + 1 );

Seria o mesmo que escrever:

System.out.println(1 + 1 );

O que é impresso é o resultado do cálculo, sem alterar o valor de VALOR.

2º - O escopo das variáveis.
Se você declarar uma constante X em uma Interface e criar uma classe que implementa a interface, o que acontecerá quando o nome X for referenciado será o seguinte:
a) se você estiver executando o método que declara uma variável com o nome de X, essa variável será referenciada. Se você quiser referenciar o X atributo da classe, deverá usar this.X; para usar o X constante da interface, deverá usar [nome interface].X;

b) se você não estiver executando o método que declara a variável com nome X, a referencia será para o atributo X, sem a necessidade do uso de this - mas aconselho a sempre utilizar.

c) se o método que você está executando não tiver uma variável com nome X e nem a classe que possui o método tiver um atributo com nome X, automanticamente, o a referencia X irá apontar para a constante da interface - novamente aconselho a sempre utilizar o “prefixo” (nome da interface).

Criado 20 de agosto de 2007
Ultima resposta 21 de ago. de 2007
Respostas 6
Participantes 7