一、背景知识
父类中定义了相关子类的共同行为,也就是多个儿子继承一个父亲,但是,
java不许多重继承(即允许从几个类派生出一个子类),只能单一继承,通过extends关键字定义一个子类。多重继承可以通过接口来实现。
二、抽象类
抽象方法
抽象方法是出现在基类中的一种方法,但要求在派生类中被重写。 一个抽象方法只有方法头,没有方法主体。
访问修饰符 abstract 返回类型 方法名(参数列表);
注意,关键字 abstract 出现在方法头中,方法头以分号结尾。
public abstract void getArea();
抽象类和常规类其实很类似,但是抽象类是不能够使用new操作符创建它的实例。抽象方法只有定义而没有实现,他的实现由子类提供。一个包含着抽象方法的类必须声明为抽象类。
而在写法上,抽象类与抽象方法就是在常规类与常规方法前加个abstract
public abstract class Geometry{//抽象类Geometry
private String color="black";
private boolean filled;
protected Geometry(String color,boolean filled){
this.color=color;
this.filled=filled;
}//protected就是对于他的子类是public,对于其他类是private
public String getColor(){
return color;
}
public boolean isFilled(){
return filled;
}
public abstract double getArea();
public abstract double getPerimeter();
//都是抽象方法
}
public class Circle extends Geometry{
//……
}
public class Rectangle extends Geometry{
//……
}
为什么要使用抽象方法
例如上述的结构体里Geometry里面,我们有很多的子类,例如三角形,矩形,圆形,我们要比较他们的面积的时候
直接调用area会写的很乱,而且会涉及一堆子类
当然用多态也是一个选择
但是对于大类Geometry而言,我们很明显是不需要去计算它的getArea的值的
同时,如果运用多态的话在Geometry类里面我们还需要去写个判断他是从哪个子类向上转型转过来的,这时候很明显会有多余的操作和内存占取
抽象类便派上用处了,对于大类Geometry而言,是无法调用该函数的,他只负责定义
对于子类而言,我们则可以在子类中重写该函数,也就是将所谓父类中的抽象函数具体化,这时候,我们只需要向上转型完之后直接调用即可
同时可以直接写函数去比较抽象方法的返回值
public static boolean equalArea(Geometry a,Geometry b){
return a.getArea()==b.getArea();
}
抽象类的注意事项
1、抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的
2、抽象类是不能用new操作符来初始化的,但是仍然可以定义它的构造方法,这个构造方法在他的子类的构造方法中调用。
3、包含抽象方法的类必须是抽象类
4、子类可以覆盖父类的方法并将它定义为abstract,比如它在当父类的方法实现在子类中变得无效时是很有用的。
5、即使子类的父类是具体的,这个子类也可以是抽象的
6、不能用new操作符从一个抽象类中创建一个实例,但是抽象类可以用作一种数据类型
三、接口
接口,也是类,不过是一种特殊的类,接口里面只有方法的定义,没有方法体,也就是说,接口是纯度100%的抽象类。
既然有了抽象类这个概念,为什么要再创建一个名为接口的东西呢?
抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。
语法实现
为了声明一个接口,我们使用interface这个关键字,在接口中的所有方法都必须只声明方法标识,而不要去声明具体的方法体,
接口中的属性默认为Public Static Final.一个类实现这个接口必须实现这个接口中定义的所有的抽象方法。
//一个简单的接口
interface example{
final int a=10;
//final 不允许继承与覆盖,同时如果定义为常量,该常量不允许修改
void load();
为什么要用接口
平时里提到接口就会想到usb,typeC这类的接头
其实这类接头也算接口
interface usb{
void read();
void write();
}
interface typeC{
void read();
void write();
}
class Shubiao implements usb{
public void read(){
System.out.println("reading from mouse");
}
public void write(){
System.out.println("writing to mouse");
}
}
class Sianpan implements usb{
public void read(){
System.out.println("reading from jianpan");
}
public void write(){
System.out.println("writing to jianpan");
}
}
public class MAIN{
public static void main(String[] args){
Shubiao s=new Shubiao();
s.read();
Jianpan j=new Jianpan();
j.raad();
}
}
关于接口的注意事项
1、我们不能直接去实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的
2、我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法。
3、一个类可以实现不止一个接口。
4、一个接口可以继承于另一个接口,或者另一些接口,接口也可以继承,并且可以多继承。
5、一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。
6、接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的。
7、接口用来弥补类无法实现多继承的局限。
8、接口也可以用来实现解耦。