Polimorfismo
l Polimorfismo é o conceito mais importante em orientação a objetos. Existem duas manifestações em Java:
1. Sobrecarga de método (sobrecarga) e reescrever (sobrescrever).
2. Polimorfismo de objeto - pode ser aplicado diretamente a classes e interfaces abstratas.
Variáveis de referência Java tem dois tipos: tipo de tempo de compilação e tipo de tempo de execução . O tipo de tempo de compilação é determinado pelo tipo usado quando a variável é declarada, e o tipo de tempo de execução é determinado pelo objeto realmente atribuído à variável.
Se o tempo de execução e o tipo de tempo de compilação do tipo inconsistente, há polimorfismo ( polimorfismo )
objeto polimórfico L - em Java, uma subclasse de objeto pode substituir o objeto usando a classe pai
Uma variável só pode ter um certo tipo de dados
Uma variável de tipo de referência pode apontar para (fazer referência) muitos tipos diferentes de objetos
Pessoa p = nova Pessoa ();
Person e = new Student (); // Variável e do tipo Person aponta para um objeto do tipo Student
Ele pode ser visto como uma subclasse especial da classe pai, de modo que a referência ao tipo de classe pai da subclasse de objeto pode apontar: transição para cima ( upcasting ).
Se uma variável de tipo de referência é declarada como o tipo da classe pai, mas na verdade se refere ao objeto da subclasse, então a variável não pode mais acessar as propriedades e métodos adicionados na subclasse
Aluno m = novo Aluno ();
m.school = " pku "; // Legal , a classe Aluno tem variáveis de membros da escola
Pessoa e = novo aluno ();
e.school = " pku "; // Ilegal , a classe Person não tem variável de membro da escola
Os atributos são determinados em tempo de compilação.Em tempo de compilação, e é do tipo Pessoa , e não há variável de membro da escola , então ocorre o erro de compilação.
Classe interna
Em Java, a definição de uma classe pode ser localizada dentro de outra classe.A primeira é chamada de classe interna e a última é chamada de classe externa.
A classe interna é geralmente usada na classe ou bloco de instrução em que é definida e o nome completo deve ser fornecido ao fazer referência a ela externamente.
O nome da classe Inner não pode ser igual ao nome da classe que a contém;
A classe interna pode usar os dados privados da classe externa, porque é um membro da classe externa e os membros da mesma classe podem acessar uns aos outros. A classe externa precisa acessar os membros da classe interna, classe interna, membro ou objeto da classe interna.
Classificação: classe interna de membro ( classe interna de membro estático e classe interna de membro não estático)
Classe interna parcial (modificador à parte), classes internas anônimas
class A {
private int s;
public class B{
public void mb() {
s = 100;
System.out.println("在内部类B中s=" + s);
} }
public void ma() {
B i = new B();
i.mb();
} }
public class Test {
public static void main(String args[]){
A o = new A();
o.ma();
} }
Classe interna **** como membro da classe:
Pode ser declarado como final o
Ao contrário das classes externas, a classe Inner pode ser declarada como privada ou protegida ;
A classe interna pode ser declarada como estática , mas as variáveis de membro não estáticas da classe externa não podem mais ser usadas neste momento;
Classe interna como classe:
Pode ser declarado como uma classe abstrata , para que possa ser herdado por outras classes internas
[Nota] Membros de classes internas não estáticas não podem ser declarados como estáticos, e membros estáticos só podem ser declarados em classes externas ou classes internas estáticas.
Uma classe interna anônima não pode definir nenhum membro, método e classe estática, apenas uma instância da classe interna anônima pode ser criada. Uma classe interna anônima deve estar atrás de new e usá-la para implementar implicitamente uma interface ou implementar uma classe.
novo construtor de classe pai (lista de argumentos) | interface de implementação () {
// A parte do corpo da classe da classe interna anônima
}
interface A{
public abstract void fun1();
}
public class Outer{
public static void main(String[] args) {
new Outer().callInner(new A(){
//接口是不能new但此处比较特殊是子类对象实现接口,只不过没有为对象取名
public void fun1() {
System.out.println(“implement for fun1");
}
});// 两步写成一步了
}
public void callInner(A a) {
a.fun1();
}
}