从零学Java - 面向对象 abstract

面向对象 abstract

文章目录

  • 面向对象 abstract
    • 1.什么是抽象?
      • 1.1 生活中的抽象
    • 2.抽象类
      • 2.1 不该被创建对象的类
      • 2.2 抽象类的语法
      • 2.3 抽象类的作用
      • 2.4 抽象类的特点
    • 3.抽象方法
      • 3.1 不该被实现的方法
      • 3.2 抽象方法的语法
      • 3.3 抽象方法的特点
    • 4.总结
      • 4.1 抽象类
      • 4.2 抽象方法

1.什么是抽象?

似是而非的,像却又不是;具备某种对象的特征,但不完整。

1.1 生活中的抽象

在这里插入图片描述

搜索结果都是“动物”的子类对象,而没有“动物”对象。都是动物其中的一种,不存在“动物”的实例;

2.抽象类

2.1 不该被创建对象的类

Animal仅是一种会吃会睡的对象,再无其他行为,不够具体、不够完整。

public class Animal {
    private String breed;
    private int age;
    private String gender;

    public void eat() {
        System.out.println("动物开始吃东西...");
    }

    public void sleep() {
        System.out.println("动物开始休息...");
    }

    public void show() {
        System.out.println("动物信息, 品种: "+this.breed+" 年龄: "+this.age+" 性别: "+this.gender);
    }
}

程序是用来模拟现实世界、解决现实问题的;现实世界中存在的都是“动物”具体的子类对象,并不存在“动物”对象,所以,Animal不应该被独立创建成对象。

如何限制这种对象的创建?

2.2 抽象类的语法

概念: 被abstract修饰的类,称为抽象类。抽象类意为不够完整的类、不够具体的类,抽象类对象无法独立存在,即不能new对象

语法: public abstract class Animal {…}

eg:

//Test
public class Test {
    public static void main(String[] args) {
        Animal dog = new Dog();

        dog.eat();
        dog.sleep();
        dog.show();
    }
}

//Animal
public abstract class Animal {
    private String breed;
    private int age;
    private String gender;

    public Animal() {
    }

    public Animal(String breed, int age, String gender) {
        this.breed = breed;
        this.age = age;
        this.gender = gender;
    }

    public void eat() {
        System.out.println("动物吃东西...");
    }

    public void sleep() {
        System.out.println("动物休息...");
    }

    public void show() {
        System.out.println("动物信息...");
    }
}

//Dog
public class Dog extends Animal{
    private String color;
    
	public Dog() {
    }

    public Dog(String breed, int age, String gender, String color) {
        super(breed, age, gender);
        this.color = color;
    }
    
    @Override
    public void eat() {
        System.out.println("狗狗啃骨头...");
    }

    @Override
    public void sleep() {
        System.out.println("狗狗休息...");
    }

    @Override
    public void show() {
        System.out.println("狗狗信息...");
    }
}

2.3 抽象类的作用

作用

  • 可被子类继承,提供共性属性和方法。
  • 可声明为引用,更自然的使用多态。

经验: 抽象父类,可作为子类的组成部分,依附于子类对象存在,由父类共性+子类独有组成完整的子类对象。

2.4 抽象类的特点

  • 抽象类不能new对象,但可以声明变量,可以被子类继承。
  • 抽象类中可以包含属性和非抽象方法,也可以包含抽象方法。
  • 抽象类中有构造方法,只能被子类调用。

3.抽象方法

3.1 不该被实现的方法

方法声明必要,方法实现多余。

eg:

需求:Dog中的eat()应输出“狗在吃骨头”  Cat中的eat()应输出“猫在吃鱼”
abstract class Animal {
	public void eat() {
        System.out.println("动物吃东西...");
    }	
}

class Dog extends Animal{}
class Cat extends Animal{}

父类提供的方法很难满足子类不同需求,如不定义,则表示所有动物都不会吃、睡。如定义,略显多余,多数会被子类重写。

3.2 抽象方法的语法

概念:被abstract修改的方法,称为抽象方法,只有方法声明,没有方法实现({}的部分)。意为不完整的方法,必须包含在抽象类中

