Quando um metodo ou atributo é statis significa que ele é pertencente a classe é a não há objetos partculares instanciados da classe dessa forma você pode chama-los pelos nome da classe veja:
Por que dois métodos estáticos na classe pai e na filha, mesmo que tenham o mesmo nome, são métodos diferentes. Em métodos estáticos, não existe sobrescrita, você acaba com dois métodos em escopos diferentes.
No seu exemplo, existe o método SuperCalc.multiply() e o SubCalc.multiply() e ambos podem ser usados a qualquer momento, por qualquer classe.
ViniGodoy se o método não é sobrescrito pq eu não posso alterar o modificador de acesso para um mais restritivo??
por ex:
class SuperCalc {
public static int multiply(int a, int b) {
return a * b;
}
}
class SubCalc extends SuperCalc {
protected static int multiply(int a, int b) {
return a * b;
}
}
ou
class SuperCalc {
protected static int multiply(int a, int b) {
return a * b;
}
}
class SubCalc extends SuperCalc {
static int multiply(int a, int b) {
return a * b;
}
}
não compila ;~
mesmo não sendo sobrescrito a regra de sobrescrição está sendo aplicada oO
Acho que isso vc teria que perguntar para o James Gosling. kkkk
Provavelmente por que você pode chamar um método estático de maneira não estática.
E nesse contexto, ele procurará chamar o método mais próximo.
Em todo caso, isso é considerado uma má prática de programação, e chamar métodos estáticos dessa forma não é recomendado desde o Java 1.1, mais ou menos.
Cara… essa foi uma das últimas questões de minha prova hoje… perdi ela por falta de paciência e porque já estava em OFF nessa hora, doido pra sair da sala da prova…
[quote=TiagoTC]
Ambos não compilam! Agora, se alguém tiver alguma explicação…[/quote]
Como já foi dito atrás, métodos estáticos podem ser chamados de forma não estática. Assim, se tiveres:
[code]class TestA{
public void start(){ System.out.println(“TestA”); }
}
public class TestB extends TestA{
public static void start(){ System.out.println(“TestB”); }
public static void main (String args[]){
TestB b = new TestB();
b.start(); // o que vai ser chamado aqui?
}
} [/code]
Como é que ele sabe o que deve invocar na linha 10? O método estatico da própria classe (que pode ser chamado assim)? Ou o método da classe pai (seguindo a lógica do objecto)?
[quote=pmlm][quote=TiagoTC]
Ambos não compilam! Agora, se alguém tiver alguma explicação…[/quote]
Como já foi dito atrás, métodos estáticos podem ser chamados de forma não estática. Assim, se tiveres:
[code]class TestA{
public void start(){ System.out.println(“TestA”); }
}
public class TestB extends TestA{
public static void start(){ System.out.println(“TestB”); }
public static void main (String args[]){
TestB b = new TestB();
b.start(); // o que vai ser chamado aqui?
}
} [/code]
Como é que ele sabe o que deve invocar na linha 10? O método estatico da própria classe (que pode ser chamado assim)? Ou o método da classe pai (seguindo a lógica do objecto)?[/quote]