Java的抽象类(abstract)

3 阅读2分钟

引入

  • 我们经常使用一个父类来管理多个子类,父类中有大多数子类都需要的属性和方法,比如例子中的Animal类,给其他动物提供了基本的吃饭和发出叫声的方法,如下方代码所示:
package com.abs;  
public class Animal {  
//使用abstract修饰符,告诉编译器Animal类是一个抽象类  
    public void eat(){  
        System.out.println("我是一个动物,我正在吃饭");  
    } 
    public void makeSound(){  
        System.out.println("我是一个动物,我会哇哇叫");  
    }
}
  • 这是子类Dog和Cat,因猫叫和狗叫是不同的,虽然都是叫,但是细节不同,这时候我们就需要对这两个子类的方法进行重写,如下方代码所示:
//Dog类
package com.abs;  
  
public class Dog extends Animal {  
  
    @Override  
    public void makeSound() {  
        System.out.println("我是狗子,我会汪汪汪!");  
    }   
    @Override  
    public void eat() {  
        System.out.println("我正在吃骨头");  
    }  
  
    public static void main(String[] args) {  
        Dog dog = new Dog();  
        dog.makeSound();  
        dog.eat();  
    }  
}

//Cat类
package com.abs;  
  
public class Cat extends Animal{  
    @Override  
    public void eat() {  
        System.out.println("我是一只猫我会吃老鼠");  
    }  
  
    @Override  
    public void makeSound() {  
        System.out.println("我是一只猫,我会喵喵喵");  
    }  
  
    public static void main(String[] args) {  
        Cat cat = new Cat();  
        cat.eat();  
        cat.makeSound();  
    }  
}
  • 但反过来看,Animal类中的两个方法方法体中的内容就可以不用写了,因为,每个动物子类都有自己的客体化差异,都需要将这些方法进行重写,这时候我们就可以使用abstract修饰符将Animal类修饰为抽象类,将Animal类中的方法,修饰为抽象方法,如下方代码所示:
package com.abs;  
  
//public class Animal {  
public abstract class Animal {  
//使用abstract修饰符,告诉编译器Animal类是一个抽象类  
    /*public void eat(){  
        System.out.println("我是一个动物,我正在吃饭");  
    }*/    
    public abstract void eat();
    //将方法设置为抽象的方法,这样此方法在子类就必须要重写,否则会报错,这实际上是一种安全机制  
    //public void makeSound(){  
    //    System.out.println("我是一个动物,我会哇哇叫");  
    //}    
    public abstract void makeSound();//将此方法改为抽象方法  
}
  • 这时候我们再运行发现,任然可以运行,且animal类逻辑更加清晰,且更加清爽了。

概念

  • 抽象类以及抽象方法其目的在于,给子类指定实现的规则,并要求子类对其进行完善
  • 抽象类方法可以强制让子类通过重写实现父类的方法,除非子类也是抽象类

image.png

  • 抽象类中可以有抽象方法也可以有普通方法,但抽象方法必须在抽象类中
  • 抽象类其本身不能被示例化,因为抽象类中的抽象方法没法被调用,实例化没有意义