reescrita Java (Override) e sobrecarga (sobrecarga)
Rewrite (Override)
Reescrita é uma subclasse do processo de implementação para permitir o acesso aos métodos da classe pai para re-escrever! valores de retorno e os parâmetros não são alterados. Esse é o mesmo caso, o núcleo reescrever!
Reescrevendo vantagem de subclasses, conforme necessário, definir específico em suas ações.
Que é uma subclasse de um método de classe pai pode ser realizada, conforme necessário.
Em princípios de orientação a objetos, a reescrita significa que você pode substituir quaisquer métodos existentes. Exemplos são os seguintes:
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象 a.move();// 执行 Animal 类的方法 b.move();//执行 Dog 类的方法 } }
Os exemplos acima são compilados os resultados como se segue:
动物可以移动 狗可以跑和走
No exemplo acima, pode ser visto, embora b pertence tipos de animais, mas é uma classe método cão operação de movimentação.
Isto é porque no tempo de compilação, mas verificando parâmetro de tipo de referência.
No entanto, em tempo de execução, o tipo de máquina virtual Java (JVM) do objeto e método de operação do objeto especificado.
Assim, no exemplo acima, o compilador tem sido capaz de ter sucesso porque o método movimento existe classe Animal, mas correndo, correndo é um método para um objeto específico.
Considere os seguintes exemplos:
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } public void bark(){ System.out.println("狗可以吠叫"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象 a.move();// 执行 Animal 类的方法 b.move();//执行 Dog 类的方法 b.bark(); } }
Os exemplos acima são compilados os resultados como se segue:
TestDog.java:30: cannot find symbol symbol : method bark() location: class Animal b.bark(); ^
O programa irá lançar um erro de compilação porque não existe um método casca tipo de animal b referência.
O método de reescrever as regras
- Lista de parâmetros deve ser exatamente o mesmo que o método a ser reescrito;
- O tipo de retorno deve ser totalmente reescrito com o tipo de retorno do método é o mesmo;
- O acesso não é menor do que os métodos de acesso classe pai substituídas. Por exemplo: Se uma classe pai é declarado público, em seguida, substituir esse método em uma subclasse não pode ser declarado como protegido.
- Os membros da classe pai só pode ser substituído suas subclasses.
- Declarados como métodos final não pode ser substituído.
- Declarados como métodos estáticos não podem ser reescritos, mas pode ser declarado novamente.
- A classe pai e subclasse no mesmo pacote, a subclasse pode substituir a classe pai de todos os métodos, exceto declarações de abordagem privada e final.
- Subclasse e superclasse não é o mesmo pacote, portanto, apenas subclasses pode substituir declaração de métodos não-finais da classe pai pública e protegido para.
- método substituído pode lançar qualquer exceção não-obrigatório, independentemente de se o método foi reescrito lançar uma exceção. No entanto, o método não pode substituir a excepção obrigatória lançar novo ou mais ampla do que a declaração obrigatória é exceção método substituído, caso contrário, você pode.
- Construtor não pode ser reescrito.
- Se um método não pode ser herdada, não pode substituir esse método.
Utilizando a chave Super
Quando você precisa ser reescrito para chamar o método da classe pai em uma subclasse, para usar a palavra-chave super.
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ super.move(); // 应用super类的方法 System.out.println("狗可以跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal b = new Dog(); // Dog 对象 b.move(); //执行 Dog类的方法 } }
Os exemplos acima são compilados os resultados como se segue:
动物可以移动 狗可以跑和走
Overload (sobrecarga)
Sobrecarga (sobrecarga) é uma classe dentro do método do mesmo nome, mas com diferentes parâmetros. O tipo de retorno podem ser iguais ou diferentes.
Cada método sobrecarregado (ou construtor) deve ter uma lista única de tipos de argumento.
construtores Só sobrecarregados
sobrecarga regras
- método sobrecarregado deve alterar a lista de parâmetros;
- Métodos sobrecarregados podem mudar o tipo de retorno;
- Métodos sobrecarregados podem mudar modificadores de acesso;
- métodos sobrecarregados pode declarar uma exceções novo ou mais ampla verificados;
- O método pode estar na mesma classe ou ser sobrecarregado em uma subclasse.
Exemplos
public class Overloading { public int test(){ System.out.println("test1"); return 1; } public void test(int a){ System.out.println("test2"); } //以下两个参数类型顺序不同 public String test(int a,String s){ System.out.println("test3"); return "returntest3"; } public String test(String s,int a){ System.out.println("test4"); return "returntest4"; } public static void main(String[] args){ Overloading o = new Overloading(); System.out.println(o.test()); o.test(1); System.out.println(o.test(1,"test3")); System.out.println(o.test("test4",1)); } }
Reescrevendo a diferença entre a sobrecarga
Ponto de diferença | métodos sobrecarregados | Substituindo métodos |
---|---|---|
Lista de Parâmetros | Você deve ser modificado | não deve ser modificado |
Tipo de retorno | Você pode modificar | não deve ser modificado |
anormal | Você pode modificar | Podem ser reduzidos ou removidos, você não deve lançar nova exceção ou mais ampla |
acesso | Você pode modificar | não deve haver restrições mais rigorosas (limite pode ser reduzido) |