classe abstrata
注:先将抽象类中的两种方法解释完,再综合解释抽象类
método abstrato
- Cenário: Em todas as suas subclasses deve ter este método, mas a maioria subclasse específica dos passos são diferentes.
- Você deve ser reescrita: Você também pode dizer "deve ser alcançado", porque a classe pai abstrato há corpo do método.
- palavras-chave:
abstract
método comum
- Cenário: Em todas as suas subclasses e método deve ter a subclasse mais específica do passo é idêntico.
- Regraváveis: Os métodos mais comuns pode ser substituído, para cada passo são da mesma subclasse há necessidade de reescrever NATURAL; a maior parte do mesmo passo subclasse é necessário no caso de que uma pequena porção dos diferentes sub classe de reescrever.
- Selecione por: cenários ver
classe abstrata detalhado
- Definição: um método em que a classe resumo deve ser definida como uma classe abstracta.
Razão de ser: para alcançar programa de polimorfismo. (Deve ser herdado, caso contrário, a sua existência é sem sentido)
Pergunta: Desde que os métodos convencionais pode ser substituído, então as subclasses têm diferentes passos de execução gostaria de reescrever métodos abstratos por que eu preciso dele?
A: O método abstrato deve ser reescrito e nenhum corpo de método da classe pai, em vez do método convencional deve ser reescrito e a classe pai tem um corpo de método; causando assim um problema: Programa muito grande para utilizar este método, o pai muitos métodos de classe comuns, subclasse deve se lembrar de reescrever, mas a máquina virtual java e não irá dizer-lhe para reescrever, reescrever não apenas subclasse o método padrão classe pai, de acordo com a implementação do corpo; e método abstrato é diferente a subclasse não substitui
o erro de máquina virtual java, desta vez desempenhou um papel, bem como um lembrete obrigatório.
interface
- Definição: a presença da interface é conseguir procedimentos escaláveis.
- Razão de ser: se sua classe arquitetura, extensões de uma classe para como fazer? Então, nós estamos indo para modificar o pai dessa classe é a superclasse mesmo dizer isso? Isto é claramente irracional. (E se você usar a classe fornecido por outra pessoa, é simplesmente impossível modificá-lo) Talvez você não vai ser rastreada até ao objeto. Mas usando a interface, você quer dar uma aula neste extensões do sistema, basta dar Essa classe implementa uma nova interface, irá, naturalmente, proporcionar novas funcionalidades, ele não afeta sua superclasse,
而它的子类自动也扩充了它新增加的这个接口的方法
(um pouco como C ++ e mais herança). Isso torna o software mais fácil de extensões.设计模式中有一条开闭原则,说:软件实体必须都修改关闭,对扩展开放。
Usar interface, você pode atender a essas exigências do projeto. Cenário: Esta classe requer algumas subclasses em que, embora alguns não, o acesso, em seguida, para a interface para as necessidades da subclasse.
Pergunta: Como a interface é uma específicos de subclasse, então por que não podemos dirigir esta subclasse definida maneira comum de fazer isso?
A: Isso é nenhuma experiência escrevendo grandes programas de perguntas mais frequentes. A interface chamado, é usado por pessoas que você não sabe o que a subclasse e chamar sua subclasse. Desta vez, como as pessoas sabem o que você subclasse maneira de fazer isso? Então você dizer a ele que meu subclasse herda uma interface, e outros para ver, oh, essa interface, existem métodos a, b, c, de modo que você pode chamar. Você diz por que não dizer-lhe subclasse dela, esta é a reutilização. Uma interface, você pode usar várias subclasses para alcançá-lo, outros apenas chamar uma interface alterando a subclasse, você pode usar uma variedade de funções sem alterar o código. Claro que, para alcançar a natureza sub-classe destes métodos é também OK ah, mas se você tivesse um pai, eles não entendem o que você quer dizer, você herdar a classe pai, esqueça o método de escrever a ser alcançado como fazer? Interface jogado medidas coercivas.
注:抽象类和接口共同支持了程序的可维护性。
A título de exemplo compreensão
Primeiro vamos resolver o que o relacionamento entre as classes (marcados com * é uma classe abstrata)
- Estudante * (estudantes)
- Studystudent * (classe de aprendizagem)
- Libstudent (estudantes de artes liberais)
- Sciencestudent (estudantes de ciência)
- Longhairstudent * (Art)
- Artstudent (estudantes de arte)
- Musicstudent (estudantes de música)
- Studystudent * (classe de aprendizagem)
Em seguida, pentear uma variedade de características comportamentais dos alunos (marcados com * são métodos abstratos, # marcado como interfaces)
- características do aluno: acordar, comer, estudar *, sono
- Studystudent novos recursos adicionados: Exame *
- novo recurso adicionado Libstudent: fazer idiomas #
- novo recurso adicionado Sciencestudent: fazer matemática #
- Longhairstudent novos recursos adicionados: Skills *
- Studystudent novos recursos adicionados: Exame *
Em seguida sobre o código
//Student
public abstract class Student {
public void getup() {//起床,所有学生都要做且步骤相同
System.out.println("起床");
}
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
abstract public void study();
}
//Studystudent
public abstract class Studystudent extends Student {
abstract public void exam();
}
//Longhairstudent
public abstract class Longhairstudent extends Student {
abstract public void skilltrain();
}
//Libstudent
public class Libtstudent extends Studystudent implements Morechinese{
@Override
public void dochinese() {
System.out.println("多做语文");
}
@Override
public void exam() {
System.out.println("考试政史地");
}
@Override
public void study() {
System.out.println("学习政史地");
}
}
//Sciencestudent
public class Libtstudent extends Studystudent implements Morechinese{
@Override
public void dochinese() {
System.out.println("多做语文");
}
@Override
public void exam() {
System.out.println("考试理化生");
}
@Override
public void study() {
System.out.println("学习理化生");
}
}
//Artstudent
public class Artstudent extends Longhairstudent{
@Override
public void skilltrain() {
System.out.println("美术技能训练");
}
@Override
public void study() {
System.out.println("学习画画基本功");
}
}
//Musicstudent
public class Musicstudent extends Longhairstudent{
@Override
public void skilltrain() {
System.out.println("唱歌技能训练");
}
@Override
public void study() {
System.out.println("学习唱歌基本功");
}
}
//主类
public class Demo {
public static void Oneday(Student cuteStudent) {
cuteStudent.getup();
cuteStudent.eat();
cuteStudent.study();
cuteStudent.sleep();
}
public static void main(String[] args) {
Oneday(new Artstudent());
}
}
Definimos um corpo de método (Oneday) na categoria principal, para ver um dia estudante atividades gerais. O parâmetro método é estudante de referência, então nós só precisa mudar a instanciação pode obter diferentes tipos de alunos em um dia quando se utiliza este método.
FIG resultados da execução são os seguintes:
Se as novas Libstudents alterados, os resultados da execução, conforme mostrado abaixo:
Como podemos definir as interfaces para usá-lo? Foi adicionado no código principal categoria é a seguinte:
Moremath iMoremath=new Sciencestudent();
iMoremath.domath();
ou;
new Sciencestudent().domath();
Ele será exibido após a implementação de "math fazer".