Variáveis de Interface

Suponha uma classe A com uma variável de instância inteira i = 10;
Suponha uma interface B com uma variável de interface inteira i = 20;

Agora, suponha uma classe C que estende A e implemeta B.

Qual i será passado para C?

Existem regras no uso de variáveis de interface?
Por padrão, que características elas têm?
Devem ser públicas? estáticas? Algo assim?

Até onde eu lembre, interface não possui variável de instancia, só de classe.

você não fez os testes?

você não fez os testes?[/quote]

As respostas não são tão importantes.
As explicações sim. :slight_smile:

Corrigido :slight_smile:

A resposta a pergunta não faz sentido. Ou então a reposta é que interface não aceita variável de instância.

Experimenta o código:

public interface B { public int i; }

e vc verá que ele não compila.

[]s

[quote=renzonuccitelli] A resposta a pergunta não faz sentido. Ou então a reposta é que interface não aceita variável de instância.

Experimenta o código:

public interface B { public int i; }

e vc verá que ele não compila.

[]s
[/quote]

Inicialize sua variável. Certamente compilará. :wink:
E novamente: A resposta não é tão importante. A explicação sim. :frowning:

você não fez os testes?[/quote]

A resposta não são tão importantes.
As explicações sim. :slight_smile: [/quote]

está certo…

Qual i será passado para C?
as duas e o java reclamara que é ambígua, mesma coisa que acontece quando vc usa o join no sql, e passa uma coluna que existe nas duas tabelas…
Existem regras no uso de variáveis de interface?
acho que de acordo com a sua necessidade e que sigam as regras descrita na questão abaixo…
Por padrão, que características elas têm?
por padrão sempre serão são public final e static
Devem ser públicas? estáticas? Algo assim?
na resposta da questão anterior

acho que é isso…

[quote=cake][quote=renzonuccitelli] A resposta a pergunta não faz sentido. Ou então a reposta é que interface não aceita variável de instância.

Experimenta o código:

public interface B { public int i; }

e vc verá que ele não compila.

[]s
[/quote]

Inicialize sua variável. Certamente compilará. :wink:
E novamente: A resposta não é tão importante. A explicação sim. :frowning: [/quote]

Realmente compilou. Contudo o campo continua sendo estático. Então a variável não é de instância mesmo assim, a notação é apenas açúcar sintático para vc economizar digitação. Testei aki e realmente a variável foi considerada ambígua, como o amigo postou.

[quote=cake][quote=renzonuccitelli] A resposta a pergunta não faz sentido. Ou então a reposta é que interface não aceita variável de instância.

Experimenta o código:

public interface B { public int i; }

e vc verá que ele não compila.

[]s
[/quote]

Inicialize sua variável. Certamente compilará. :wink:
E novamente: A resposta não é tão importante. A explicação sim. :frowning: [/quote]
É verdade, compilará. Porém o Java interpretará i como public static final int i;, ou seja, atributo de classe e ñ de instância. Quando vc cria um atributo em uma interface ele é naturalmente public static final. Faça diferente, tente declarar private int i = 0; e veja no q dá.

Bom… Então sabemos (acabei de aprender hehe) que interfaces tratam variáveis como public static final por default.
Sendo variáveis estáticas, não podem ser de instância, como alguns disseram.

Só fiquei meio surpreso com o fato do Java permitir variáveis na interface…
Isso me soa um tanto problemático, como questões de herança múltipla…

“açúcar sintático” hehehe
Gostei!

[quote=cake]“açúcar sintático” hehehe
Gostei![/quote]

Expressão que vi em inglês, syntatic sugar, no livro Programming in Lua e adotei pro vocabulário…hehe.

[]s

[quote=cake]Bom… Então sabemos (acabei de aprender hehe) que interfaces tratam variáveis como public static final por default.
Sendo variáveis estáticas, não podem ser de instância, como alguns disseram.

Só fiquei meio surpreso com o fato do Java permitir variáveis na interface…
Isso me soa um tanto problemático, como questões de herança múltipla…[/quote]

Acho que não vai ter problema com herança múltipla não. A única coisa é que vc não vai poder acessar a variável (que nem variável é, já que é final) pelo açúcar sintático, só através da Classe/Interface, evitando o problema de ambiguidade. Acho essas variáveis estáticas interessantes para vc colocar constantes na interface, inclusive enums, deixando as classes mais coesas.

[]s

Na verdade esse ñ é bem um case de syntatic sugar é apenas uma espécie de default da sintaxe do java.
Compare isso com os seguinte syntatic sugars da linguagem scala:

// Em scala se uma classe possui um método chamado apply()...
class ScalaClass1 {
  def apply(i: Int) : Unit {
    // faz alguma coisa com o int.
  }
}
val c1 = new ScalaClass
// então vc pode chamar o método apply das seguintes maneiras:
c1.apply(0)
c1(0)

// Em scala se uma classe possui um método chamado update()...
class ScalaClass2 {
  def update(a: Int, b: Int, c: String) : Unit {
    // faz alguma coisa aqui...
  }
}
val c2 = new ScalaClass2
// então vc pode chamar o método update das seguintes maneiras:
c2.update(0, 0, "a")
c2(0, 0) = "a"

[quote=dev.rafael]Na verdade esse ñ é bem um case de syntatic sugar é apenas uma espécie de default da sintaxe do java.
Compare isso com os seguinte syntatic sugars da linguagem scala:

[code]
// Em scala se uma classe possui um método chamado apply()…
class ScalaClass1 {
def apply(i: Int) : Unit {
// faz alguma coisa com o int.
}
}
val c1 = new ScalaClass
// então vc pode chamar o método apply das seguintes maneiras:
c1.apply(0)
c1(0)

// Em scala se uma classe possui um método chamado update()…
class ScalaClass2 {
def update(a: Int, b: Int, c: String) : Unit {
// faz alguma coisa aqui…
}
}
val c2 = new ScalaClass2
// então vc pode chamar o método update das seguintes maneiras:
c2.update(0, 0, “a”)
c2(0, 0) = “a”
[/code][/quote]

é vdd, realmente está mais pra default, apesar de ser meio esquisito.

Em lua vc pode usar : em vez de passar o próprio objeto como primeiro parâmetro de um método. Alias, é um livro que eu recomendo para todo programador. Lá, apesar de Lua não ter herança de forma nativa, ele ensina a fazer herança simples e múltipla de forma fácil. Abre muito a mente de quem programa em Java.

[]s

Em Interfaces, somente é permitido Constantes.
E elas sempre serão publicas.

a) Toda valor declarado em uma interface é uma constante.

Ambas as declarações tem o mesmo resultado.

public interface X { public static final int I = 10; int I = 10; }

b) Como dito acima são constantes.

c) A variável da classe pode ser pública, privada, protegida, estática, final, transient e volatile. A da interface SEMPRE será pública estática e final.

d) Geralmente as várias de classe são declaradas privadas e possuem os metodos get e set para alterar seu valor.

public class A { private int i = 10; // getters and setters }

public interface B { int i = 20; }

public class C extends A implements B { void print() { System.out.println("A: " + this.getI()); // Ou this.i caso mude para protected ou public System.out.println("B: " + C.i); // Ou B.i } }

Não li todas as respostas, então algo semelhante já pode ter sido postado.