返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java面向对象:抽象类的学习
  • 643
分享到

Java面向对象:抽象类的学习

java学习jvm 2023-09-11 09:09:35 643人浏览 泡泡鱼
摘要

本文介绍了抽象类的基本语法概念,什么是抽象类. Java中抽象类的语法,抽象类的特性 抽象类的作用(抽象类和普通类的区别) 用抽象类实现多态… 抽象类的学习 一.什么是抽象类二.抽象类语

本文介绍了抽象类的基本语法概念,什么是抽象类. Java中抽象类的语法,抽象类的特性
抽象类的作用(抽象类和普通类的区别) 用抽象类实现多态…

抽象类的学习

一.什么是抽象类

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

比如:
狗类和猫类都是一个完整的对象,它们具备自己的行为和属性,同时也有相同的属性和行为,这些相同的属性行为也就是所有动物所具备的,
有这层关系后,便可以把这些共同具备的属性和行为抽取出来形成一个动物类
在这里插入图片描述
狗类和猫类都能具体描述出狗对象和猫对象,而动物类内部并没有足够的信息来描述一个准确的对象,因此,动物类可以被设置为抽象类…

当我们想描述一个图形时,能定义一个图形类,但是图形并不具体,没有完整的信息表示具体是什么图形,但所有具体的图形(如:三角形 圆形)都有图形共同具备的属性和行为
在这里插入图片描述
图形类派生出 圆形类和矩形类,图形类即是一种抽象的类它并不能具体表示哪种图形,它可以作为具体图形的基类给其提供图形本身具备的属性和行为,而具体图形具有图形的属性和行为和自身的属性和行为构成一个完整的类

在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape的各种子类的 draw 方法来完成的.

像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstractmethod), 包含抽象方法的类我们称为 抽象类(abstract class).

动物类和图形类,本身都是一个普通的类,这些类通常都是具备其他类共有的属性而被抽取出来所形参的类,由于其并不能完整的描述对象 所以这些类都是抽象的, 在编写代码中一般也不会对其实例化,即抽象类存在的最大意义就是用来被继承的…

当一个类不能完整的描述一个对象时 可以选择将其属性方法补全能描述一个具体对象 或者最好在语法上将其设置为抽象类

二.抽象类语法

在Java中,一个类如果被 abstract 关键字修饰后即称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。

示例:

abstract class Shape{          //抽象类中有抽象方法 也有非抽象方法  普通类只有非抽象方法     void draw(){ //抽象类中的非抽象方法 可以写方法体        System.out.println("画图");       }    Shape(){ //构造方法    }    String name;    abstract  void func();      //抽象类中方法 也可以不写方法体 不写方法体时要在前面加abstract 为抽象方法 方法后加分号   }class Circle extends Shape{    @Override    void draw(){  //可以对抽象类 有方法体的方法进行重写 也可以不重写        System.out.println("画圆圈○");    }    void func(){  // 必须对继承的抽象类的抽象方法进行(实现) 否则无法编译通过       //super.func(); 编译错误 在子类方法里不能通过super访问父类抽象方法 因为其没有方法体        System.out.println("实现父类的抽象方法");    }}class Flower extends Shape{    @Override    void func(){  //即便方法体没内容也得重写抽象方法    }    @Override void draw(){        System.out.println("画花❀");    }}class Rect extends Shape{   //按住ant加回车 回车 快捷出现 重写 父类的抽象方法    @Override    void func() {    }    void draw(){        System.out.println("画矩形!");    }}public static void main(String[] args) {        Circle circle=new Circle();        circle.draw(); //当子类没有重写 父抽象类的 有方法体的方法 会调用父类的 重写了则调用子类的        circle.func(); //子类必须实现父类抽象方法 否则编译不通过 因为父类抽象方法没有具体方法体不能被调用        Shape shape=circle;        shape.func();   // 抽象类可以实现向上转型 动态绑定 多态 此时 func方法 被子类func实现重写了 调用的是这个子类方法        } }

抽象类 它的目的就是为了派生出子类 子类有自己的成员和父类的成员负责具体描述对象
在这里插入图片描述
子类里可以调用子类对象的方法,没有重写抽象父类的非抽象方法则调用的是父类非抽象方法.而调用的抽象方法一定是子类重写的父类抽象方法(抽象方法一定要被重写)

注意:

抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
抽象类中可以有抽象方法和非抽象方法 即被abstract修饰的方法为抽象方法
非抽象方法需要有方法体(具体的方法实现) 被子类继承后可以重写其方法或者不重写
抽象方法不能写方法体但是其子类一定要重写父类的抽象方法(除非子类也是个抽象类)
在子类对象内不能通过super关键字访问父类的抽象方法(因为其没有具体方法体实现)

三.抽象类的特性

