自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 收藏
  • 关注

原创 文件操作--IO

Java中使用流对象对文件内容进行操作,从类型上分为以字节为单位读写数据的字节流对象(InputStream、OutputStream)和以字符为单位读写数据的字符流对象(Reader、Writer),流对象的四个核心操作是:①.打开文件(构造方法)(8)②.关闭文件(close())③.读文件(read() 对应 InputStream 和 Reader)④.写文件(write() 对应 OutPutStream 和 Writer)。常见的文本文件格式包括.txt、.html、.xml 等。

2023-12-02 17:59:52 931

原创 JUC(Java.util.concurrent)的常见类

添加完元素之后,再将原容器的引用指向新的容器。例如:图书馆有500个空位,学生扫码入座,可用座位-1(相当于信号量的P操作),学生扫码离座,可用座位+1(相当于信号量的V操作),如果座位为0,就无法再扫码入座了(阻塞等待)。CopyOnWrite容器即写时拷贝的容器,当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行拷贝, 复制出一个新的容器,然后在新的容器里添加元素,ConcurrentHashMap优化了扩容方式,即化整为零:发现需要扩容的线程,只需要创建一个新的数组,

2023-11-27 16:16:45 914

原创 synchronized的原理和Callable接口

偏向锁并不是真正的加锁,只是给线程一个偏向锁的标记,如果一直没有其他线程尝试加锁,则等到synchronized执行完取消偏向锁标记即可,如果有其他线程尝试加锁,则再真在进行加锁,让其它线程进入阻塞等待。这里的重量级锁就是使用OS提供的 mutex 锁,此时其它线程尝试加锁就是在内核态来判断锁是否被占用,如果没被占用则返回用户态,否则就进入等待队列,等待操作系统唤醒。锁消除的主要依据是:如果程序中某些代码块不会被多个线程同时访问,那么这些代码块中的锁就可以被消除,因为不需要花费额外的时间来进行同步操作。

2023-11-11 14:43:17 107

原创 锁策略与CAS

当一个值从A变成B再变成A时,如果在这个时间间隔内,有另外一个线程对这个值进行了改变并且恰好从A变成了另外一个值C,那么CAS操作会误认为这个值没有被修改过,从而可能导致并发异常,这就是CAS的ABA问题。以AtomicInteger为例,CAS实现原子类的原理是在操作值的时候,先读取当前的值,然后对比当前值是否与期望的值相同,如果相同,则执行操作并更新值;支持重复加锁和释放的锁,同一个线程可以多次获得同一个锁,如果线程已经持有该锁,则需要进行重入计数,多少次加锁就需要多少次释放锁才能真正释放。

2023-11-09 19:22:01 81

原创 线程池与工厂模式

线程池的优点是可以避免频繁地创建和销毁线程带来的性能开销,通过线程池获取线程和归还线程通过代码就能实现,相比于直接通过操作系统内核来获取和销毁线程来说开销要小很多。而叫舍友买,舍友可能先去干其它事情再去买,整体行为是不可控的)此外,线程池还可以控制应用程序中的并发线程数,避免因线程过多而造成系统资源的浪费和线程调度的开销。空闲线程的存活时间,即如果线程池中的线程数量大于 corePoolSize,那么多余的线程在空闲一定时间后将被销毁,直到线程池中的线程数重新达到 corePoolSize 为止。

2023-11-03 19:36:51 191

原创 定时器和Timer

此时虽然解决了“忙等”的问题,但还有一个线程安全的问题:如果线程1运行到 this.wait(myTask.getTime() - time) 之前刚好被调度去其他线程执行添加新的任务操作,之后再调度到线程1执行wait操作,即先执行了 schedule() 里的 notify 后再执行构造方法里的 wait ,此时如果新添加的任务的执行时间更靠前仍不能提前唤醒线程1,就会有问题。毫秒时间戳来描述任务执行的时刻),由于这个对象需要放到优先队列中,第一个参数指定即将要执行的任务代码,schedule 方法,

2023-11-03 12:24:40 85

原创 阻塞队列.

