l 抽象类和抽象方法
抽象类和抽象方法:使用abstract关键字修饰的类和方法就成了抽象类和抽象方法,格式与普通类和方法类似。
抽象类的特性:
·有抽象类就要有继承的子类去实现抽象类中的抽象方法。
·抽象类中可以定义普通类中定义的所有成员,并且只有在抽象类中才能定义抽象方法。
·抽象类中不能new对象,抽象类中的对象是给子类调用的。
·在抽象类中定义的方法,在其普通子类中必须实现所有抽象父类中定义的所有抽象方法,否则这个子类也要申明成抽象类。
·抽象类中可以定义构造器,但不能用于创建对象,而是在其子类创建子类的对象时来调用这个构造器来完成抽象类的初始化操作。
·抽象类也是类,跟普通类只是稍有差别而已,所以继承它的子类也会继续它的方法和属性等成员。
·实现抽象类不需要extends也可以,使用匿名内部类;并且不需要写extends继承关键字。
抽象方法的特性:
·抽象方法只有方法声明没有方法实现
·抽象方法是准备在子类中实现的,它只是一个模板。
没有抽象属性和抽象变量一说。
注意:
abstract与final不能同时修饰一个方法或类。因为final修饰的方法不能被重写而abstract修饰的方法需要在子类实现(重写);final修饰的类不能有继承,而abstract修饰的类是抽象类必须要有子类,因此这两个修饰符冲突,不能一起使用。
abstract与static不能同时修饰一个方法。static修饰方法属于类方法,可以被“类.方法”类直接调用,而abstract修饰的方法是抽象方法,没有方法体,是需要在子类中重写的方法。因此static不能与abstract同时修饰一个方法。
abstract与private不能同时修饰一个方法。private修饰的方法只能在当前类被调用,而abstract修饰的抽象类必须要在子类中被重写才有意义,如果父类中方法权限是private那么这个方法对子类是透明的。因此private不能同时修饰一个方法。
·抽象类的作用:
抽象类就是一个模板,也叫模板设计模式。父类提供了多个子类的通用方法,并且把一个或多个方法留给子类实现,这就是模板模式。
例子:抽象类
public abstract class SpeedMeter
{
private double trunRate;
public abstract double getRadius();
public void setTruneRate(double trunRate)
{
this.trunRate = trunRate;
}
//计算车速的通用算法,周长 x 转速 = 速度
public double getSpeed()
{
return java.lang.Math.PI * 2 * trunRate * this.getRadius();
}
}
public class Car extends SpeedMeter
{
public double getRadius()
{
return 5.0;
}
public static void main(String[] args)
{
Car ca = new Car();
ca.setTruneRate(10.0);
System.out.println(ca.getSpeed());
}
}
例子:抽象类中定义构造器(这个例子摘自某Java书籍)
public abstract class Shape
{
{
System.out.println("执行Shape的初始化块...");
}
private String color;
public abstract double calPerimeter();
public abstract String getType();
public Shape(){}
public Shape(String color) //通过多态创建子类的对象,然后同时传入一个参数到这里。
{
System.out.println("执行Shape的构造器...");
this.color = color;
}
public void setColor(String color)
{
this.color = color;
}
public String getColor()
{
return this.color;
}
}
---------------------------------------------------------
public class Circle extends Shape
{
private double radius;
public Circle(String color , double radius) //下面创建对象,传入参数
{
super(color);
this.radius = radius;
}
public void setRadius(double radius)
{
this.radius = radius;
}
public double calPerimeter()
{
return 2 * Math.PI * radius;
}
public String getType()
{
return getColor() + "圆形";
}
public static void main(String[] args)
{
Shape s2 = new Circle("黄色" , 3); //多态,创建子类对象。
System.out.println(s2.getType());
System.out.println(s2.calPerimeter());
}
}