抽象类
在面对对象中所有的对象都是通过类来描绘的,但是反过来,并不是所有的来都是用来描绘对象的;
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
有很多人对抽象类有着很大的疑惑,有时明明一个普通类就可以解决了,为什么非要整个抽象类
(1) 抽象类有一个特征,其抽象方法,必须在子类重写(子类非抽象类),所以,当我们父类的方法,必须要子类重写实现时,用抽象类。例如:学生和老师在上课时都需要去教室,但是学生时听课。而老师是授课,要是写一个ToClass()方法,就需要用到抽象类
(2)跟接口相比,接口的方法必须由实现类全部实现,接口方法比较多时,就会麻烦,而抽象类没有这样的限制。比如jdk 里面的 AbstractList,是ArrayList 的父类,里面全是方法,你只需要重写自己需要的
抽象类的特点
1、abstract 修饰符可以用来修饰方法,也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类
2、抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类
3、抽象类不能使用 new 关键字来创建对象,它是用来让子类继承的
4、抽象方法只有方法的声明,没有方法的实现(没有方法体),它是用来让子类实现的
5、 在继承抽象类时一定要对父类的抽象方法进行实现 (否则代码会出现编译错误)或是将子类也改写为抽象类;
6、抽象类只能单继承
抽象类的定义格式:
1 abstract class 抽象类名称{ 2 属性; 3 访问权限 返回值类型 方法名称(参数){ //普通方法 4 [return 返回值]; 5 } 6 访问权限 abstract 返回值类型 方法名称(参数); //抽象方法 7 }
代码示例:
定义一个Animal抽象类,和两个普通类Cat和Dog,两个类都继承了Animal类,并在类中实现了抽象方法;
//一个抽象类
abstract class Animal {
public String sex;
//抽象方法(没有方法体)
public abstract void eat();
//普通方法
public void run(){
System.out.println("动物跑... ...");
}
}
//继承这个抽象方法
public class Dog extends Animal {
//实现这个方法
public void eat() {
System.out.println("狗吃骨头");
}
}
//继承这个抽象方法
public class Cat extends Animal{
//实现这个方法
public void eat() {
System.out.println("猫咪吃鱼");
}
}
在main中运行:
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.eat();
Dog dog = new Dog();
dog.eat();
}
}
运行结果: