Java抽象类

1.抽象方法和抽象类

1.1抽象方法和抽象类的规则

  • 抽象方法与抽象类必须由abstract修饰符修饰,同时,抽象方法不能拥有方法体;
  • 抽象类无法实例化,不能由new来调用抽象类的构造器来创建实例;
  • 抽象类可以有①成员变量、②方法(普通方法和抽象方法都可以)、③构造器(不能用于创建实例,限于被子类调用)、④初始化块、⑤内部类(接口、枚举);
  • 含有抽象方法的类只能被定义为抽象类。

1.2抽象方法及抽象类的代码示例

因为抽象方法的使用,主要利用的是子类可以重写补充父类的抽象方法,所以可以充分发挥出多态的作用,使程序灵活化。
举例:父类为shape,用于定义出图形的特点,定义了图形的边长、形状,不同的图形的边长是不一样的,所以需要子类Triangle、Circle来补充延伸父类中定义的抽象类方法,希望大家可以仔细看代码中的注释,可以便于大家理解;
父类Shape的代码:

// 定义一个抽象类
public abstract class Shape {
	// 抽象类中可以有初始化块
	{
		System.out.println("这是一个抽象类初始化块中的代码。");
	}
	
	private String color;
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	// 一个用于计算周长的抽象方法供子类实现
	public abstract double calPerimeter();
	// 一个用于返回形状的方法
	public abstract String getType();
	// Shape抽象类的构造器,不创建实例对象,提供给子类调用
	public Shape() {};
	public Shape(String color) {
		System.out.println("执行Shape的构造器");
		this.color = color;
	}
}

子类Triangle中的代码:

// 子类继承
public class Triangle extends Shape{
	// 定义三角形的边长,并用private进行保护
	private double a;
	private double b;
	private double c;
	
	// 构造器,用于初始化,获得color,并运行setSides方法,对边进行赋值
	public Triangle(String color , double a , double b , double c) {
		// TODO Auto-generated constructor stub
		super(color);
		this.setSides(a, b, c);
	}
	
	// 判断输入的三边是否符合要求,如符合则赋值给a,b,c
	public void setSides(double a , double b , double c) {
		if(a >= b + c || b >= a + c || c >= a + b) {
			System.out.println("不符合两边之和大于第三边。");
			return;
		}
		this.a = a;
		this.b = b;
		this.c = c;
	}
	
	// 继承父类的抽象方法进行重写,实现周长的计算
	@Override
	public double calPerimeter() {
		// TODO Auto-generated method stub
		return a + b + c;
	}
	
	// 继承父类的抽象方法进行重写,返回图形的形状
	@Override
	public String getType() {
		// TODO Auto-generated method stub
		return "三角形";
	}
}

子类Circle中的代码(主程序):

public class Circle extends Shape{
	// 圆的半径
	private double radius;
	
	// Circle类的构造器,用于初始化图形的color及radius
	public Circle(String color , double radius) {
		// TODO Auto-generated constructor stub
		// 初始化color的值至父类的color变量
		super(color);
		// 初始化radius
		this.setRadius(radius);
	}
	
	// 初始化赋值给radius
	public void setRadius(double radius) {
		this.radius = radius;
	}
	
	// 重写父类的方法,用于计算圆的周长
	@Override
	public double calPerimeter() {
		// TODO Auto-generated method stub
		return 2 * Math.PI * radius;
	}
	
	// 重写父类的方法用于获取图形的类型
	@Override
	public String getType() {
		// TODO Auto-generated method stub
		return "圆";
	}
	
	public static void main(String[] args) {
		// 利用多态的特性,可以使用子类中重写的方法块
		// 根据构造器的不同,获取的变量不同
		Shape shape_one = new Triangle("黑色", 3, 4, 5);
		Shape shape_two = new Circle("红色", 5);
		// 打印输出执行子类中重写方法获得的值
		System.out.println("利用多态获得图形1的类型:" + shape_one.getType());
		System.out.println("利用多态获得图形1的周长:" + shape_one.calPerimeter());
		System.out.println("利用多态获得图形2的类型:" + shape_two.getType());
		System.out.println("利用多态获得图形2的周长:" + shape_two.calPerimeter());
		// getColor方法为父类独有,获得父类方法
		System.out.println("输出图形1的颜色:" + shape_one.getColor());
		System.out.println("输出图形2的颜色:" + shape_two.getColor());
	}
}

2.抽象类的作用

2.1抽象类的使用范围

因为抽象类不能创建实例,但是继承它的子类必须实现父类中的抽象方法,所以抽象类可以约束子类的方法设计,可以使方法较为统一,做到模板化设计,抽象方法可以作为所有子类的通用模板。
抽象父类可以把需要依据子类特性来实现的方法定义为抽象方法,让子类继承后重写并实现方法的细节;
父类中的部分方法可能需要子类的协助,可以并不完全由自身实现,这就看设计者的思路了;
抽象类利用了面向对象的三大特征之一的多态的特性,利用理解好多态,对于本节的帮助较大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值