♫什么是阻塞队列阻塞队列是一种特殊的队列,它除了具备队列的先进先出的特点外,还具有以下特点:♩.如果队列为空时,执行出队列操作,会阻塞等待,直到另一个线程往队列里添加元素(队列不为空)♩.如果队列满了时,执行入队列操作,会阻塞等待,直到另一个线程取出队列里的元素(队列没有满)阻塞队列常用于实现生产者-消费者模式,通过控制队列的阻塞,使得生产者和消费者的协作更加有效和高效。下面我们先简单认识下生产者-消费者模式~♫什么是生产-消费者模式生产者消费者模式是一种常见的并发编程模式。

2023-10-29 20:13:16 88

原创 单例模式.

通过将构造方法设置为私有的,保证类外无法通过new来创建实例的同时,通过static将uniqueInstance成员属性修饰为类属性(Java代码中的每个类在编译完成后都会生成.class文件,JVM加载时通过读取.class文件中的二进制指令来在内存中构造出类对象(Singleton.class),类对象的属性就是类属性),由于类对象只有一份,故类属性也就只有一份。单例模式是一种设计模式,通过巧用Java的现有语法,实现一个只能被创建一个实例的类,并提供一个全局访问点。♫单例模式的线程安全问题。

2023-10-28 16:35:53 404

原创 线程间的调度顺序

但由于线程的随机调度,并不能保证t1线程比t2线程先执行,如果是t2线程先执行的话,notify先执行,那么notify相当于是无效通知,等到t1线程调用wait方法后就没有对应的notify唤醒了。注:虽然wait(500)与sleep(500)很像,但wait(500)通过notify或notifyAll唤醒不会抛出异常,属于正常的代码,而sleep(500)虽然能通过interrupt唤醒,但是却是以异常的形式唤醒的,属于出问题的代码。可以让一个线程等待令另一个线程执行完毕/一定时间,

2023-10-27 00:00:00 140

原创 线程安全问题

synchronized是可重入锁,即一个线程可以对同一个对象反复加锁(在可重入锁的内部包含了 "线程持有者" 和 "计数器" 两个信息,如果某个线程加锁的时候发现锁已经被人占用,但是恰好占用的正是自己,那么仍然可以继续获取到锁,并让计数器自增,解锁的时候计数器递减为 0 的时候,才真正释放锁)加了synchronized之后,若获取不到锁,则会一直阻塞等待,直到获取锁为止;线程1拿到了锁A,线程2拿到了锁B,线程1再尝试获取锁B,线程2再尝试获取锁A,线程1等待线程二释放锁B,线程2等待线程1释放锁A。

2023-10-25 14:39:51 56

原创 多线程编程

线程可以看作是进程中的一个实体,一个进程可以包含一个或多个线程,这些线程共享进程的同一份资源(主要指内存(一个线程new的对象其他线程也能用)和文件描述符表(一个线程打开的文件其他线程也能用)),但是每个线程都拥有自己的栈空间和局部变量,都可以执行各自的上下文,且不会相互影响。start()的作用是调用系统的API,通过操作系统内核创建新的线程,并把要执行的指令交给新线程,当新线程调度到CPU上执行是,就执行到run()方法。需要记住一点:JVM会在一个进程的所有非守护线程结束后,才会结束运行。

2023-10-24 00:30:00 95

原创 计算机工作原理

为了避免一个进程因为越界访问而操作另一进程的内存地址,进程所用的内存空间是虚拟地址(不是直接指向物理内存中的地址,是可变的),而不是物理地址(对应的是实际存储器中的位置,是不可变的)。操作系统还可以划分为驱动程序(用于与硬件设备进行通信和控制的一种软件),操作系统内核(操作系统的核心,对上提供稳定的运行环境,对下管理硬件资源),系统调用(操作系统给应用软件提供的API)三部分,当有程序想调用硬件设备,需要先通过系统调用,把操作指令告诉给系统内核,内核再调用驱动程序。软件可以分为系统软件和应用软件两大类。

2023-10-18 14:22:29 90

原创 【MySQL】Java的JDBC编程

我们前面操作数据库都是使用数据库自带的客户端通过网络访问数据库服务器,而要想通过代码来访问数据库服务器就需要自己实现一个数据库客户端(各种数据库都提供了一系列API可以使我们较为方便地实现一个客户端),而由于不同数据库提供的API不同,在Java领域就有大佬出来将这些API统一成一套:JDBC,每个数据库也都提供了能够适应JDBC的“驱动包”(API的具体实现)。JDBC这套API已经成为Java标准库的一部分,它屏蔽了不同数据库原生API之间的差异,使用一套API规范了不同数据库的编程操作。

