Java面向对向编程——抽象类

        要把一个方法写为抽象方法,需要在方法前加上abstract关键字,且方法没有方法体。如果某类中有方法是抽象方法,那么这个类是抽象类。

        换句话说:方法加上abstract关键字,并由有抽象方法的类叫做抽象类。

如以下代码:

public abstract class Shape {
	public String shapeName;    //属性
	public Shape() {            //默认无参数构造方法
		
	}
	
	public abstract double getArea();    //抽象方法
	
}

        假设如果我们设计一个图形类 Shape(父类),其中有一个求面积的方法 getArea(),但是对于不同的图形(子类)来说,求面积的过程并不一样,这该怎么办呢?


可能有的同学会说,既然各种图形求面积的方法不一样,那干脆父类不定义求面积方法,交由子类定义不就行了?其实,这不是一个好办法,我们已经学过继承了,我们知道,对于子类扩充的方法,父类引用的子类对象将无法使用,也就是说,假如 Shape 类引用了不子类对象,那么该子类对象将无法调用 getArea()方法,这就降低了程序的灵活性。那么怎样才能让父类不实现 getArea()方法,又能让 Shape 引用的子类对象能使用 getArea()方法呢?这就要用抽象类来解决,我们需要在父类中把该方法写为抽象方法(虚方法),即不提供该方法的具体实现,交由子类实现。

代码如下:

//图形类(父类)
public abstract class Shape {
	//属性
	public String shapeName;	//图形名称
	//默认无参数构造方法
	public Shape() {

	}
	//有参数构造方法
	public Shape(String shapeName) {
		this.shapeName = shapeName;
	}
	//定义了一个抽象方法:求面积
	public abstract double getArea();
	//已实现方法:介绍
	public void showShape() {
		System.out.println("正在操作的图形为: " + shapeName);
	}
	
}



//长方形(子类)
public class Rectangle extends Shape {
	//属性
	public double width;	//长
	public double length;	//宽
	//默认无参数构造方法
	public Rectangle() {	
		
	}
	//有参构造方法
	public Rectangle(String shapeName, double width,double length) {
		super(shapeName);
		this.width = width;
		this.length = length;
	}
	//实现父类抽象方法:求长方形面积
	public double getArea() {
		System.out.println("长方形面积为: "+width * length);
		return width * length;
	}
	public static void main(String[] args) {
		Rectangle dd= new Rectangle("长方形",2,4);
		dd.getArea();
	}

}

在代码中,Shape类被定义为抽象类,其中有getArea()抽象方法,Rectangle类继承Shape类,实现了父类的抽象方法。

那么有一种情况,如果子类并没有实现父类的方法,那么子类也就是属于抽象类,类前要加abstract关键字! 

下面在mian函数里实现子类,并查看是否继承实现了父类的抽象方法,代码如下

//main函数
public static void main(String[] args) {
        //对象实例化
		Rectangle dd= new Rectangle("长方形",2,4);
        //调用getArea()方法
		dd.getArea();
	}

输出结果如下:

 

抽象类还要注意以下几点:

  • 如果一个类是一个 abstract 类的子类,它必须具体实现父类的 abstract()方法,否则子类也是抽象类。
  • 如果一个类中含有 abstract 方法,那么这个类必须用 abstract 来修饰(abstract 类也可以没有 abstract 方法)。
  • 一个 abstract 类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现,所以抽象类可以实现类型隐藏。
  • 由于抽象类具有未实现的方法,所以不能创建对象,但可引用子类对象。
  • 不能定义一个既是 final 又是 abstract 的类,因为这是自相矛盾的。final 类代表类不能被继承,而 abstract 类代表此抽象类需要子类继承来实现抽象方法。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值