Java——抽象类学习

Java——抽象类学习

今天继续填坑,来讲一下抽象类。在说抽象类之前,先来增加一下之前多态和继承没有说的访问权限修饰符public,protect,package和private这四个修饰符。

public修饰符的访问权限最大,可以实现跨包访问,可以说,只要有些public定义的类或者方法,无论在哪个地方都可以调用。

protect修饰符稍微有点复杂,它的访问权限介于public和package(包访问)之间,只要包括以下三种。1.同一个包中 2. 同一个包的类或者子类中 3.不同包的子类中

package修饰符,即默认修饰符。package的访问权限是包访问,可以在包内调用。

private修饰符,访问权限非常低,仅能在同一个类中访问。这里访问的意思是取值和修改。

说完了访问修饰符,我们直接来说抽象类。回顾上一篇博客中,我们编写了三个具有继承关系的类。在父类GeometicObject中,我们有定义了一个方法

public double getArea(){
    
    
        return -1;
    }

定义这个getArea的方法其实是为了给子类重写,实现多态。那么问题来了,几何体作为一个抽象概念,如果没有明确说明是什么样的几何体,那么久无法求取该几何体的面积。刚刚代码是为了与子类保持一样的返回类型,所以才返回了-1。

现在我们引入抽象类这个概念,抽象类的修饰符是abstract。比如刚刚getArea方法就是一个典型的抽象方法,因而可以直接定义。值得注意,抽象类中可以没有抽象方法,但是抽象方法的类一定要是抽象类,不然系统会报错。

abstract class GeometicObject{
    
    
	 public abstract double getArea();
	 }

上面已经创建好了抽象方法getArea,其中该抽象方法中不用写方法。

接下来说一个重点!!!!抽象类是无法实例化的。因为抽象的东西根本就指定成一个具体的东西。举个简单的例子,比如100g红色的大苹果,我们就可以明确知道是哪个苹果;但如果是100g红色的大水果,我们怎么知道说的是哪种水果呢?因此抽象类无法进行实例化,而无法进行实例化最直接的影响就是不能用new操作符。`

GeometicObject a = new GeometicObject(); //这是错误的!!
GeometicObject b = new Circle();  //这也是可以的
GeometicObject[] c = new GeometicObject[5]; //这却是可以的

上述中的c是实例化的GeometicObject数组,而并非是几何体。我们可以用GeometicObject数组中的元素来实例化GeometicObject子类。

c[0] = new Circle();
c[1] = new Rectangle();

最后还要说的是,抽象类中定义的抽象方法,必须在其子类中重写,否则系统报错。或者把该子类也定义成一个抽象类,那么就不必重写。那今天的抽象类就整好了,下一篇博客我们来学习接口。

猜你喜欢

转载自blog.csdn.net/MrChen666/article/details/106842153