  1. 抽象类存在就是用来被继承的,因其不能完整描述对象,其抽象类是不能被实例化的
Shape shape = new Shape();// 编译出错//Error:(30, 23) java: Shape是抽象的; 无法实例化

抽象方法不能是 private 的

abstract class Shape {abstract private void draw(); // 编译出错}//Error:(4, 27) java: 非法的修饰符组合: abstract和private

被private修饰的方法被继承后 无法被重写,而此方法是抽象的无方法体因此没有被重写没有任何意义会编译报错,而非抽象方法可以被private修饰,其有自己的方法体,可以通过调用一些公开的方法访问不会报错

  1. 抽象方法不能被final和static修饰
public abstract class Shape {abstract final void methodA();abstract public static void methodB();} // 编译报错:// Error:(20, 25) java: 非法的修饰符组合: abstract和final// Error:(21, 33) java: 非法的修饰符组合: abstract和static

被final修饰的方法不能被重写,而抽象方法其没有方法体不被重写没有意义
被static修饰的方法是类成员方法不属于对象,不会被子类继承即不能被重写没有意义
而抽象类里可以有static和final修饰的非抽象方法,

  1. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
abstract class Shape{ //抽象图形类 abstract public void draw();} abstract class Triangle extends Shape {// 三角形抽象类:@Overridepublic void draw() {  //重写抽象方法System.out.println("三角形"");} // 三角形:直角三角形、等腰三角形等,还可以继续细化

当一个抽象类被抽象类继承后即可以重写其抽象方法也可以不重写,因为其本身也是抽象的,而非抽象类继承抽象类后一定要重写抽象方法

