首页 > 编程语言 >Java中抽象类详解

Java中抽象类详解

时间:2023-04-19 23:35:56浏览次数:39  
标签:Java eat void public class 详解 抽象类 abstract

在编程领域中,抽象类是一种至关重要的概念。它可以让我们更好地进行模块化设计,提高代码的复用性和可扩展性。只有全面掌握抽象类,才能在编程世界中游刃有余、与众不同。让我们一起踏上抽象类的学习之旅,创造出更加优秀的程序吧。Java中抽象类详解_抽象类

Java中抽象类详解_System_02


在Java中,抽象类是一种用于按需定制的基础类,它帮助开发者定义某种特定类型对象的行为,但不提供这些行为的具体实现。因此,与普通类不同,抽象类不能直接被实例化。本文将对Java中抽象类的定义、使用方法及注意事项进行详细介绍

一、什么是抽象类?

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

二、抽象类的使用方法

比如,你需要描述一个动物,但是动物有会跑的,会游泳的,会飞的······如果说,我们要描述的这一个动物,它会跑又会飞,如果描述一个还好,如果是两个呢?三个?四个甚至更多呢?那这样定义的话,就需要每一个动物定义一次,非常的麻烦,有的同志就说了:“那我们直接继承不久好了吗?”确实继承也可以,但是继承里面的父类需要实现方法体呀,就算不实现方法体,也需要打大括号,而且抽象类和普通继承的父类的类差别很大。如下:

(1)抽象类和普通父类的区别:

a、抽象类是一种特殊类型的类,它不能被实例化,只能作为其他类继承的基类来使用,

b、抽象类可以拥有构造函数和成员变量:和普通类一样, 抽象类可以拥有构造函数(包括默认构造函数)和成员变量。

c、抽象类必须被子类继承并实现抽象方法:如果一个类继承了一个抽象类,则必须实现所有抽象方法,否则该类也必须被声明为抽象类。例如:

abstract class A {
    abstract public void a();
}
abstract class B extends A {
    abstract public void b();
}

但是,出来混,迟早要还的,如果有个C的类继承了B,那C就不经要重写B中的方法,还要重写A中的方法,如下:

abstract class A {
    abstract public void a();
}
abstract class B extends A {
    abstract public void b();
}
class C extends B {
    @Override
    public void a() {
        
    }
    @Override
    public void b() {

    }
}

那说了这么多,能不能实现一个抽象类呢?当然可以,下面是代码实现:

abstract class Animal {
    abstract public void eat();
}

比如上面这个例子,所有的动物都会吃东西,所以要写个吃的方法名,然后在它的子类重写eat,当然,继承也要用到我们的继承关键字extends,如下:

abstract class Animal {
    abstract public void eat();
}
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog::eat");
    }
    public void run() {
        System.out.println("Dog::run");
    }
}

如上代码,你还可以在Dog这个类里面实现run这个方法,是不是很方便呢,提取出共性,放到抽象类里面,使用起来非常方便,一个抽象类是可以有多个子类的,你甚至还可以写一个鸭子的类。

abstract class Animal {
    abstract public void eat();
}
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog::eat");
    }
    public void run() {
        System.out.println("Dog::run");
    }
}
class Duck extends Animal {
    @Override
    public void eat() {
        System.out.println("Dunk::eat");
    }
    public void fly() {
        System.out.println("Dunk::fly");
    }
}

三、使用抽象类时注意事项

1.抽象类和抽象方法都是使用abstract进行修饰的

2.抽象类不能进行实例化,但是普通类是可以的

3.抽象类当中 不一定包含抽象方法,但是包含抽象方法的类,一定是抽象类

4.抽象类当中 可以定义成员变量和成员方法

5.当一个普通类 继承我们的 抽象类了,此时在普通类当中一定要重写抽象类中的抽象方法

6.抽象类存在的最大的意义,就是为了被继承

7.当一个抽象类A继承一个抽象类B,此时抽象类A不需要重写抽象类B中的成员。但是当一个普通类C,继承了抽象类A,此时就需要重写所有没有被重写的抽象方法

8.子类重写方法时,一定要满足重写的要求

9.final关键字不能同时作用在一个方法或者类上,因为如果一个类被声明为final,则该类不能被继承,而子类无法重写任何方法,但是抽象类就是要继承父类,并且重写父类的方法。

