Java——抽象类

Java——抽象类

文章参考本文!

一、抽象类的基本概念

普通类:是一个完善的功能类,可以直接产生实例化对象,并且在普通类中包含有构造方法、普通方法、static方法、常量和变量等内容。
抽象类:在普通类的基础上增加抽象方法的类

抽象方法:普通的方法在声明完要加一个“{}”,表示该方法的方法体,有方法体的方法一定可以被对象直接使用。而抽象方法是没有方法体的方法,同时抽象方法还必须被关键字abstract修饰

拥有抽象方法的类就是抽象类,同时抽象类也必须被关键字abstract修饰

二、抽象类的使用原则

举例

在这里插入图片描述
在这里插入图片描述
’AbstractDemo’ is abstract; cannot be instantiated
由上面可知,抽象类不能被实例化。
为什么抽象类不能被实例化呢???
假设一个类被实例化,那么就意味着这个类可以实例化对象,有了对象就意味着,该对象有方法有属性,但是抽象类里面的抽象方法没有方法体,所以说抽象类不能被实例化。

抽象类的使用原则:

1、抽象方法必须为public或者protected(因为如果是private,那么该类不能被子类继承,其中的抽象方法也就不能被重写)。默认为public。
2、抽象类不能被实例话,可以采用向上转型的方法处理。注意:一定要在方法内部实例化
3、抽象类必须有子类,用extends继承,一个子类只能继承一个抽象类。
4、子类如果不是抽象类的话必须重写抽象类中的全部方法。(问题:如果子类是抽象类的话那还能重写父类的方法吗?答:可以,被重写的父类中的抽象方法在子类中相当于普通方法)
父类:
在这里插入图片描述
子类1重写父类中的两个方法
在这里插入图片描述
子类2只重写了一个方法,另外一个方法必须用abstract关键字修饰。而且因为子类2有抽象方法,所以子类2也是抽象类,所以子类2也不能被实例化。
在这里插入图片描述

三、抽象类的使用限制

1、抽象类中有构造方法吗?

因为抽象类中有属性,抽象类与普通类的区别只是有抽象方法,所以这些属性是要被初始化的,抽象类中的构造方法就是用来初始化的。
举例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、抽象类可以被final修饰吗?

不能,final修饰的类是最终类,不能有子类,但是抽象类必须有子类。

3、抽象类可以被static修饰吗?

范例:外部类
在这里插入图片描述
范例:内部类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意点:
1、继承内部类是extends AbstractDeom.inner,这里不可以直接extends inner
2、内部类实例话的时候也是 AbstractDemo.inner。
3、外部抽象类不允许使用static声明,而内部的抽象类运行使用static声明。使用static声明的内部抽象类相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。

4、可以直接调用抽象类中static声明的方法吗?

任何时候,如果要执行类中的static方法的时候,都可以在没有对象的情况下直接调用,对于抽象类也一样。
在这里插入图片描述
在这里插入图片描述

补充
方法是一定要加()的,因为你要传递参数啊,但是类是一定不加()的,因为类不需要传递参数。
如下图:
public AbstractDemo(){}; 这里是构造方法,所以要加()
static abstract class inner{} 这里是内部类,所以不需要加()
在这里插入图片描述

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中的抽象是一种编程机制,它允许程序员定义抽象类和抽象方法来表示一种概念或行为,而不需要实现具体的细节。抽象类是一种不能被实例化的类,它只能被继承,而抽象方法是一种没有实现的方法,必须由子类来实现。 使用抽象类和抽象方法可以提高代码的可重用性和可扩展性。通过定义抽象类和抽象方法,程序员可以将一些通用的行为或属性抽象出来,让子类来实现具体的细节。这样可以避免重复的代码和逻辑,同时也方便了代码的维护和扩展。 Java 中的抽象类和抽象方法可以通过关键字 abstract 来定义。抽象类必须用 abstract 关键字来修饰,而抽象方法也必须用 abstract 关键字来修饰,并且不能有方法体。如果一个类中包含了至少一个抽象方法,那么这个类必须被定义为抽象类。 以下是一个抽象类和抽象方法的示例: ``` abstract class Shape { public abstract double getArea(); } class Rectangle extends Shape { private double length; private double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } public double getArea() { return length * width; } } ``` 在上面的示例中,我们定义了一个抽象类 Shape 和一个抽象方法 getArea(),并且在 Rectangle 类中实现了这个方法。由于 Shape 类是抽象类,所以不能被实例化,但是可以被继承和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值