产生继承关系后,子类必须重写父类中所有的抽象方法,否则子类还是抽象类。

eg:

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

class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗狗啃骨头...");
    }
}
class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫咪吃小鱼...");
    }
}

3.3 抽象方法的特点

  • 抽象方法只有方法声明,没有方法实现。
  • 包含抽象方法的类一定是抽象类。
  • 抽象方法必须被子类重写,除非子类也是抽象类。

4.总结

4.1 抽象类

被abstract修饰的类

  • 抽象类不能new对象,但可以声明引用,可以被子类继承。
  • 抽象类中可以包含属性和非抽象方法,也可以包含抽象方法
  • 抽象类中可以包含构造方法,只能被子类调用。

4.2 抽象方法

被abstract修饰的方法

  • 抽象方法只有方法声明,没有方法实现。
  • 包含抽象方法的类一定是抽象类。
  • 抽象方法必须被子类重写,除非子类也是抽象类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/295659.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刷算法-- leetcode 96. 不同的二叉搜索树

思路 观察树的组成,可以发现n3时的二叉搜索树可以由,头节点分别为1、2、3时的所有结果组成!定义dp[i]为由i个节点组成的二叉搜索树的个数。确定递推公式,dp[i] 由1为头节点组成的二叉搜索树个数由2为头组成的个数…由i为头节点组…

Echarts—词云库(echarts-wordcloud)使用

echarts-wordcloud是基于echarts的一个插件,所以我们要首先安装echarts包,然后再安装echarts-wordcloud的包,这里我的练习项目安装的版本;当然,你可以随意安装你需要的版本; “echarts”: “^5.3.3”, “ec…

Linux的ping命令、wget命令、curl命令

一、ping命令 通过ping命令,可以检查指定的网络服务器是否是可联通状态 形式:ping [-c num] ip或主机名 -c:检查的次数,不使用-c,将无限次数持续检查 ip或主机名:被检查的服务器的ip地址或主机名地址 …

RoadMap8:C++中类的封装、继承、多态与构造函数

摘要:在本章中涉及C最核心的内容,本文以C中两种基础的衍生数据结构:结构体和类作为引子,从C的封装、继承与多态三大特性全面讲述如何在类这种数据结构进行体现。在封装中,我们讲解了类和结构体的相似性;在继…

C语言——指针

一、定义 指针也就是内存地址,指针变量是用来存放内存地址的变量。 将内存以一个字节分为一个个内存单元,每个内存单元都进行编号,这个编号就是地址,也就是指针。 int b 1;int *pb &b;//这里的pb变量是一个整型指针变量&a…

Databend 的安装配置和使用

介绍 Databend 是一个内置在 Rust 中的开源、弹性和工作负载感知的云数据仓库,为 Snowflake 提供了具有成本效益的替代方案,专门对最大的数据集进行复杂分析而设计。 性能: 在存储对象上,能快速进行数据分析。没有索引和分区&a…

CSS 放大翻转动画

<template><div class="container" @mouseenter="startAnimation" @mouseleave="stopAnimation"><!-- 旋方块 --><div class="box" :class="{ rotate-scale-up-hor: isAnimating }"><!-- 元素内…

vmware安装redhat 7.6 操作系统

vmware安装redhat 7.6 操作系统 1、下载redhat 7.6 操作系统镜像文件2、安装redhat 7.6操作系统3、配置redhat 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载redhat 7.6 操作系统镜像文件 链接: 盘盘 zwzg 文件名&#xff1a;rhel-serv…

LowB三人组(冒泡排序,插入排序,选择排序)(数据结构课设篇1,python版)(排序综合)

本章博客主要详细讲解一下LowB三人组排序&#xff0c;为什么叫LowB三人组呢&#xff1f;因为他们的时间复杂度都为O&#xff08;n^2&#xff09;。下篇博客会再讲解NB三人组&#xff08;堆排序&#xff0c;归并排序和快速排序&#xff09;&#xff0c;第三篇博客会讲解其他排序…

C语言全面学习基础阶段01—C生万物

