强哥说Java--Java的抽象类

简介: 强哥说Java--Java的抽象类

前言



学到Java抽象类啦,这几个是重点,冲啊!!!


抽象类的概念和特点,


抽象类在程序设计时的应用场景,


什么是抽象方法,


抽象方法有什么特点,


如何声明一个抽象方法等内容。


Java 抽象类


1. 概念和特点


在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。


值得注意的是,一个抽象类不能直接实例化,但类的其他功能依然存在;既然不能被实例化,那么它必须被继承才能被使用。


2. 为什么需要抽象类


老是在想为什么要引用抽象类,一般类不就够用了吗。一般类里定义的方法,子类也可以覆盖,没必要定义成抽象的啊。


其实不是说抽象类有什么用,一般类确实也能满足应用,但是现实中确实有些父类中的方法确实没有必要写,因为各个子类中的这个方法肯定会有不同,所以没有必要再父类里写。当然你也可以把抽象类都写成非抽象类,但是这样没有必要。


而写成抽象类,这样别人看到你的代码,或你看到别人的代码,你就会注意抽象方法,而知道这个方法是在子类中实现的,所以,有个提示作用。


例如,父类 Pet 被子类 Cat 和 Dog 继承,并且都重写了父类的 eat 方法:


class Pet {
    // 定义方法 eat
    public void eat() {
        System.out.println("宠物都会吃东西");
    }
}
class Dog extends Pet { // 继承父类
    // 重写父类方法 eat
    @Override
    public void eat() {
        System.out.println("狗狗吃狗粮");
    }
}
class Cat extends Pet { // 继承父类
    // 重写父类方法 eat
    @Override
    public void eat() {
        System.out.println("猫猫吃猫粮");
    }
}


小猫类、小狗类这些子类都重写了宠物类中的 eat 方法,我们知道每种宠物都有吃的行为,宠物表示了一个抽象的概念。那么宠物类的实例化和方法调用就没有了实际意义:


Pet pet = new Pet();
pet.eat();


我们知道了抽象类不能被实例化,此时可以将父类设定为抽象类,使用 abstract 关键字来声明抽象类,abstract 关键字必须放在 class 关键字前面 :


// 声明抽象类
abstract class Pet {
    ...
}


如果你尝试实例化抽象类 Pet,编译器将会报错:


Pet.java:4: 错误: Pet是抽象的; 无法实例化
        new Pet();
        ^
1 个错误


使用抽象类,我们既可以通过父类和子类的继承关系,来限制子类的设计随意性,也可以避免父类的无意义实例化。


3. 抽象方法


如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。


Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。


抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。


上面我们将 Pet 父类改为了抽象类,其中包含了 eat 方法的具体实现,而实际上这个方法是不需要具体实现的,每种宠物都有各自的具体实现。此时,就可以将 eat 方法改为抽象方法:


abstract class Pet {
    abstract void eat();
}


我们可以看到抽象方法使用 abstract 关键字声明,它没有方法体,而直接使用 ; 结尾。


子类必须实现父类中的抽象方法,假如 Dog 类继承了抽象类 Pet,但没有实现其抽象方法 eat:


class Dog extends Pet {
}


编译执行代码,将会报错:


Dog.java:1: 错误: Dog不是抽象的, 并且未覆盖Pet中的抽象方法eat()
public class Dog extends Pet {
       ^
1 个错误


上述报错中可知,如果我们不想在 Dog 中重写抽象方法 eat(),那么可以将 Dog 也改为抽象类:


abstract class Dog extends Pet {
}


抽象方法不能是 final、static 和 native 的;并且抽象方法不能是私有的,即不能用 private 修饰。因为抽象方法一定要被子类重写,私有方法、最终方法以及静态方法都不可以被重写,因此抽象方法不能使用 private、final 以及 static 关键字修饰。而 native 是本地方法,它与抽象方法不同的是,它把具体的实现移交给了本地系统的函数库,没有把实现交给子类,因此和 abstract 方法本身就是冲突的。


4. 小结


可以使用 abstract 关键字声明抽象类或抽象方法。


抽象类不能被实例化,抽象类中的方法必须被非抽象子类实现,它必须被继承才能被使用。


抽象类中不一定包含抽象方法,但抽象方法一定在抽象类中。


相关文章
|
24天前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
166 0
|
5月前
|
安全 Java API
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
107 2
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
141 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
12月前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
156 2
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
85 5
Java——抽象类和接口
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第17天】Java零基础教学篇,手把手实践教学!
158 2
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第15天】Java零基础教学篇,手把手实践教学!
118 2
|
安全 Java 数据安全/隐私保护
【一步一步了解Java系列】:探索抽象类与接口的秘密
【一步一步了解Java系列】:探索抽象类与接口的秘密
82 3
|
Java
Java 抽象类详解
在 Java 中,抽象类是一种特殊类,用于提供基础定义并派生具体子类,支持代码复用。它包含抽象方法(无实现)和具体方法(有实现),不能被实例化,需用 `abstract` 关键字定义。子类必须实现所有抽象方法,除非子类也是抽象类。抽象类可用于定义模板或框架,确保子类实现特定方法。通过示例展示了如何定义抽象类 `Animal` 及其子类 `Dog` 和 `Cat`,并在主类中调用相关方法。使用抽象类可以提高代码复用性和设计质量,但也可能增加维护难度和性能开销。
463 8
下一篇
开通oss服务