龙空技术网

Java 17 抽象类详解

小沐学学学 138

前言:

当前兄弟们对“java实例化抽象类”大概比较关怀,大家都需要了解一些“java实例化抽象类”的相关文章。那么小编同时在网摘上收集了一些有关“java实例化抽象类””的相关资讯,希望大家能喜欢,各位老铁们一起来了解一下吧!

Java 17 抽象类思维导图

抽象类:对于类来说都是事物的封装和提取, 但是一个事物的提取必须相对来说是通用的,因为通用才更具有父类的特征, 而通用的情况下可以更加的抽象, 而没有具体的描述。从实际使用的情况下来说抽象方法就是没有具体的行为, 就是方法的内容为空。既然没有方法具体的执行内容,从定义规则上来讲也就没有必须存在方法体了。 对于抽象类来说, 主要是因为继承的存在的, 也就是有子类能够实现抽象类才有了真正执行的意义。

比方说动物会叫, 这句话是没有问题的, 但是动物怎么叫, 什么动物, 没有具体的动物你是无法描述叫的这个行为的。有个叫猫的动物会喵喵叫。一起喵喵喵喵喵喵。咳咳咳。瞄~

对于一个吃货来说, 一个动物会吃, 也是同样的问题。 动物只能称为一个抽象。 具体的行为对于他本身来说没有意义。

如何定义抽象类呢?

[修饰符] abstract class 类名{    // 0 到 n 个抽象方法。    [修饰符] abstract 方法返回值 方法名(方法参数);}

先看一个简单的例子:

public abstract class Animal {}

抽象类可以可以直接定义而不需要定义任何的抽象方法。但是这样做通常没有意义。 继续看下面的例子。

// Animal.javapublic abstract class Animal {    String name;    public abstract  void eat();}// Cat.javapublic class Cat extends Animal{    public Cat(){        super.name = "猫";    }    @Override    public void eat() {        System.out.println(super.name + ", 正在吃鱼!");    }}// Test.javapublic class Test {    public static void main(String[] args) {        Animal cat = new Cat();        cat.eat();    }}

编写测试代码并执行:

错误1:对于类中包含抽象方法的情况下, 必须把这个类定义为抽象类, 否则会出现语法错误。

编译的时候会有对应的提示:

错误2:抽象类中的抽象方法子类没有重写(覆盖)。也就是子类没有实现父类的抽象类。

编译之后查看错误信息:

从 Java 编译器提示的错误信息,可以知道两种解决方法, 抽象方法子类要么实现, 要么继续为抽象方法。

因为包含抽象方法的类必须类也是抽象的,同理不重写的情况下就需要继续套娃下去。方法的实现就按第一个例子 ,正常测试就好, 如果是继续定义为抽象方法, 这里就引出另一种错误类型。

错误3:抽象类无法实例化,也就是说抽象类无法进行 new 构造方法。这里虽然无法 new 但是不代表抽象类没有构造方法,演示代码如下:

对于抽象类依然可以有具体的行为和属性。修改父类代码, 加入动物都会出声的描述。

编译运行:

可以看到虽然没有重写对应的 sound 方法,但是子类调用的时候依然可以使用该方法。 需要注意的是,如果父类中没有这个方法, 子类存在这个方法, 这里就需要注意, 编译器是无法调用类中没有生命的方法的。 虽然这里可以强转的方式调用。

抽象类中的构造方法演示

对于抽象类一样可以使用构造方法进行一系列的初始化操作。

抽象类是否可以使用 final 修饰符

对于 final 声明在类上的含义为:final 修饰类, 此类就无法被继承, 无法被继承也就没有了子类。因为抽象类想要使用就必须实现其中的方法, 实现的方式就是子类实现。两者概念上就有冲突, 所以无法进行使用 fianl 修饰。

抽象类是否可以使用 static 修饰符

类中声明是无法使用 static 修饰符的, 但是对于内部类来说有比较例外, 对于内部类的 static 修饰符修饰的抽象类。 可以理解自动提升内部类为外部类了。 举例说明:

抽象类的基础概念和使用方法大概就这么多了吧。 如果有其他的使用方法可以评论留言。 更多内容努力码中。

关注, 点赞, 收藏。

每篇一句:软件设计有两种方式:一种方式是,使软件过于简单,明显没有缺陷;另一种方式是,使软件过于复杂,没有明显的缺陷。——C.A.R. Hoare (英国计算机科学家,图灵奖得主。他设计出了快速排序算法、霍尔逻辑、交谈循序程式。)

标签: #java实例化抽象类