如何学好 C 语言 1. 鼓励你&#xff0c;为你叫好。 C 生万物 编程之本 长远 IT 职业发展的首选 C 语言是母体语言&#xff0c;是人机交互接近底层的桥梁 学会 C/C &#xff0c;相当于掌握技术核心 知识点一竿子打通。 IT 行业&#xff0c;一般每 10 年就有一次变革 40 年间&a…

【GUI界面软件】抖音评论采集:自动采集10000多条,含二级评论、展开评论!

文章目录 一、背景说明1.1 效果演示1.2 演示视频1.3 软件说明 二、代码讲解2.1 爬虫采集模块2.2 软件界面模块2.3 日志模块 三、获取源码及软件 一、背景说明 1.1 效果演示 您好&#xff01;我是马哥python说&#xff0c;一名10年程序猿。 我用python开发了一个爬虫采集软件…

C语言学习NO.11-字符函数strlen,strlen函数的使用,与三种strlen函数的模拟实现

&#xff08;一&#xff09;strlen函数的使用 strlen函数的演示 #include <stdio.h> #include <string.h>int main() {char arr1[] "abcdef";char arr2[] "good";printf("arr1 %d,arr2 %d",strlen(arr1),strlen(arr2));return …

windows下使用Apache配置WebDav

1.Apache下载 我使用的Apache版本是2.4.58 大家可以在Apache官网下载自己需要的版本 Download - The Apache HTTP Server Project 2.Apache配置 解压Apache放到你想放置的目录&#xff0c;我是放在C盘&#xff0c;C:\Apache24 如图&#xff1a; 修改配置文件httpd.conf 此…

test dbtest-02-Liquibase 是一个数据库变更管理工具

拓展阅读 DbUnit-01-数据库测试工具入门介绍 database tool-01-flyway 数据库迁移工具介绍 什么是 Liquibase&#xff1f; Liquibase 是一种开源的数据库架构变更管理解决方案&#xff0c;它使你能够轻松地管理数据库变更的修订版本。 Liquibase使得参与应用程序发布流程的…

项目中对日期进行格式化的方法

方式一&#xff1a;在属性上添加注解进行格式化 需要引入jackson包 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</version> </dependency>在属性上…

FreeRTOS移植

目录 一、FreeRTOS简介1.1 初识FreeRTOS1.2 FreeRTOS资料获取1.3 开发环境简介 二、FreeRTOS移植2.1 文件添加2.2 keil工程添加2.3 文件修改 一、FreeRTOS简介 1.1 初识FreeRTOS 首先看一下 FreeRTOS 的名字&#xff0c;可以分为两部分&#xff1a;“Free”和“RTOS”&#xf…

5分钟搞懂AI的可解释性

大家好啊&#xff0c;我是董董灿。 想象一下&#xff0c;如果有一天&#xff0c;有人跑过来突然告诉你&#xff0c;他搞懂了人类大脑记忆的运行机制&#xff0c;你会是什么反应&#xff1f; 你可能会和我一样&#xff0c;把他当做疯子。 因为我觉得这个课题太深奥了&#xf…

2023高级人工智能期末总结

1、人工智能概念的一般描述 人工智能是那些与人的思维相关的活动&#xff0c;诸如决策、问题求解和学习等的自动化&#xff1b; 人工智能是一种计算机能够思维&#xff0c;使机器具有智力的激动人心的新尝试&#xff1b; 人工智能是研究如何让计算机做现阶段只有人才能做得好的…

Jmeter 性能 —— 电商系统TPS计算

1、怎么计算得出TPS指标 ①第一个通过运维那边给的生产数据&#xff0c;看一下生产进件有多少&#xff0c;计算得来的&#xff0c;如果没有生产数据&#xff0c;或者不过就看如下的方法 ②第二个就是根据最近一个月的实际访问数据&#xff0c;比如每天调用了多少个接口&#…

应用系统如何集成和扩展开源工作流引擎

目前主流的开源流程引擎有activiti、flowable、camunda等&#xff0c;这几个开源流程引擎的版本很多&#xff0c;哪个开源流程引擎哪个版本的功能更多、性能更好&#xff0c;该如何选择请参考&#xff1a;https://lowcode.blog.csdn.net/article/details/116405594 无论您选择…
最新文章