JavaSE:抽象

news2024/11/13 11:25:39

一,抽象是什么,抽象和面向对象有什么关系

抽象,个人理解,就是抽象的意思

我们都知道面向对象的四大特征:封装,继承,多态,抽象

为什么抽象是面向对象的特征之一,抽象和面向对象有什么关系

这个东西比较复杂,我自己的水平也很浅,下面说说自己的个人理解

面向对象的诞生

面向对象之前,我们操作内存中的同名变量,动来动去都是同一份;

有了面向对象之后,我们操作的数据被不同对象各自的内存空间分割开,不是同一份。

面向过程

函数从类当中获取并操作数据

不同的函数使用的变量,是内存当中的同一份

面向对象

方法从对象当中获取并操作数据

不同对象的相同方法调用的相同变量,来源于方法区类信息的多份拷贝,

在堆内存中分别属于不同的对象,不是同一份

从内存结构的角度来看,面向对象与面向过程,最大的进步就是内存中数据访问的解耦


public class Person {

	private int age;
	
	private String name;
	
	
	public Person(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	
	public Person() {
		
	}
	
	public static void main(String[] args) {
		
		Person p1 = new Person(17,"樱岛麻衣");
		
		Person p2 = new Person(16,"梓川咲太");
		
	}


	
}

继承与抽象

Java的继承机制,其实就是对现实世界事物之间关系的一种归纳总结

当这种总结是具体而准确的时候,就是单纯的继承

比如Animal类,子类Dog和Cat,显然都具有年龄(age)属性,具有移动(move())方法,所以

这些归纳总结出来的共有的属性,就写在了父类Animal当中,实现了代码和逻辑的复用;

但是,当这种总结继承不能非常具体和准确时,就变成了抽象

比如动物繁衍,单细胞生物就是直接分裂,多细胞生物,有的卵生,有的胎生,等等等等……

繁衍显然是动物拥有的方法,但是又没办法写的那么清楚,最终就变成了抽象方法

重写与抽象的区别(个人理解)

有人说,重写方法不就可以了吗,为什么要专门定义抽象?

一,逻辑关系不同

抽象类当中的抽象方法,只定义方法,不写明实现,需要等待子类实现,明显是从无到有的一种逻辑关系。

而重写,更像是一种增强,父类不需要继承,就可以拥有自定义实现的方法,没有子类也可以

二,实际含义不同

抽象是一套组合拳,不光是方法,就连类也变成了抽象的类,这里抽象的含义主要指事物的本质,因为在单继承环境下,本质只可能有一个

抽象类本身不能实例化也印证了这一点,“本质”就是抽象的,不能映射成现实的对象;

而重写的含义更像是一种“中间阶段”,实实在在的实体类,映射成现实的对象,并没有接近事物的本质

面向对象和抽象的关系

面向对象就是把现实问题抽象为对象,通过调用每个对象的属性或功能去解决问题。

不存在多个对象,这种不同对象的不同实现也就无从定义

这种多个对象同时存在的功能的实现,依赖于内存中数据访问的解耦

  1. 解耦之后,我们通过继承将代码复用,同时又恢复了耦合,
  2. 为了将这部分死灰复燃的耦合给解耦掉,同时依然做到代码复用,我们发明了多态(一个父类对象可以接收任意一种子类的对象,将子类方法与子类类型解耦)
  3. 我们发现实际继承中,出现了难以具象化构建的情况,于是出现了抽象

推荐阅读

Java编程最佳实践之多态 - 阿里云开发者社区

抽象的使用

abstract修饰的类被称为抽象类

abstract修饰的方法被称为抽象方法

