[DUVIDA] Questao do Inquisition .... outra questão

class num {
   int x=9;
}

interface blob {
   final num n = new num();
   final Integer number = 1;
}

class test implements blob {
   
   public static void main (  String [] args ) {
      n.x = 10;    // 1 
      number++;    // 2
   }
}

Não entendi porque n.x= 10 não há um erro .

E na interface eu posso instanciar um objeto?

Por favor, me ajudem…

vlw :smiley:

Esse é um segredo das interfaces: é possível criar um campo constante em uma interface, que normalmente seria usado para isto aqui:

interface Constantes {
    public final String ZERO = "ZERO"; // note o "final"
}

class Classe  implements Constants {
    public Classe () { }
}

class Teste {
    public static void main(String[] args) {
        System.out.println (Classe.ZERO); // imprime ZERO
    }
}

No seu caso temos uma aberração que é o uso de uma classe mutável (num) em vez de uma classe imutável como a classe String. Mas a idéia é a mesma (é mais ou menos como se fôssemos usar uma variável estática da classe).

[quote=soublade][code]
class num {
int x=9;
}

interface blob {
final num n = new num();
final Integer number = 1;
}

class test implements blob {

public static void main ( String [] args ) {
n.x = 10; // 1
number++; // 2
}
}
[/code][/quote]

Não há erro nenhum

a propriedade x, inteira de num, é definida como de pacote, portanto estando a classe dentro do mesmo pacote, ela tem visão e pode alterar o valor da propriedade sem problemas

[quote=soublade]E na interface eu posso instanciar um objeto?[/quote] sim vc pode, e ele se torna uma constante, inerface pode definir assinatura de métodos e constantes…

[quote=thingol]Esse é um segredo das interfaces: é possível criar um campo constante em uma interface, que normalmente seria usado para isto aqui:

interface Constantes {
    public final String ZERO = "ZERO"; // note o "final"
}

class Classe  implements Constants {
    public Classe () { }
}

class Teste {
    public static void main(String[] args) {
        System.out.println (Classe.ZERO); // imprime ZERO
    }
}

No seu caso temos uma aberração que é o uso de uma classe mutável (num) em vez de uma classe imutável como a classe String. Mas a idéia é a mesma (é mais ou menos como se fôssemos usar uma variável estática da classe).
[/quote]

mais o num está como FINAL. E mesmo assim ele ser modificado?

A referência a n não pode ser modificada (por isso é que é final), mas não há nada que proíba ao objeto referido por n de ser modificado. E é por isso que é possível fazer “n.x = 10”.

Hum entendi…

como n é final, ele nao pode ser modificada, porem x nao está marcado como final, então ela pode ser modificada

Exatamente. Isso é que é bem chato no Java. Entretanto, é algo melhor que o C++ (que tem uma palavra-chave “const”, mas que nem sempre funciona do jeito desejado. Em C++ você pode ter um “const int *” ou um “int * const” e essas coisas são diferentes entre si.

beleza…

vlw pela ajuda thingol…

se tu poder me ajudar tb no outro topico que eu fiz antes desse fica agradecido tb!hehehehe

beleza…

vlw pela ajuda thingol…

se tu poder me ajudar tb no outro topico que eu fiz antes desse fica agradecido tb!hehehehe