【Java】6.5 抽象类

目录

抽象类和抽象方法

为什么要使用抽象类


抽象类和抽象方法

抽象类:使用abstract修饰的类就是抽象类。总结起来,抽象类的特性就是有得有失:

  • 得:就是可以设置抽象方法
  • 失:就是不能创建实例
  • 其他的普通类可以有的抽象类也可以有

抽象类的注意点

  1. 虽然抽象类不能创建实例,但他依然有构造器,它的构造器主要是供其子类构造器调用的
  2. 抽象类自己完全没有抽象方法
  3. 抽象类总是不能创建实例的 —— 即使它没有包含任何抽象方法

抽象方法:使用abstract修饰且没有方法体(即没有花括号的方法)

抽象方法的注意点

  1. 抽象方法没有方法体
  2. 只要在方法后出现花括号,即使花括号中没有任何代码,那也是方法体
  3. abstract不能与final同时出现:
    1. 对于abstract方法而言,该方法需要子类去重写该方法,final不允许被重写,因此不能同时出现
    2. 对于abstract类而言,该类是希望有子类去继承它的,final修饰的类是不允许被继承的
  4. abstract与static不能同时修饰方法(见注释1
  5. abstract和private不能同时修饰方法,因为abstract修饰的方法希望被子类重写,而private修饰的方法子类是无法获取的

为什么要使用抽象类

主要和“模板模式”结合在一起

需求场景:程序需要实现A方法,但是A方法又需要调用B方法。但此时,B方法暂时不知道如何实现(不同的子类对B方法的实现【是不同】)。此时就是需要把B方法定义成抽象方法。

Volume.java

//定义一个抽象类
public abstract class Volume {
	public Volume() {

	}

	// 定义一个抽象的实现求体积的方法
	public abstract double getVolume();
}

Cube.java 


public class Cube extends Volume {

	// 定义成员变量,正方体的边长
	private double edge;

	// 定义一个无参数的构造器,一个有参数构造器
	public Cube() {

	}

	public Cube(double edge) {
		this.edge = edge;
	}

	// 因为成员变量时private修饰,所以需要setter和getter方法获取相关数据
	public double getEdge() {
		return edge;
	}

	public void setEdge(double edge) {
		this.edge = edge;
	}
	// 重写getVolume方法
	@Override
	public double getVolume() {
		return edge * edge * edge;
	}


}

Cylinder.java


public class Cylinder extends Volume {
	// 定义成员变量,圆柱体的底面半径和高
	private double radius;
	private double height;

	// 创建两个构造器,一个无参数构造器,一个有参数构造器
	public Cylinder() {

	}

	public Cylinder(double radius, double height) {
		this.radius = radius;
		this.height = height;
	}

	/// 因为成员变量时private修饰,所以需要setter和getter方法获取相关数据
	public void setRadius(double radius) {
		this.radius = radius;
	}

	public double getRadius() {
		return radius;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	public double getHeight() {
		return height;
	}

	// 重写getVolume方法
	@Override
	public double getVolume() {

		return Math.PI * radius * radius * height;
	}
}

AbstractTest.java


public class AbstractTest {
	public static void main(String[] args) {
		// 多态,向上转型
		Volume cylinder = new Cylinder(3.14, 5.56);
		Volume cube = new Cube(5.6);
		System.out.println("圆柱体的体积:" + cylinder.getVolume());
		System.out.println("正方体的体积:" + cube.getVolume());

	}
}

【注释1】当static修饰方法的时候,说明这个方法属于类本身。调用这个方法时,可以直接通过类调用。当使用abstract修饰该方法时,该方法是没有方法体的。此时,若通过类调用该方法,就会出现错误(调用没有方法的方法体)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_之桐_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值