抽象类和接口
1.1抽象类和抽象方法
1.1.1抽象类的定义
abstract class 类名{
成员变量定义;
方法(){…} //定义具体方法
abstract 方法(); //定义抽象方法
{
【注意】
- 抽象类中可以包含具体方法和抽象方法(抽象类中可以不含具体方法,也可以不含抽象方法,但是有抽象方法的类必须定义为抽象类)
- 抽象方法没有方法体。
- 抽象类不能实例化为对象(即不能new)
- 一个普通的类继承抽象类时,必须重写抽象类中的抽象方法。
- 抽象类的子类可以实例化对象。
1.1.2抽象类的应用
abstract class Shape{ //定义抽象类
abstract public double area(); //抽象方法
}
class Triangle extends Shape{ //定义抽象类的子类Triangle类
private double a,b,c;
public Triangle(double a, double b, double c) { //Triangle类的构造方法
this.a = a;
this.b = b;
this.c = c;
}
@Override
public double area() { //重写抽象类的area()方法
double p = (a+b+c)/2;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
}
class Cricle extends Shape{ //定义抽象类的子类Cricle类
private double r;
public Cricle(double r) { //Cricle类的构造方法
this.r = r;
}
@Override
public double area() { //重写抽象类的area()方法
return Math.PI*r*r;
}
}
public class Ex01 {
public static void main(String[] args) {
Shape s[] = new Shape[2]; //定义Shape类型的数组
s[0] = new Triangle(25,41,50); //抽象类不能实例化对象,所以要通过其子类实例化对象(父类引用指向子类对象)
s[1] = new Cricle(47);
for (int n = 0; n<s.length; n++){
System.out.println(s[n].area());
}
}
}
1.2接口
Java不支持多重继承,而是通过接口实现比多重继承更强的功能。
1.2.1接口定义
[public] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 域类型 域名 = 常量值;
[public] [abstract] 返回值类型 方法名(参数列表)[throws 异常列表];
}
【注意】
- 接口的访问控制符为public,尽管不写public,也会默认为publc ( 建议在声明接口时写上public)
- 接口中所有属性的修饰默认是public static final,也就是均为静态常量。
- 接口中所有方法的修饰默认是public abstract,也就是接口中的方法都是抽象方法(如果实现某接口的类没有将接口所有的抽象方法具体实现,则编译时将提示该类为抽象类,而抽象类是不能创建对象的)
- 接口具有继承性,一个接口还可以继承多个父接口,父接口间用逗号分割。
- 接口是抽象类的一种,也不能用于创建实例对象。
- 接口的作用在于规定一些功能框架,具体功能的实现则由遵守该接口约束的类去完成