10.抽象类当中可以存在构造方法,在子类实例化的时候,会帮助父类的成员进行初始化

四、总结

抽象类是Java面向对象编程中不可或缺的一部分,它充当着其他类的基础类型,并且有助于创建更为灵活和具有扩展性的程序设计。对于Java开发者而言,深刻理解抽象类的定义、使用方法及注意事项是十分必要的。

五、心灵鸡汤

抽象类是一道通向编程掌握高峰的门槛,不仅有益于代码质量的提升,更能够让我们拥有更为深刻的编程思维。只要保持对于抽象类理论学习,在实践中多加积累和突破,相信在未来的编程旅途中,你定将无往而不利、显露出更佳的编程魅力!

Java中抽象类详解_抽象类_03

标签:Java,eat,void,public,class,详解,抽象类,abstract
From: https://blog.51cto.com/bitzmbdp/6207548

相关文章

  • @Pointcut语法详解
    定义格式:@注解(value=“表达标签(表达式格式)”)如:@Pointcut(value=“execution(*com.cn.spring.aspectj.NotVeryUsefulAspectService.*(…))”)前置后置切面方法,也可以写切面表达式,如果这么表达式都一样,要复用,可以写一个空方法表述为@Pointcut(...),再其他的后置上使用切......
  • Java基础知识点API之System
    一:System的介绍总的来说,System类提供了一些与系统相关的方法二:System类的常见方法publicstaticvoidexit(intstatus)终止当前运行的虚拟机publicstaticvoidlongcurrentTimeMil(isc)返回当前系统的时间毫秒值形式publicstaticvoidgc()运行垃圾回收器publicstaticString......
  • SOCKET(一):基本轮子详解与入门
    1.图解客户端与服务端交互流程上图轮子详解socket简单实践服务端#include<stdio.h>#include<string.h>#include<arpa/inet.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/ip.h>#include<fcn......
  • 延迟绑定与 ret2dlresolve 详解
    ret2dlresolve是栈溢出下的一种攻击方法,主要用于程序没有办法利用puts、printf、writer函数等泄露程序内存信息的情况。延迟绑定在Linux中,为了程序运行的效率与性能,在没有开启FULLRELRO时候,程序在第一次执行函数时,会先执行一次动态链接,将对应函数的got表填上libc......
  • Java字符串
    StringJava中的字符串是String类的实例,字符串常量"xxxx" ,系统会自动创建一个对应的String类对象。注意,Java中的字符串并不是数组,字符串和数组没有直接关系。字符串对象一旦被创建,则其内容是不可变的。语法: String变量名[= ["xxxx"|newString("xxxx")] ]?;  ......
  • java学习日记20230415-LinkedHashSet源码
    LinkedHashSet全面说明:LinkedHashSet是HashSet子类;底层是一个LinkedHashMap,底层维护了一个数组和双向链表根据元素的hashCode值来决定元素的位置,同时使用链表维护元素的次序,使得元素看起来是以插入的顺序保存的不允许添加重复元素维护了一个hash表和双向链表,每个节点有pre和......
  • #yyds干货盘点#详解Django基础
    一:创建项目使用django-admin命令构建项目django-adminstartprojectHelloWorld如上使用django构建了一个HelloWorld项目二:项目结构我们可以看到HelloWorld项目结构如下|--HelloWorld||--__init__.py||--settings.py||--urls.py|`--wsgi.py`--manage.p......
  • java数组
    一维数组的定义、使用Java中的数组是类类型。 类型 [数组名[]|[]数组名]  [= [{值1[,值n]*}|new类型[元素数量]]  ]?;  其中,类型没有任何限制,可以是基本类型也可以是类、接口类型。用new创建数组时,系统会自动初始化数组中的所有元素:数组类型赋值0,布......
  • Java基础——常用类
    常用类字符串String//初始化////Stringstr1=newString();初始化一个新创建的String对象,使其表示一个空字符序列。////String(Stringoriginal)初始化一个新创建的String对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。////Strin......
  • Java语言编程
    Java编程需要一定的逻辑思维能力,要持续的学习分别有Java/python/C++/CJava能干什么?比如手机应用,游戏(我的世界)大数据分析                 JavaSE数据库前端Javawedssm框架LinuxspringBoot西部开源Java     springclond......