2023-10-15 19:40:16 235

原创 【MySQL】索引和事物

♫索引♪什么是索引索引是存储在磁盘上的一个数据结构,通过索引可以快速地定位到存储在磁盘上的数据。索引在提高查询速度的同时,还提高了增删改(增删改的同时还需要额外调整索引)和空间的开销(构建索引需要额外的磁盘空间)。♪索引的数据结构索引的目的是为了加快查询速度,在我们已知的数据结构中,虽然哈希表查询的时间复杂度(O(1))最低,但哈希表并不能查询指定范围的数据,故并不适合构成MySQL里的索引。

2023-10-14 11:47:37 304

原创 【MySQL】联合查询、子查询、合并查询

这里提供了三个表:接下来就针对这三个表来进行联合查询~我们在实际开发过程中,数据往往来自不同的表,所以需要多表联合查询。联合查询就是对多张表的数据取笛卡尔积,故这里先简单介绍一下笛卡尔积:♫笛卡尔积笛卡尔积(Cartesian product),也称为直积,是指两个集合中每个元素之间所有可能的组合。(如:假设集合A ={1, 2},集合B ={a, b, c}。则集合A与集合B的笛卡尔积为{(1,a), (1,b), (1,c), (2,a), (2,b), (2,c)})♫联合查询。

2023-10-12 19:38:22 202

原创 【MySQL】聚合查询与分组查询

前面我们所用的基础的查询操作只能对每行进行独立的查询操作,而要是想要查询的结果是该列所有数据的平均值,最大或最小值,则需要使用聚合查询才能做到。聚合查询需要用到聚合函数,因此,要学会聚合查询,首先得先了解下MySQL中的聚合函数。①.count(1)和count(*)的实现方式略有不同,count(1)是对表中的每一行都执行一次计数操作,而count(*)则是对整个表执行计数操作。上面聚合查询的对象是所有人,要想查询的对象为同一职业的人,可以通过。select count(列名/表达式) from 表名;

2023-10-11 16:30:30 607

原创 【MySQL】数据库约束与数据表的设计

关系型数据库一个重要内容是需要包装数据的‘完整性’和‘正确性’,而由我们自己来确保数据的正确性是不可靠的,因此MySQL中提供了一些约束来帮助我们保证数据的正确性。①.PRIMARY KEY和UNIQUE一样都是先查询再插入,故MySQL会默认给被PRIMARY KEY和UNIQUE约束的列添加索引,以提高查询速率。添加自增主键后,Extra行的值为auto_increment,此后id这一列若是没有输入值,系统会自动设置id为:前面id的最大值+1。

2023-10-08 17:15:37 197

原创 【MySQL】表的基础增删改查

前面我们已经知道怎么来创建表了,接下来就来对创建的表进行一些基本操作。接下来就针对该表进行增删改查的操作~♫新增♪单行数据插入新增操作是指对表增添数据:语法:insert into 表名 values(类型1的数据,类型2的数据,类型3的数据...);注:①.into也可以省略不写②.插入的数据必须和定义表的列数及顺序一致♪查看默认编码。

2023-10-05 19:26:57 1189

原创 【MySQL】初识数据库

♫什么是数据库数据库是使用各种数据结构设计出来的一种用于存储、组织和管理数据的软件系统。数据库可以提供远程服务,即通过远程连接来使用数据库,因此也称为数据库服务器。注:数据库中的数据通常是存储在硬盘或固态硬盘等持久性存储介质中,故数据库中的数据能持久化保存,断电后也不会丢失。♫数据库的分类关系型数据库(RDBMS)是一种基于关系模型的数据库。其中数据以表格的形式组织并保留在多个相关联的表格之间的关系中,每个表格代表一个实体类别(如顾客、产品或订单),并且每个表格之间的关系通过共享键实现。

2023-10-01 20:26:58 217

原创 【Java SE】Lambda表达式

可以是表达式也可以代码块,是函数式接口里方法的实现。是一种匿名函数,常作为函数式编程的一部分,用于向函数传递行为作为参数,或者用于将行为作为返回值返回。变量捕获是指将外部类中的变量复制到内部类中,这样内部类就可以在外部类的作用域之外访问这些变量。:类似方法中的形参列表,这里的参数是函数式接口里的参数。函数式接口是一种特殊的接口,它的接口里有。①.如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。的参数类型可以省略,如果要省略,每个参数的类型都要省略。①.->前只有一个参数,()可以省略;

