抽象类
抽象类是什么
简单地说,抽象类就是被abstract修饰的类
抽象类的作用
提取子类中的公共方法,但是不提供具体的实现
抽象类有什么
-
构造器
-
普通属性
-
普通方法
-
抽象方法(用abstract修饰的方法)
- 使用abstract修饰方法
- 没有方法体
注意1:抽象类与普通类的区别
- 使用abstract修饰类
- 多了抽象方法
注意2:抽象类虽然有构造器,但是不能用抽象类创建对象,其意义在于子类继承之后,由子类实现抽象类的抽象方法,从而体现多态(向上造型)。
注意3:抽象类的继承与普通继承一样具有传递性:如果子类不想实现父类的抽象方法,那么子类也可以成为抽象类,由下一代来实现(爷爷的愿望—>父亲无法完成—>孙子继承爷爷的愿望)
抽象类的简单示例
package day20191106;
public abstract class AbstrClass {
//普通变量
int a;
int b;
//构造器
public AbstrClass() {
}
//普通方法
public void method() {
}
//构造方法
public abstract void abstrMethod();
}
package day20191106;
public class Demo01 extends AbstrClass{
@Override
public void abstrMethod() {
// TODO Auto-generated method stub
}
}
关于抽象类的一些小tip
- 抽象类不一定有抽象方法
- 有抽象方法的类一定是抽象类
- 抽象方法的意义在于被继承,而不是被调用
- abstract不能和final一起使用
- 被final修饰的类不能被继承、被final修饰的方法不能被重写,这与抽象类的意义冲突
- 抽象类可以有构造器,但是不能被实例化
- 通过子类的向上造型来实例化
接口
接口是什么
接口是特殊的抽象类,特殊之处如下:
- 不使用abstract修饰,而使用interface修饰,且没有class关键字
- 内部没有普通属性,只有常量(默认添加public、static、final,且只能在声明的同时初始化)
- 内部没有普通方法,只能有抽象方法,且方法声明时不用写abstract和访问控制符,接口会默认给所有方法添加abstract和public(因此也不存在构造器)
- 接口不能被继承,只能被子类实现
接口的意义
- 规范动作
- 扩展功能
接口的使用
- 关键字:implements,表示当前类实现该接口
注意1:接口的实现与继承不同
- 继承:一个子类只能继承一个父类
- 接口:一个子类可以同时实现多个接口,一个接口也可以被多个子类实现
注意2:extends可以与implements一起使用,但是继承必须在实现接口之前
- 所有类都默认继承了Object,即使是实现接口的子类也不例外
注意3:接口可以继承接口(extends),且一个接口可以继承多个接口
接口的简单示例
接口1
package day20191106;
//接口1
public interface InterClass1 {
void method();
}
接口2
package day20191106;
//接口2
public interface InterClass2 {
int a = 0;
int b = 0;
void method1();
void method2();
}
子类同时实现接口1和接口2
package day20191106;
//子类同时实现接口1和接口2,如果有更多的接口需要实现,只需要用“,”分割多个接口
public class Demo02 implements InterClass1,InterClass2{
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
@Override
public void method() {
// TODO Auto-generated method stub
}
}
子类继承抽象类AbstrClass,同时实现接口1和接口2
package day20191106;
//extends与implements共同使用
public class Demo02 extends AbstrClass implements InterClass1,InterClass2{
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
@Override
public void method() {
// TODO Auto-generated method stub
}
@Override
public void abstrMethod() {
// TODO Auto-generated method stub
}
}
接口继承接口
package day20191106;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
//接口继承接口(一对多)
public interface InterClass1 extends MouseListener,KeyListener{
void method();
}
对比
普通类、抽象类、接口的区别
普通类 | 抽象类 | 接口 | |
---|---|---|---|
构造器 | ✔ | ✔ | ✖ |
普通属性 | ✔ | ✔ | ✖ |
常量 | ✔ | ✔ | ✔ |
普通方法 | ✔ | ✔ | ✖ |
抽象方法 | ✖ | ✔ | ✔ |
父、子类关系 | extends | extends | implements |
创建对象的方式 | 直接创建或者子类向上造型 | 子类向上造型 | 子类向上造型 |
继承与实现
继承extends | 实现implements | |
---|---|---|
类-类 | 1-1 | 无 |
类-接口 | 无 | 1-N |
接口-类 | 无 | 无 |
接口-接口 | 1-N | 1-N |