1,一个类继承了一个抽象类,需要实现父类的全部抽象方法或者声明为抽象类
2,抽象类方法的作用:
1)限制子类必须实现该方法,既然子类实现了该类的抽象方法,那么通过抽象父类就一定可以调用该方法(运行时多态)
2)解决编译时多态
3,如果一个类中包含抽象方法(没有方法体),那么这个类必须声明成抽象类。 抽象类不能实例化(new对象)。
4,抽象类是当作多态中的父类来用的。
下面是一个具体的例子,可以详细斟酌
简单来讲就是CloseFigure是一个抽象类方法,Rectangle和Circle两个类继承了它,而Rectangle类为了限制用它的类需要重写,就写成了abstract,但是它并没有抽象方法,Rectangle2类继承了Rectangle,如果它重写aa()方法,CloseFigureEx执行类就会调用重写的方法,否则就调用原来默认的aa()方法
/*
* 抽象方法的作用:
* 1.限制子类必须实现该方法。既然子类一定实现了该抽象方法,
* 那么通过抽象父类的引用就一定可以调用该方法 ---运行时
* 2.解决编译时多态。
*
*/
public abstract class CloseFigure {
private String shape;
/**
* 创建一个封闭图形
* @param shape图形形状
*/
public CloseFigure(String shape) {
//super()
this.shape = shape;
}
//抽象方法 用关键字:abstract
public abstract double area();
public abstract double perimeter();
public abstract void bb();
public void print(){
System.out.println("一个"+shape+","+this.toString()+",面积:"+this.area()+",周长:"+this.perimeter());
}
//最终方法,子类不能覆盖
public final void cc(){
System.out.println("00000");
}
}
public class Circle extends CloseFigure{
private int r;
private static double PI=3.1416;
public Circle(int r) {
super("圆");
this.r = r;
}
public Circle() {
this(0);
}
public int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
@Override
public String toString() {
return "半径:" + r;
}
@Override
public double area() {
return PI*r*r;
}
@Override
public double perimeter() {
return 2*PI*r;
}
@Override
public void bb() {
System.out.println("1111111111");
}
}
/*
* 1. 一个类继承了抽象父类,那么父类中的抽象方法要全部把它实现,
* 否则只能声明成抽象类。
* 2. 如果一个类中包含抽象方法(没有方法体),那么这个类必须声明成抽象类。
* 抽象类不能实例化(new对象)。
* 3. 抽象类是当作多态中的父类来用的。
*/
public abstract class Rectangle extends CloseFigure{
private int width;//宽
private int height;//高
public Rectangle(int width, int height) {
super("矩形");
this.width = width;
this.height = height;
}
/**
* 如果子类要实现***功能如从配置文件中读取字体,请覆盖该方法
*/
public void aa(){
}
public Rectangle() {
this(0,0);
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public String toString() {
return "长度:" + width + ", 高度:" + height;
}
public double area(){
return width*height;
}
public double perimeter(){
return (width+height)*2;
}
public void bb(){
aa();//设置字体,如果不设,则用默认字体
System.out.println("11111111111");
}
}
package hncu.cn.baseCode.day008.para3;
public class Rectangle2 extends Rectangle{
public Rectangle2() {
super();
}
public Rectangle2(int width, int height) {
super(width, height);
}
// @Override
// public void aa() {
// System.out.println("设置字体...");
// }
}
package hncu.cn.baseCode.day008.para3;
public class CloseFigureEx {
public static void main(String[] args) {
//CloseFigure g = new CloseFigure();//WA: 抽象类不能实例化
//Person p = new Student();
CloseFigure g = new Rectangle2(100, 200);
//System.out.println( g.area() );
g.print();
g.bb();
System.out.println("------------");
g = new Circle(10);
//System.out.println( g.area() );
g.print();
}
}