2023-09-27 20:04:20 205 1

原创 【Java SE】反射与枚举

为了实现枚举类型的安全性和可维护,Java枚举类型的构造方法还有两个隐藏参数(第一个隐藏参数表示枚举类型的名称,它是一个字符串类型的常量,由编译器自动生成;任何一个类,哪怕其构造方法是私有的,我们也可以通过反射拿到他的实例对象,那么枚举的构造方法也是私有的,我们是否可以拿到呢?注:一个类在 JVM 中只会有一个 Class 实例,即上面获取的c1,c2,c3均为一个对象。Java反射是Java语言的一个特性,它允许程序在运行时动态获取类的信息和调用类的方法。class类表示类的实体,是反射机制的起源。

2023-09-27 12:47:06 83

原创 【数据结构】哈希表

处理哈希冲突的方法包括开放地址法、链表法、再哈希法等。虽然哈希表一直在和冲突做斗争,但在实际使用过程中,我们认为哈希表的冲突率是不高的,冲突个数是可控的,也就是每个桶中的链表的长度是一个常数,所以,通常意义下,我们认为哈希表的插入/:在发生哈希冲突时,二次探测从冲突槽的下一个槽开始,依次查找每个槽,但是探测的步长是由一个二次函数计算出来的,例如:步长为1^2,2^2,3^2,4^2,…开链法的基本思想是将哈希表中每个位置上的元素不再是单个的值,而是一个链表,当发生哈希冲突时,将新的元素添加到链表的末尾。

2023-09-23 16:16:16 115

原创 【数据结构】二叉搜索树与Map和Set

因此,为了保证每个节点的左右子树高度相差不超过1,这才有了AVL树(通过左旋,右旋,左右双旋调整高度差),而为了减少AVL的旋转次数,这才有了红黑树(通过染色来保证平衡,不需要每次都调整,复杂度相对较低)。③.由于二叉搜索树左子树的节点值小于根节点,右子树的节点值大于根节点,故二叉搜索树还支持范围查询。的容器或者数据结构,它适合多态查找(查找时能进行一些插入和删除的操作),其搜索的效率与其具体的实例化子类有关。个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树的高度越高,查找效率越低。

2023-09-22 08:51:30 208

原创 【数据结构】七大排序算法详解

如果分割点随机选择,则最坏时间复杂度为O(n^2)的概率很小,平均时间复杂度为O(n log n)。(排序一组逆序序列):对n-1个元素进行插入操作,每个元素对应的移动次数依次为:1、2、3、....、n-1,等差数列求和得(n-1)(1+n-1)/2=n(n-1)/2=(n^2-n)/2,故算法时间复杂度为。对n-1个元素进行操作,每个元素对应的比较次数依次为:n-1,n-2,n-3,...,1,等差数列求和得(n-1)(1+n-1)/2=n(n-1)/2=(n^2-n)/2,故算法时间复杂度为。

2023-09-18 21:21:17 430 1

原创 【Java SE】对象的比较

重写equals方法虽然能比较对象的大小,但返回的是正负,如果想要按照大于小于的方式进行比较需要用到后面两种方法。Java中的基本类型可以直接通过比较运算符(>,=,

2023-09-14 23:50:59 31

原创 【数据结构】PriorityQueue和堆

null)的时候,是优先使用比较器比较的,而用户没有传比较器(comparator==null)的时候,堆的节点的类型必须是实现了comparable接的。通过观察源码可以发现:当容量小于64时,是按照oldCapacity的2倍+2的方式扩容的,当容量大于等于64,是按照oldCapacity的1.5倍方式扩容的 ,如果容量超过了MAX_ARRAY_SIZE,按照MAX_ARRAY_SIZE来进行扩容。堆是一颗特殊的完全二叉树,我们可以通过向下调整一颗普通的二叉树来创建堆,这里以创建小根堆为例。

2023-09-13 19:35:14 45

原创 【数据结构】二叉树的非递归遍历与最近公共祖先

2.因为获取栈内节点的右节点时没有将栈内节点出栈,故当遍历完该节点的右节点后才会轮到该节点出栈,此时若该节点的右节点不为空,就需要判断该节点的右节点是否被打印过了,不然就会再遍历一遍该节点的右边。如上图所示,先遍历根节点和其左子树,将遍历到的节点入栈,之后再取出栈内的节点遍历其右子树。D,C的最近公共祖先是A;E,F的最近公共祖先是B。1.因为根节点是最后打印的,故获取栈内节点的右节点时并不能将栈内的节点出栈。我们一般使用递归遍历二叉树,但借助栈我们也可以通过非递归遍历二叉树。二叉树的最近公共祖先。

2023-09-10 20:49:11 285

原创 【数据结构】二叉树

•二叉树的节点•二叉树的前序遍历•二叉树的中续遍历•二叉树的后续遍历•二叉树的层序遍历•二叉树的节点个数•二叉树的叶子节点个数•二叉树第k层节点数•二叉树高度•二叉树中是否含有值为val的节点•二叉树是否为完全二叉树什么是树二叉树是数的一种,要了解什么是二叉树首先得知道数据结构中树是什么东东。数据结构中的树当然不是指路边的树木,它指的是具有像树木一样从树干开枝散叶的一种结构。简单来说,树就是一种非线性的数据结构,它是由nn>=0。

2023-09-09 16:37:41 48

原创 【数据结构】栈和队列

进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列同样可以通过数组和链表实现,下面我们一起通过双向链表来实现一个队列。进行插入操作的一端称为队尾,进行删除操作的一端称为队头。在Java集合中Queue是个接口,底层是通过双向链表实现的。Java集合里的stack就是栈,它的底层是通过数组实现的。通过数组和链表都可以实现栈,下面我们通过数组来实现一个栈。只允许在固定的一端进行插入和删除元素操作。都是动态的顺序表,不同的是。

2023-09-05 13:40:08 28

原创 【数据结构】LinkedList与链表

LinkedList的底层就是一个双向链表,和ArrayList一样,LinkedList。若为空链表,则直接插入;List(只要是实现了Colection接口且泛型类型是E或其子类的都可以)通过上图我们还可以发现与ArrayList不同, LinkedList并。链表的结构非常多样,分单向和双向,带头和不带头,循环和非循环。链表相比顺序表的优点是可以随用随取,插入删除不需要挪动元素。我们有了单链表的基础后,自己实现一个双向链表也就比较简单了。

2023-09-03 19:34:19 46

原创 【数据结构】ArrayList与顺序表

要想删除数组中首次出现的某个数字得➀.先保证当前数组不为空,➁.再去寻找该数字的位置,➂.判断是否找的到,找不到抛出异常,找到了将指定位置后面的元素一起往前挪一个位置,➃.最后不要忘记记录有效数字个数的属性值减一。物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。要获取指定位置的元素需要➀.判断当前数组是否为空,➁.指定的位置是否合法,➂.最后再返回指定位置的元素。需要➀.先判断当前数组是否为空,➁.指定的位置是否合法,➂再更新指定位置的元素的值。

2023-09-01 19:03:18 38

原创 【Java SE】泛型

我们已经知道泛型是在编译时根据传递的数据类型进行类型检查和转换,其实在编译过程中泛型还会将所有的T替换成 Object,这种机制叫做擦除机制。而泛型把类型作为参数传递,能指定当前的容器,要持有什么类型的对象,同时让编译器去做检查,实现需要什么类型,就传入什么类型。通过对比可以发现泛型可以帮助我们在存放元素的时候进行类型检查,在取出元素的时候进行类型转换。一般的类和方法只能使用具体的类型,而通过泛型能对类型实现参数化,使类和方法适用多种类型。在定义泛型类时,可以通过类型边界对传入的类型变量做一定的约束。

2023-08-30 13:16:07 36

原创 【数据结构】初识数据结构与算法

数据结构结构 = 数据+结构(数据是存储在计算机上的描述客观事物的符号,结构包括数据的逻辑结构和存储结构),数据结构可以看成是描述和组织数据的方式(之前学过的数组就是一种数据结构)一个算法所花费的时间与其中语句的执行次数成正比例,故可以把算法中的基本操作的执行次数作为算法的时间复杂度。世上算法千千万万,要想辨别算法的好坏就需要用到时间复杂度和空间复杂度,求算法的复杂度一般都是求最坏情况下的。的空间,而是变量的个数。时间复杂度用来衡量算法的运行时间。递归的时间复杂度:递归的次数 * 每次递归后执行的次数。

2023-08-04 05:29:10 34

原创 【Java SE】异常

2. 声明的异常必须是 Exception 或者 Exception 的子类,如果抛出多个异常类型具有父子关系,直接声明父类即可。3.如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到 JVM 收到后中断程序。(常见的异常有:算术异常,数组越界异常,空指针异常等)4.如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误。在程序编译期间发生的异常,称为编译时异常,也称为受检查异常。

2023-07-26 15:06:29 37

原创 【Java SE】String 类

当字节码文件加载时,"hello"就会创建好并保存在字符串常量池中,当使用String s1 = "hello"创建对象时,先在字符串常量池中寻找该字符串,找到后将字符串引用赋值给s1。先按照字典序进行比较,遇到不相等的字符则返回两字符大小的差值,若字符相等,长度不相等,则返回两字符串长度的差值,完全相等返回0、我们知道==比较的是变量中的值,字符串是引用类型==比较的是引用中的地址,故通过==可以比较是否是同一个变量。Java里一切皆对象,作为应用广泛的字符串,Java专门为其提供了String类。

2022-10-07 20:04:19 125 1

原创 【Java SE】数组

Java里的数组是一种引用类型,与基本数据类型是直接在变量空间存放对应的值不同,引用数据类型在变量空间中存放的是其对象所在空间的地址。内存是一块连续的存储空间,主要用来存储程序运行时产生的数据,根据不同的数据,JVM对所使用的内存按照功能的不同划分成了。可见,数组变量里并不直接存放数组中的元素,而是存储在堆上的相应对象的地址,通过地址来操作堆上的对象。数组在内存中是移动连续的空间,下标从零开始到N-1,可以通过下标进行访问。注:若数组中元素没有进行初始化,则数组中的元素会为其类型对应的默认值。

2022-09-13 16:55:10 89

原创 【Java SE】抽象类和接口

4.接口成员属性默认是public static final(被final修饰,是不能修改的常量),成员方法默认是public abstract,不能包含普通方法和字段;1.接口只有定义,不能有方法的实现,jdk8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。修饰的类,它除了可以含有普通类的方法,属性和构造方法外还可以包含一种被。4.抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。公共的行为规范标准,在使用时,只要符合规范标准,就可以通用。

2022-09-12 07:18:07 92

原创 【Java SE】继承和多态

Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联(具有某些相同的共性),而Java中用继承的语法便能建立类的联系。父类构造方法没有无参的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用。子类中也存在构造方法,且在子类的构造方法会默认提供一个调用基类的无叁构造方法(super();多态的实现必须在继承体系下,子类对父类中的方法进行重写,使用者通过父类的引用调用重写方法。

2022-09-05 00:00:06 121

原创 【Java SE】类和对象

初识面向对象初识面向对象我们知道Java是一门纯面向对象的语言,那么何为面向对象呢?拿洗衣服这件事来说,这个过程是人将衣服放进洗衣机,人将洗衣粉倒入洗衣机,人启动洗衣机,衣服就在洗衣机的作用下洗干净并甩干。整个过程中涉及到的对象有人,衣服,洗衣粉,洗衣机。面向对象所注重的就是过程中对象与对象之间的交互,而不关心洗衣粉的过程(洗衣机是如何工作的),即面向对象是以功能来划分问题,而不是以步骤解决的。类的定义。

2022-09-02 23:55:29 170

原创 【Java SE】递归思想解决汉诺塔问题

注:用递归求解问题时, 不要试图跟踪大型递归的过程,关键在于找出递归的递归方程式,即要完成某一步,那么某一步的前一步要干嘛。在求hanoi(n, pos1, pos2, pos3)的时候,你就默认f(n -1, pos1, pos2, pos3)已经被求出来了,至于怎么求的,这个就交给计算机就好啦~1.把A柱上n-1块盘子通过C柱移到B柱上 2.把A柱上的最后一块盘子移动到C柱上 3.把B柱上n-1块盘子通过A柱从B柱移动到C柱上。一次只移动一片,不管在哪根针上,小片必须在大片上面。...

2022-08-07 23:34:46 126

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除