设计图形抽象类java_Java基础——抽象类
参考资料
《Java语⾔程序设计(基础篇)》—— Y.Daniel Liang
前⾔
本⼈菜鸟,⼊IT只为当⿎励师。本编⽂章旨在对 Java 中的 抽象类 做总结
⼀、抽象类
1. 定义⼀个抽象类
// 抽象类
public abstract class Shape {
// 可以有属性
// private String color;
/
/ 可以有普通⽅法
/* public void setColor(String color) {
}
public String getColor() {
lor;
}
*/
// 抽象⽅法
public abstract double getArea(); // 获取⾯积
public abstract double getPan(); // 获取周长
public abstract void printShape(); // 获取周长
}
上⽅代码中的Shape类是⼀个抽象类,它表⽰⼀种形状。它拥有两个抽象⽅法, 分别为 getArea() 和 getPan()。
抽象类需要在类头使⽤ abstract 修饰符修饰
抽象类中未实现的⽅法也必须加 abstract 修饰符修饰,我们把这些⽅法称为抽象⽅法。(区分于接⼝,接⼝中的⽅法默认修饰为 public abstract,不管有⽆加修饰词)
抽象类中不仅可以含有抽象⽅法,还可以拥有⾃⼰的数据成员,包括属性和普通⽅法。(区分于接⼝,接⼝中的⽅法必须是抽象⽅法,属性必须被 public final static 修饰)
2. 继承抽象类并实现其抽象⽅法
public abstract class ShapeTest extends Shape{
public abstract double getArea(); // 获取⾯积
public abstract double getPan(); // 获取周长
public void printShape() { // 输出形状信息
System.out.println("我实现了Shape类的printShape⽅法,但没有实现其他两个⽅法,所以我还是⼀个抽象类"); }
}
// 正⽅形类
public class Square extends Shape {
private double len; // 边长
protected Square(double len) {
this.len = len;
}
public double getArea() {
return len * len; // 边长 × 边长
}
public double getPan() {
return 4 * len; // 4 × 边长
}
public void printShape() {
System.out.println("正⽅形");
}
}
// 圆形类
public class Circle extends Shape {
java接口可以创建对象吗private double r; // 半径
protected Circle (double r) {
this.r = r;
}
public double getArea() {
return Math.PI * r * r; // π × 半径^2
}
public double getPan() {
return Math.PI*r*2; // 2 × π × 半径
}
public void printShape() {
System.out.println("圆形");
}
}
⼆、要点
抽象⽅法不能包含在⾮抽象类中。如果抽象⽗类的⼦类不能实现所有抽象⽅法,那么⼦类也必须定义为抽象。
包含抽象⽅法的类必须是抽象的。但可以定义⼀个不含抽象⽅法的抽象类,作⽤是使类不能创建实例,⽤来定义新⼦类的基类。
抽象类不可以创建对象,否则抛出 InstantiationException 异常(使⽤newInstance()⽅法创建抽象类或接⼝实例抛出的异常)。但是仍然可以定义它的构造⽅法,这个构造⽅法在它⼦类的构造⽅法中调⽤。
抽象类不可以⽤final修饰。因为抽象⽅法的实现由⼦类提供,需要⼦类继承该抽象类,⽽⽤了final修饰的类不能被继承。
即使⼦类的⽗类是具体的,这个⼦类也可以是抽象的。例如,Object类是具体的,但它的⼦类Shape是抽象的(所有类均继承Object类)。
⼦类可以覆盖⽗类的⽅法并将它定义为abstract。这很少见,作⽤是实现⽗类的⽅法在⼦类中变得⽆效。
抽象类的构造函数要定义为protected,因为它只被⼦类使⽤。
三、抽象类的好处
抽象类可以包含⽅法的实现细节,因此可以将⼦类中公⽤的逻辑上提,增加的代码的复⽤。
抽象类可以通过⽅法的覆盖来实现多态的属性,也就是运⾏期绑定,由JVM在运⾏时期根据对象的类型动态地决定调⽤哪⼀个⽅法。如下⾯的代码:
Shape square = new Square(2);
Shape circle = new Circle (3);
square.printShape(); // 正⽅形
circle .printShape(); // 圆形
circle .getArea(); // 9π
circle .getPan(); // 6π
四、抽象类的UML图形记号
在UML图形记号中,抽象类和抽象⽅法的名字⽤斜体表⽰。
五、⽰例:抽象的Number类
Number类 来⾃于 java.lang.Number,它是数值包装类、BigInteger、BigDecimal的抽象⽗类。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论