  1. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
  2. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

四.抽象类的作用

抽象类存在最大作用就是用来被继承的…

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.

而一个普通类,其也可以被继承,内部的方法也可以被重写都具备类成员属性和方法,构造方法 ,而抽象类也就比普通类多了抽象方法,那为什么要有抽象类呢?

抽象类相比普通类来说,多了抽象这个概念,综合上面介绍的抽象类,实际上使用抽象类相当于比普通类多了一重编译器的校验.
使用抽象类其不能被实例化,其内的抽象方法不能被private static fina修饰 且一定要被非抽象的子类重写…

事实上 普通类可以作为父类被子类继承,但是在后续编写代码过程中,此父类也可以被实例化,但是其就无法在使用到任何子类的方法和行为,本身父类就是一些类共性抽取形成的一个类…

使用抽象类的场景就如上面所说, 实际工作不应该由父类完成, 而应由子类完成.
那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.

很多语法存在的意义都是为了 “预防出错”, 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就可以相当于常量嘛?
但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.充分利用编译器的校验, 在实际开发中是非常有意义的.

所以在实际工作中,一个类本身就是作为父类存在,其不用被实例化,其内部的一些方法必须被重写,那么最好就设计此父类为抽象类,子类继承父类后,能够通过编译器校验提醒我们对需要重写的方法进行重写,也能避免不小心实例化的是父类对象而产生警告…

五. 抽象类实现多态

抽象类本身虽然不能实例化对象,和普通类没有很大的区别,即其类型可以创建引用变量接受子类对象地址(向上转型)

在发生向上转型后,子类重写了抽象类里的成员方法,即可以通过动态绑定实现多态
示例:

abstract class Shape{              void draw(){         System.out.println("画图");       }    String name;    abstract  void func();   }class Circle extends Shape{    @Override    void draw(){  //可以对抽象类 有方法体的方法进行重写 也可以不重写        System.out.println("画圆圈○");    }    void func(){         System.out.println("实现父类的抽象方法");    }}class Flower extends Shape{    @Override    void func(){  //即便方法体没内容也 得重写抽象方法    }    @Override void draw(){        System.out.println("画花❀");    }}class Rect extends Shape{   //按住ant加回车 回车 快捷出现 重写 父类的抽象方法    @Override    void func() {    }    void draw(){        System.out.println("画矩形!");    }}public class Note {    public static void func(Shape shape){ // 在传之前已经是向上转型为shape类型 这里接受没有什么变化        shape.draw();  //通过父类引用接受不同子类对象地址  调用其被不同子类对象重写后的方法 发生动态绑定 实现不同行为  多态    }    public static void main(String[] args) {        Circle circle=new Circle();        Shape shape=circle;      //func实现重写了 调用的是这个子类方法        Rect rect=new Rect();        Flower flower=new Flower();        Shape[] shapes={circle,rect,flower};  // shapes 为一维Shape类型数组 引用变量 每个元素是一个shape引用变量接受 子类对象地址 已经发生向上转型        for (Shape x:shapes) {  //通过foreach 将每个转型后的地址传给方法            func(x);        }    }}

在这里插入图片描述
可见抽象类能做的,普通类都能实现,抽象类比普通类多了抽象方法且不能实例化, 在实际开发中一个类要被其他类继承最好将这个类设计为抽象类…

在这里插入图片描述

来源地址:https://blog.csdn.net/lch1552493370/article/details/129459734

--结束END--

本文标题: Java面向对象:抽象类的学习

本文链接: https://lsjlt.com/news/402889.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java面向对象:抽象类的学习
    本文介绍了抽象类的基本语法概念,什么是抽象类. Java中抽象类的语法,抽象类的特性 抽象类的作用(抽象类和普通类的区别) 用抽象类实现多态… 抽象类的学习 一.什么是抽象类二.抽象类语...
    99+
    2023-09-11
    java 学习 jvm
  • Java 面向对象 之 抽象类 abstract
    转载于 : http://www.verejava.com/id=16992804621647 public class TestAbstract {public static&n...
    99+
    2023-06-02
  • Java面向对象:接口的学习
    本文介绍了Java中接口的基本语法, 什么是接口, java中的接口 语法规则, 接口的使用,接口的特性,如何实现多个接口,接口间的继承,以及抽象类和接口的区别 Java接口的学习 一.接口的概念二.Java中的接口1.接口语...
    99+
    2023-08-17
    java 学习 android
  • Java面向对象之抽象类,接口的那些事
    目录一、抽象类1.抽象类概述1.1 为什么要有抽象类?(抽象类的作用)1.2 抽象类的定义2. 抽象类特点3.抽象类成员特点4.抽象类案例二、接口1.接口概述2.接口特点3.接口成员...
    99+
    2024-04-02
  • Python - 面向对象学习
    本节内容: 面向对象编程介绍为什么要用面向对象进行开发?面向对象的特性:封装、继承、多态类、方法、  引子你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是...
    99+
    2023-01-31
    面向对象 Python
  • Java面向对象基础知识之抽象类和接口
    抽象类(abstract): 抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽...
    99+
    2024-04-02
  • Java 面向对象编程奠基:接口与抽象类的角色
    接口: 接口是一种参考类型,定义了一组方法签名而不提供其实现。它本质上是公共契约,指定了类必须实现的方法。 public interface Animal { void eat(); void sleep(); } 抽象...
    99+
    2024-03-03
    接口、抽象类、多态性、抽象方法、实现类
  • python 面向对象、类、对象
    class 类 object 对象 object-oriented programming 面向对象,简称OOP attribute 属性 method 方法 inheritance 继承 python中通过类和对象来实现 ...
    99+
    2023-01-31
    面向对象 对象 python
  • Python学习 :面向对象 -- 三大
    面向对象的三大特性 一、封装 把数据、值、变量放入到对象中 构造方法 _init_方法 特殊作用: 在 obj = 类名() 执行时: 内部自动执行两个步骤: 1、创建对象 2、通过对象执行类中的一个特殊方法(_init_方法) ...
    99+
    2023-01-30
    三大 面向对象 Python
  • js 面向对象学习笔记
    目录数据赋值拷贝值类型赋值--函数形参&实参引用类型赋值对象的动态性delete删除属性数据赋值拷贝 1、值得赋值是独立的 num1=12; num1=num2 将存储值赋值...
    99+
    2023-05-18
    js 面向对象
  • python学习32(面向对象_3)
    继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。即一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生...
    99+
    2023-01-31
    面向对象 python
  • Scala 学习之面向对象(3)
    ==> 类        ---> 类的定义class Student{     // 定义属性     private var stuName:String = "Tom"     private vat stuAge:Int...
    99+
    2023-01-31
    面向对象 Scala
  • Java 深入浅出解析面向对象之抽象类和接口
    目录抽象类声明抽象类声明抽象方法案例使用规则接口声明接口案例接口特性抽象类和接口的区别抽象类 java语言,声明类时 abstract class Db{} 说明Db类为抽象类。 j...
    99+
    2024-04-02
  • Java面向对象类和对象实例详解
    目录1 - Java面向对象学习的三条主线2 - 面向过程与面向对象3 - 面向对象的三大特征4 - 面向对象分析方法分析问题的思路和步骤5 - 面向对象的思想概述6 - 类和对象的...
    99+
    2024-04-02
  • Java 对象导向编程:接口与抽象类的作用
    Java、接口、抽象类、多态性、抽象性 接口 接口是一个抽象数据类型,它定义了一组方法及其签名,但没有实现这些方法。接口强制其实现类提供这些方法的实现。使用接口的主要优点是: 解耦:接口将接口与实现分离,允许在不更改接口的情况下更改...
    99+
    2024-03-03
    接口和抽象类是 Java 中重要的概念 它们用于实现对象导向编程范式中的多态性和抽象性。本文将深入探讨接口和抽象类的作用 并通过代码示例展示它们的用法和优点。
  • golang函数在面向对象编程中的抽象类实现
    在 golang 中,可以通过实现一个接口并定义一个函数来实现抽象类功能:定义接口并声明方法签名。定义函数并实现接口方法。实例化结构体并调用函数。实战案例中,使用 shape 接口和对应...
    99+
    2024-05-03
    面向对象编程 抽象类 golang
  • 新手初学Java面向对象
    目录java面向对象知识点总结java面向对象 面向对象【Java语言的核心机制,最重要的内容,Java语言的特色】 * 面向过程和面向对象的区别 - 面...
    99+
    2024-04-02
  • Python面向对象之类和对象
    目录类定义类定义类和属性类中方法对象方法(普通方法)类方法静态方法魔术方法对象创建对象对象属性总结 类 定义类 所有类名首字母要求大写,多个单词时遵循驼峰命名法 所...
    99+
    2024-04-02
  • Java面向对象和类的定义
    本篇内容介绍了“Java面向对象和类的定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、面向对象面向对象是在程序中使用对象来映射现实中的...
    99+
    2023-06-15
  • python面向对象,类
    1:类和对象    是面向对象中的俩个重要概念,类是对事物的抽象,比如人类,球类。对象是事物的实例,比如足球,篮球。球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球体出来。2:类的定义    类把需要的变量和函数组合成一起,这种...
    99+
    2023-01-31
    面向对象 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作