抽象类
用abstract修饰的类 ,就是抽象类,抽象类不能被实例化 ,用来被继承 ,作为模板
抽象类属性
方法:抽象类中可以有抽象方法 ,有抽象方法的类一定是抽象类。
构造方法: 有, 但是不能被实例化 为子类实例化
抽象方法:abstract修饰 没有方法体的方法
抽象类是单继承。
例如:
// 定义了一个抽象方法 计算图形的面积
public abstract double sumArea();
抽象类不能被实例化 有构造方法 (为子类实例化)
抽象父类代码
package com.Abstract.my;
public abstract class Graph {
public String name;//图形名称
private double length;//周长
private double area;//面积
public abstract double sumLength();
public abstract double sumArea();
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getArea() {
return area;
}
public void setArea(double area) {
this.area = area;
}
public Graph(String name, double length, double area) {
super();
this.name = name;
this.length = length;
this.area = area;
}
public Graph() {
super();
}
public Graph(String name) {
super();
this.name = name;
System.out.println("图形名称:");
}
@Override
public String toString() {
return "Graph [name=" + name + ", length=" + length + ", area=" + area + "]";
}
}
子类在继承的时候必须继承父类的抽象方法,否则会报错。
子类代码
package com.Abstract.my;
public class Round extends Graph {
private double r;
public double getR() {
return r;
}
public void setR(double r) {
this.r = r;
}
public Round(String name, double length, double area, double r) {
super(name, length, area);
this.r = r;
}
public Round(String name, double r) {
super(name);
this.r = r;
}
public Round() {
super();
}
@Override
public double sumLength() {
// TODO Auto-generated method stub
return 3.14 * 2 * r;
}
@Override
public double sumArea() {
// TODO Auto-generated method stub
return 3.14 * r * r;
}
public static void main(String[] args) {
// 抽象类构造方法的作用:为子类实例化
double r = 3;
Graph graph = new Round("圆形", r);
System.out.println(graph.name);
// 调用计算周长和面积的方法
// 编译期调用父类的抽象方法 实际运行是子类重写的抽象方法
System.out.println("半径:"+ r );
System.out.println("面积:"+graph.sumArea());
System.out.println("周长:"+graph.sumLength());
}
}
在实例化对象的时候不能
Graph g = new Graph();//这样是错误的
正确的应该是
Graph graph = new Round();