什么是抽象类(abstract):
首先你要了解什么是普通类:
普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。
抽象类是指在普通类的结构里面增加抽象方法的组成部分。那么它相当于重写了普通类,将普通类重写为一个抽象类,所以具有普通类所包含的所有方法和变量等内容。
什么叫抽象方法:
在所有的普通方法上面都会有一个“{}”,这个表示方法体(函数的身体),有方法体的方法一定可以被对象直接使用。而抽象方法,是指 没有方法体 的方法,同时抽象方法所在的类还必须使用关键字abstract做修饰。
小结:拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明!
栗子:
abstract class A{
//定义一个抽象类
publicvoidfun(){//普通方法
System.out.println("存在方法体的方法");
}
publicabstractvoidprint();//抽象方法,没有方法体,所在的类会被abstract关键字做修饰
}
这个栗子中它既有普通方法,也有抽象方法,所以它是一个抽象类!
当运行一个抽象类的时候:
publicclass TestDemo {
publicstaticvoidmain(String[] args) {
A a = new A();
}
}
结果:
Exception in thread "main" java.lang.Error: Unresolvedcompilation problem:
线程“main”java.lang中的异常。错误:未解决的编译问题:
Cannot instantiate the typeA
不能实例化类型 A
at com.wz.abstractdemo.TestDemo.main(TestDemo.java:15)
由此可知, A是抽象的,无法直接进行实例化操作 ,为什么不能直接实例化?
当一个类实例化之后,就意味着这个对象可以调用类中的属性或者方法,但在抽象类里存在抽象方法,而抽象方法没有方法体,没有方法体就无法调用。既然无法进行方法调用的话,就不会产生实例化对象。
栗子:
abstract class A{//定义一个抽象类
publicvoid fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
//B类是抽象类的子类,是一个普通类
class B extends A{
//重写:抽象方法没有方法体,无法调用,所以要重写!
@Override
publicvoid print() {
System.out.println("Hello World !");
}
}public class Test Demo {
public static void main(String[] args) {
A a = new B();//向上转型
a.fun();//被子类所覆写的过的方法
}
}
小结:
1.抽象类实际上就比普通类多了一些抽象方法,其他组成部分和普通类完全一样;
2.普通类对象可以直接实例化,但抽象类的对象必须经过向上转型之后才可以得到。
3.抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类(单继承);
4.子类(如果不是抽象类,普通类)则必须重写抽象类之中的全部抽象方法。抽象方法没有方法体,没有方法体就无法调用,所以必须重写!(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);
所有的子类如果要想正常的完成操作,必须按照指定的方法(抽象方法)进行重写才可以,
而这个时候抽象类所起的功能就是定义模板的功能。
抽象类中的构造函数:
抽象类中构造函数的运用:
栗子:
abstract class A{//定义一个抽象类
publicA(){
System.out.println("*****A类构造方法*****");(先)
}
publicabstractvoidprint();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A{
public B(){
System.out.println("*****B类构造方法*****");
}
@Override
public void print() {//强制要求重写
System.out.println("Hello World !");(后)
}
}public class TestDemo {
public static void main(String[] args) {
A a = new B();//向上转型
}
}
注意:虽然一个类的子类可以去继承任意的一个普通类,可是从开发的实际要求来讲,普通类尽量不要去继承另外一个普通类,而是去继承抽象类(规约作用)。
什么是接口(Interface)?
接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
两个要注意的点:
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法,接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
1. 接口无法被实例化,但是可以被实现:
一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。还可以定义变量,但接口中的变量会被隐式的指定为public static final(成为了一个常量)
2. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法(等待继承)
接口小结:
1.接口不能用于实例化对象。
2.接口没有构造方法。
3.接口中所有的方法必须是抽象方法。
4.接口不能包含成员变量,(除 static 和 final 变量)。
5.接口不是被类继承了,而是要被类实现。
6.接口支持多继承。
总结:抽象类和接口对比:
1. 抽象类中的方法可以包含普通方法,在接口中,只能包含抽象方法,不能包含普通方法。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的(常量)。
3. 接口中不能含有静态代码块以及静态方法(使用static 修饰的方法),而抽象类是可以有静态代码块和静态方法,比如:构造方法
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。就是说抽象类是单继承,接口是多实现!!!
由此可见:抽象类实际是普通类的一种特殊情况,而接口是抽象类的一个集合!