  1. 抽象类当中的抽象方法不能实现
  2. 如果有类继承了抽象类,那么一定要重写并实现这个抽象方法
  3. 抽象类才能有抽象方法,普通类不能有抽象方法
  4. 抽象类可以有非抽象的普通方法,类的普通方法必须实现;子类不会被强制要求重写当前抽象类的普通方法
  5. 抽象类不能创建对象,但是可以使用多态
  6. final不能与abstract同时用,因为两者概念冲突(final修饰类表示基类,基类不能被继承,而抽象类又需要继承;只有子类继承,创建子类对象,才能执行自己的方法)
  7. abstract不能与private同时修饰抽象方法,因为abstract表示需要子类重写,而private又屏蔽了子类的访问,概念冲突(abstract方法默认是public的)
  8. 抽象方法不能使用static,因为static方法针对类层次,类内共享;abstract方法只有继承之后创建子类对象,才能被执行,属于对象层次
  9. 子类不想重写实现父类的抽象方法,这个子类必须也是抽象类
  10. 抽象类可以有构造方法,但是不能实例化,构造器的作用是多态创建抽象类对象的时候,先初始化抽象父类,也就是在new子类构造器之前,先new 父类构造器

面试题

抽象类一定是一个父类吗?

答案:是的,因为需要子类覆盖其方法后,才可以对子类实例化

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Aigtek功率放大器电路的主要作用是什么

功率放大器是电子电路中的一个重要组成部分,它的主要作用是将输入信号的能量放大到更大的幅度,以便驱动负载或传输信号。功率放大器广泛应用于各种领域,如音频放大器、射频放大器、通信设备、无线电设备等。下面我们将详细介绍功率放大器电路…

【NOI】C++算法设计入门之深度优先搜索

文章目录 前言一、深度优先搜索1.引入2.概念3.迷宫问题中的DFS算法步骤4.特点5.时间、空间复杂度5.1 时间复杂度 (Time Complexity)5.2 空间复杂度 (Space Complexity)5.3 小结 二、例题讲解1.问题:1586 - 扫地机器人问题:1430 - 迷宫出口 三、总结四、感…

Rust 使用结构体组织相关联的数据

目录 结构体的定义和实例化 使用字段初始化简写语法使用结构体更新语法从其他实例创建实例使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体结构体示例程序 通过派生 trait 增加实用功能方法语法 定义方法带有更多参数的方法关联函数多个 impl 块本文有…

日志

日志服务管理 在现实生活中,记录日志也非常重要,比如银行的转账记录,飞机上的黑盒子,那么将系统和应用发生的事件记录至日志中,以助于排错和分析使用日志记录的内容包括: 历史事件:时间&#…

甘特图:如何制定一个有效的产品运营规划?

做好一个产品的运营规划是一个复杂且系统的过程,涉及多个方面和阶段。以下是一些关键步骤和考虑因素,帮助你制定一个有效的产品运营规划: 1、明确产品定位和目标用户: 确定产品的核心功能、特点和优势,明确产品在市…

向量的点积和叉积的几何意义

1. 点积 点积(dot product),又称标量积(scalar product)。结果等于。 可用于 判断的是否垂直求投影长度求向量是抑制作用还是促进作用计算两个向量的夹角 2. 叉积 叉积(cross product),又称为向量积(vector product)。模长等…

【C++类和对象】日期类的实现

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

【深度学习实战(21)】使用thop.profile计算模型的FLOPs和Params

一、 含义 FLOPs(计算量):注意s小写,是floating point operations的缩写(这里的小s则表示复数),表示浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。 Params&#xff08…

Dubbo应用可观测性升级指南与踩坑记录

应用从dubbo-3.1.*升级到dubbo-*:3.2.*最新稳定版本,提升应用的可观测性和度量数据准确性。 1. dubbo版本发布说明(可不关注) dubbo版本发布 https://github.com/apache/dubbo/releases 【升级兼容性】3.1 升级到 3.2 2. 应用修改点 应用一般只需要升级dubbo-s…

第53篇:算法的硬件实现<四>

Q:本期我们在DE2-115开发板上实现二进制搜索算法电路,查找数据A在数组中的位置。 A:使用SW[9]设定开始查找信号,数据A由SW[7:0]设定,KEY[0]设定为复位信号,板载50MHz时钟作为电路的时钟输入,确…

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…

【行为型模型】迭代器模式

一、迭代器模式概述 迭代器模式定义&#xff1a;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露其内部的表示。把游走的任务放在送代器上&#xff0c;而不是聚合上。这样简化了聚含的接口和实现,也让责任各得其所。(对象行为型) 迭代器模式的优缺点&…

第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队

关联比赛: 第二届阿里巴巴大数据智能云上编程大赛-智联招聘人岗智能匹配 查看更多内容&#xff0c;欢迎访问天池技术圈官方地址&#xff1a;第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队_天池技术圈-阿里云天池

[Windows] Bypass分流抢票 v1.16.25 五一黄金周自动抢票软件(2024.02.08更新)

五一黄金周要来了&#xff0c;火车票难买到&#xff0c;即便官网候选订票也要看运气&#xff0c;推荐使用这个靠谱的自动抢票软件&#xff0c; 该工具是目前市面上最好用口碑最好的电脑抢票软件&#xff0c;从13年到现在&#xff0c;作者依旧在更新&#xff0c;可以自动识别123…

Linux之 USB驱动框架-USB总线核心和主控驱动(4)

一、USB设备描述符 一个USB设备描述符中可以有多个配置描述符&#xff0c;即USB设备可以有多种配置&#xff1b;一个配置描述符中可以有多个接口描述符&#xff0c;即USB设备可以支持多种功能&#xff08;接口&#xff09;&#xff1b;一个接口描述符中可以有多个端点描述符。 …

Bentley二次开发教程16-元素管理-巩固练习

该练习中的方法涉及到前两期的方法&#xff0c;主要步骤为&#xff1a; 使用拉伸实体功能创建梁与圆柱并进行变换对梁截面进行标注并进行变换对梁与圆柱执行布尔运算对实体进行材质附加 public static void CmdPracticeWork(string unparsed) {DgnFile dgnFile Session.Inst…

小程序AI智能名片S2B2C商城系统:实现分销模式的四大要件深度解析

在当前的电商领域&#xff0c;小程序AI智能名片S2B2C商城系统正以其独特的分销模式&#xff0c;引领着行业创新的风潮。这种模式的成功&#xff0c;离不开四大核心要件&#xff1a;商品、机制、平台和运营。接下来&#xff0c;我们将对这四大要件进行深度解析。 首先&#xff0…

【LeetCode热题100】【多维动态规划】最小路径和

题目链接&#xff1a;64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 经典动态规…

2025年考研复习资料免费获取教程(内容持续更新)

文章目录 导文2025年政治考研复习资料获取2025年英语考研复习资料获取2025年英语一考研复习资料获取2025年英语二考研复习资料获取 2025年数学考研复习资料获取2025年数学一考研复习资料获取2025年数学二考研复习资料获取 导文 考研复习是每一位考研学子都必须经历的重要阶段&a…

重学java 19.面向对象 继承 上

走不出的那段阴霾&#xff0c;很多时候只不过是&#xff0c;我们把它当成了唯一 —— 24.4.22 面向对象整体知识导向&#xff1a; 知识梳理&#xff1a; 1.知道继承的好处 2.会使用继承 3.继承之后成员变量和成员方法的访问特点 4.方法的重写&#xff0c;知道方法重写的使用场景…