今天的博客主题
基础篇 --》面向对象 --》Java抽象类
什么是抽象类
在Java中抽象类就是对一项事物无法描述清楚,没有足够的信息来描述这个对象的类就是抽象类。
抽象类和普通类唯一区别就是不能被实例化。其他功能抽象类和普通类一样正常使用。
通过关键字abstract来声明一个抽象类。
抽象类只能被继承,不能被实例化(new)。
抽象类规则
- 抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
- 抽象类里的抽象方法必须由子类来进行重写。
- 只要包含一个抽象方法的类,该方法必须要定义成抽象类,不管是否还包含有其他方法。
- 抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
- 子类中的抽象方法不能与父类的抽象方法同名。
- abstract不能与final并列修饰同一个类。
- abstract 不能与private、static、final或native并列修饰同一个方法。
抽象类语法
只需要abstract class 就可以声明一个抽象类
public abstract class HelloWorld {
public void method1(){
System.out.println("普通方法");
}
//抽象方法
public abstract void method2();
}
// 继承这个抽象类
public class Hello extends HelloWorld{
@Override
public void method2() {
System.out.println("重写了抽象类里的抽象方法");
}
}
从上放代码我们可以看出抽象方法和普通方法的区别就不累赘了。
在以下任一条件成立时,类必须定义成抽象类
- 类中有至少一个抽象方法
- 类继承了父类中的抽象方法,但是至少有一个抽象方法没有实现。
- 类实现了某个接口,但没有全部实现接口中的方法(接口是一个特殊的抽象类)
类、接口、抽象类区别
- 接口中所有的方法隐含都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法。
- 类可以实现很多个接口,但是只能继承一个抽象类。
- 类可以不实现抽象类和接口声明的所有方法,在这种情况下,类也必须得声明成是抽象的。
- 抽象类可以在不提供接口方法实现的情况下实现接口。
- 接口中声明的变量默认都是final的,抽象类可以包含非final变量。
- 接口中的成员函数默认都是public的,抽象类中的成员函数可以是private,protected或者是public的。
- 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是如果它包含main方法的话是可以被调用的。
- 抽象类中可以有普通方法,接口中不能。
- 抽象类可以有构造,接口不能。
- 抽象类中可以有普通字段,而接口中不行。
- 抽象类不能实现多继承,接口可以。
- 符合isa关系的选用抽象类,符合hasa关系的选用接口比抽象类抽象程度更高。
志当存高远