JavaSE-抽象类及抽象方法

关于抽象

关于Java中提供抽象方法与抽象类,抽象的含义为这个方法在当前类无法确定功能是什么,但是又是必不可少的方法!故我们使用抽象方法的定义方法——“public abstract double perimeter();”其中abstract是抽象方法的标志,类似于泛型的<T>标志。如果一个类含有抽象方法,则这个类为抽象类,需要加上abstract,即“public abstract class Shape”。

抽象类演示如下:我们生成了一个图形的抽象类,其中包含了周长perimeter和面积area两个抽象方法。

public abstract class Shape {
	private String name;
	
	public Shape() {	
	}
	
	public Shape(String name) {
		this.name = name;
	}
	public abstract double perimeter();//周长
	public abstract double area();//面积
	
	@Override
	public String toString() {
		return name;
	}
}

下面创建一个Shape的子类Triangle类,在继承父类的时候子类必须完成父类的未完成的抽象方法,否则无法构成一个类!

public class Triangle extends Shape {
	private double bottom;
	private double high;

	public Triangle() {
		this(2.0, 3.0);
	}
	
	public Triangle(double bottom, double high) {
		super("等边三角形");
		this.bottom = bottom;
		this.high = high;
	}
	
	
	public double getBottom() {
		return bottom;
	}

	public void setBottom(double bottom) {
		this.bottom = bottom;
	}

	public double getHigh() {
		return high;
	}

	public void setHigh(double high) {
		this.high = high;
	}

	@Override
	public double perimeter() {
		return 3 * this.bottom;
	}

	@Override
	public double area() {
		return this.bottom * this.high * 0.5;
	}

	
}

为了测试方便我默认这个三角形为等边三角形,之后进行测试给出任意的边长与高计算周长与面积:

Triangle EquilateralTriangle = new Triangle(1.0, 2.0);
	System.out.println(EquilateralTriangle + "周长是" + EquilateralTriangle.perimeter() + "cm");
	System.out.println(EquilateralTriangle + "面积是" + EquilateralTriangle.area() + "cm^2");

结果如右:

 抽象类核心编程思想

抽象类通常是由很多类的基础上抽象形成的,抽象类可以分为两个部分,固定的部分与变化的部分,类似于图形都会有名字、边长和面积这个就是固定的,而不同的图形的边长与面积的计算方式不同,这个即为不变的地方。

固定的部分在抽象类中实现,再用派生的方式让子类继承,从而实现“代码复用”。而那些相同又不同的部分在派生出的子类中各自实现。如果一个类存在一个当前无法实现的功能,但又需要这个方法来实现其他确定的方法,我们便可以把这个方法设定为抽象方法,在之后派生出来的子类再进行抽象方法的实现!

匿名内部类直接实例化一个抽象类

我们想要不采用派生的就可以实例化一个抽象类可以使用  “new 抽象类构造方法() { //这里实现抽象方法}”!如下所示:

new AnonymousClass("小猫") {
		public AnonymousClass fun() {
			System.out.println("可以在这里定义方法!");
			return this;
		}
		@Override
		public String cry() {
			return "喵喵咪";
		}
	}.fun().show();

能够直接实例化一个抽象类的重要原因是匿名内部类,如下所示,虽然我们无法直接看到class文件,但是当我们打开bin目录是就可以看到这些匿名类的类文件!

 

 TestAnonymous$1.class的命名规则可以说明他是一个匿名内部类,而$后面的1、2、3则是Java编译器自动添加的,这就是匿名的名称形式。

相比于派生出子类然后再实例化对象,使用匿名内部类的好处在于不需要明确生成派生类,对于简单问题可以提高效率!在需要时临时产生匿名内部类,实现抽象方法,这样更灵活!一个匿名内部类对应一种抽象方法的实现,这样更紧凑。

但是如果派生类有庞杂的不同于抽象类的成员与方法,还是使用派生的方法更合理,所以无论哪种方法都要视情况为定,抽象类的使用方法要视情况而定,没有非常固定的方式!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值