文章目录
一. 抽象方法和抽象类
-
一般的:习惯把abstract写在最前面。
-
使用abstract修饰且没有方法体的方法称为抽象方法。
特点:- 使用抽象abstract修饰,方法没有方法体,留给子类去实现/覆盖
- 抽象方法修饰符不能是private和final以及static。
- 抽象方法必须定义在抽象类或接口中
-
使用abstract修饰的类:
特点:- 不能创建实例即不能new一个抽象类,即使创建出抽象类对象,调用抽象方法,根本没有方法体。
- 可以不包含抽象方法,若一旦包含,该类必须作为抽象类,抽象类可以包含普通方法(留给子类
调用),抽象类是有构造器的,子类构造器必须先调用父类构造器。 - 若子类没有实现/覆盖父类所有的抽象方法,那么子类也得作为抽象类(抽象派生类)
- 构造方法不能都定义成私有的,否则不能有子类(创建子类对象前先调用父类构造方法)
- 抽象类不能使用final修饰,因为必须有子类,抽象方法才能得以实现。
- 是不完整的类,需做为父类(必须要有子类),功能才能得以实现。
-
抽象类中可以不存在抽象方法,防止外界创建对象。
-
抽象类和普通类的区别:
普通类有的成员(方法,字段,构造器)抽象类都有,只是不能创建对象,可以包含抽象方法。
新建AbstractDemo.java
//抽象方法的Demo
//图形
abstract class Graph
{
abstract Double area();
}
//圆
class Circle extends Graph
{
private Double r;
Circle(Double r){
this.r = r;
}
Double area(){
return 3.14 * r * r;
}
}
//矩形
class Rectangle extends Graph
{
private Double x;
private Double y;
Rectangle(Double x,Double y){
this.x = x;
this.y = y;
}
Double area(){
return x * y;
}
}
//三角形
class Triangle extends Graph
{
private Double a;
private Double b;
private Double c;
Triangle(Double a,Double b,Double c){
this.a = a;
this.b = b;
this.c = c;
}
Double area(){
Double p = (a + b + c) / 2.0;
return Math.sqrt(p*(p - a)*(p - b)*(p - c));
}
}
class AbstractDemo
{
public static void main(String[] args)
{
System.out.println(new Circle(Double.valueOf(10)).area());
System.out.println(new Rectangle(Double.valueOf(10),Double.valueOf(10)).area());
System.out.println(new Triangle(Double.valueOf(3),Double.valueOf(4),Double.valueOf(5)).area());
}
}