![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java学习
JohnArchie
努力努力再努力
展开
-
java的各种集合为什么不安全(List、Set、Map)以及代替方案
我们已经知道多线程下会有各种不安全的问题,都知道并发的基本解决方案,这里对出现错误的情况进行一个实际模拟,以此能够联想到具体的生产环境中。一、List 的不安全1.1 问题看一段代码:public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); for (int i = 0; i < 3; i++){ new Thread(()-原创 2020-10-13 22:09:08 · 697 阅读 · 0 评论 -
ConcurrentHashMap源码解析,多线程扩容
前面一篇已经介绍过了 HashMap 的源码:HashMap并不是线程安全的,他就一个普通的容器,没有做相关的同步处理,因此线程不安全主要体现在:put、get 等等核心方法在多线程情况下,都会出现修改的覆盖,数据不一致等等问题。比如多个线程 put 先后的问题,会导致结果覆盖,如果一个 put 一个get,也可能会因为调度问题获取到错误的结果;多线程操作有读有写的时候,可能会出现一个典型异常:ConcurrentModificationException另外扩容的时候,hashmap1.7 的实原创 2020-10-12 15:37:34 · 1894 阅读 · 1 评论 -
juc包:使用 juc 包下的显式 Lock 实现线程间通信
一、前置线程间通信三要素:多线程+判断+操作+通知+资源类。上面的五个要素,其他三个要素就是普通的多线程程序问题,那么通信就需要线程间的互相通知,往往伴随着何时通信的判断逻辑。在 java 的 Object 类里就提供了对应的方法来进行通知,同样的,保证安全的判断采用隐式的对象锁,也就是 synchronized 关键字实现。这块内容在:java多线程:线程间通信——生产者消费者模型已经写过。二、使用 Lock 实现线程间通信那么,我们知道 juc 包里提供了显式的锁,即 Lock 接口的各原创 2020-10-09 17:35:35 · 135 阅读 · 0 评论 -
java多线程:线程池和阻塞队列
一、线程池定义和使用jdk 1.5 之后就引入了线程池。1.1 定义从上面的空间切换看得出来,线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需要进行操作系统状态切换。为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配、调优与监控。(数据库连接池也是一样的道理)什么时候使用线程池?单个任务处理时间比较短;需要处理的任务数量很大。线程池优势?重用存在的线程,减少线程创建、消亡的开销,提高性能、提高响应原创 2020-10-08 10:59:01 · 3766 阅读 · 0 评论 -
java多线程:线程的实现
一、用户线程 && 内核线程线程:一般分为 用户线程(ULT) 和 内核线程(KLT)。用户线程:用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快。内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。也就是说用户程序管理。内核线程(KLT):系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核原创 2020-10-08 10:15:24 · 594 阅读 · 0 评论 -
Windows下的 Redis 安装教程
一、下载Redis 的 Windows 版本只有 github 上下载才行,打开网址:https://github.com/tporadowski/redis/releases这里不用 msi 完成,直接下载 zip 文件解压然后用命令来。下载第二个。二、解压配置解压,配置一下环境变量,将解压存放的位置 xxx\Redis 加到 path 里。示例:打开命令行窗口,输入命令:redis-server.exe已经显示服务启动,等待连接了。但是这里就可以看到中间有原创 2020-09-21 22:01:57 · 652 阅读 · 0 评论 -
java里的锁总结(synchronized隐式锁、Lock显式锁、volatile、CAS)
一、介绍首先, java 的锁分为两类:第一类是 synchronized 同步关键字,这个关键字属于隐式的锁,是 jvm 层面实现,使用的时候看不见;第二类是在 jdk5 后增加的 Lock 接口以及对应的各种实现类,这属于显式的锁,就是我们能在代码层面看到锁这个对象,而这些个对象的方法实现,大都是直接依赖 CPU 指令的,无关 jvm 的实现。接下来就从 synchronized 和 Lock 两方面来讲。二、synchronized2.1 synchronized 的使用如果修饰的原创 2020-09-17 10:07:13 · 439 阅读 · 0 评论 -
MySQL的事务机制和锁(InnoDB引擎、MVCC多版本并发控制技术)
一、事务(数据库的事务都通用的定义)1.1 事务定义事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。事务通常以 BEGIN TRANSACTION 开始,以COMMIT 或 ROLLBACK 操作结束:COMMIT 即提交,提交事务中所有的操作、事务正常结束;ROLLBACK 即回滚,撤销已做的所有操作,回滚到事务开始的状态。1.2 事务的四种特性ACID: 原子性,一致性,隔离性,持久性。ACID属性含义原子性(Ato原创 2020-09-15 21:23:15 · 485 阅读 · 0 评论 -
java的内部类以及lambda表达式
内部类内部类是指在一个外部类的内部再定义一个类。内部类的出现,再次打破了Java单继承的局限性。内部类可以是静态 static 的,也可用 public,default,protected 和 private 修饰。(而外部顶级类即类名和文件名相同的只能使用 public 和 default)。注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两个类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。**编译完成后出现 outer.class 和outer$inner原创 2020-09-13 15:46:17 · 453 阅读 · 0 评论 -
HashMap源码解析、jdk7和8之后的区别、相关问题分析
一、概览HashMap<String, Integer> map = new HashMap<>();这个语句执行起来,在 jdk1.8 之前,会创建一个长度是 16 的 Entry[] 数组,叫 table,用来存储键值对。在 jdk 1.8 后,不在这里创建数组了,而是在第一次 put 的时候才会创建数组叫 Node[] table ,用来存储键值对。二、源码的成员变量分析声明部分:HashMap 实现了 Map 接口,又继承了 AbstractMap,但是 Ab原创 2020-09-07 12:28:42 · 302 阅读 · 0 评论 -
类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型
一、类文件的结构我们都知道,各种不同平台的虚拟机,都支持 “字节码 Byte Code” 这种程序存储格式,这构成了 Java 平台无关性的基石。甚至现在平台无关性也开始演变出 “语言无关性” ,就是其他语言也可以运行在 Java 虚拟机之上,比如现在的 Kotlin、Scala 等。实现语言无关性的基础仍然是虚拟机和字节码存储格式,Java 虚拟机步包括 Java 语言在内的任何语言绑定,他只和 “Class 文件” 这种特定的二进制文件格式所关联,Class 文件中包含了 Java 虚拟机指令集、符原创 2020-09-06 14:57:05 · 187 阅读 · 0 评论 -
JVM内存区域,分代策略,垃圾收集算法,垃圾收集器
本文整理自周志明老师的《深入理解Java虚拟机-JVM高级特性与最佳实践》第3版的第二章和第三章。加上了一些网上拼拼凑凑的图片,个人认为很多博客复制来复制去,最后的东西都看不懂,所以还是码了一下知识点,也用作自己记忆。一、一个命令上面的结果显示了 jvm 的模式:Client VM(-client),为在客户端环境中减少启动时间而优化;Server VM(-server),为在服务器环境中最大化程序执行速度而设计。在文件路径:jdk-11.0.7+10\lib 下面可以更改 jvm.cfg原创 2020-09-05 10:48:16 · 362 阅读 · 0 评论 -
java多线程:Volatile关键字&&DCL单例模式,volatile 和 synchronized 的区别
Volatile 英文翻译:易变的、可变的、不稳定的。一、volatile 定义及用法多个线程的工作内存彼此独立,互不可见,线程启动的时候,虚拟机为每个内存分配一块工作内存,不仅包含了线程内部定义的局部变量,也包含了线程所需要使用的共享变量的副本,是为了提高效率。在之前的示例中,线程不安全的问题,我们使用线程同步,也就是通过 synchronized 关键字,对操作的对象加锁,屏蔽了其他线程对这块代码的访问,从而保证安全。这里的 volatile 尝试从另一个角度解决这个问题,那就是保证变量原创 2020-09-04 10:58:04 · 188 阅读 · 0 评论 -
java 的 ThreadLocal
除了前面一直讲的加锁的同步方式之外,还有一种保证一种规避多线程访问出现线程不安全的方法就是使用 ThreadLocal。在多线程环境下,每个线程都有自己的数据,一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有自己的能看见,不会影响其他线程。ThreadLocal 能够放一个线程级别的变量,其本身能够被多个线程共享使用,并且又能够达到线程按安全的目的。说白了,ThreadLocal就是为了在多线程环境下保证成员变量的安全。最常用的地方,就是为每个线程都绑定一个数据库连接,http请求、用户身原创 2020-08-20 16:41:34 · 179 阅读 · 0 评论 -
多线程的指令重排问题:as-if-serial语义,happens-before语义;volatile关键字,volatile和synchronized的区别
一、指令重排问题你写的代码有可能,根本没有按照你期望的顺序执行,因为编译器和 CPU 会尝试指令重排来让代码运行更高效,这就是指令重排。1.1 虚拟机层面我们都知道CPU执行指令的时候,访问内存的速度远慢于 CPU 速度。为了尽可能减少内存操作带来的 CPU 空置的影响,虚拟机会按照自己的一些规则将程序编写顺序打乱:即写在后面的代码在时间顺序上可能会先执行,而写在前面的代码会后执行。当然这样的前提是不会产生错误。不管谁先开始,总之后面的代码在一些情况下存在先结束的可能。1.2 硬件层面在硬件层原创 2020-08-19 17:52:12 · 396 阅读 · 0 评论 -
线程的定时调度:Timer和Timertask
一、线程的定时调度 timer和timertask任务定时调度:我们可以通过 java.util 的 Timer 和 Timertask 实现定时启动某个线程。java.util.Timer:类似闹钟的功能,本身实现的就是一个线程;java.util.TimerTask:一个抽象类,本身他就实现了 Runnable 接口,所以该类具备多线程的能力。通过 Timer 的 schedule 方法就可以进行安排,指定开始时间、指定间隔时间等等。测试使用代码:/*** 借助timer和timer原创 2020-08-19 15:52:57 · 471 阅读 · 0 评论 -
java多线程:线程间通信——生产者消费者模型
一、背景 && 定义多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步。另一个问题是,多个线程之间如何协作呢?我们看一个仓库出货问题(更具体一些,快餐店直接放好炸货的架子,不过每次只放一份)假设仓库中只能存放一件商品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走进行消费;如果仓库中没有商品,那么生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止;如果仓库中放有产品,消费者可快速取走并消费,否原创 2020-08-19 11:04:48 · 774 阅读 · 0 评论 -
java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决
0、不同步的问题并发的线程不安全问题:多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全。我们来看三个比较经典的案例来说明线程不安全的问题。0.1 订票问题例如前面说过的黄牛订票问题,可能出现负数或相同。线程创建方式&&黄牛订票模拟0.2 银行取钱再来看一个取钱的例子:/* 模拟一个账户*/class Account{ int money; String name; public Account(int money,原创 2020-08-18 13:30:58 · 1268 阅读 · 2 评论 -
线程的优先级&& 守护线程
一、线程的优先级java 提供了一个线程调度器来监控程序种启动后进入就绪状态的所有线程,线程调度器按照线程的优先级决定应该调度哪个线程来执行,优先级高的被优先调度。优先级用数字来表示,范围从 1 到 10:Thread.MIN_ PRIORITY = 1;Thread.MAX_ PRIORITY = 10;Thread.NORM_PRIORITY = 5.优先级的设定,建议在 start() 方法的调用之前进行设定。设定方式就是 new 出线程之后:t.setPriority(Threa原创 2020-08-17 10:13:13 · 171 阅读 · 0 评论 -
java线程的五大状态,阻塞状态详解
一、状态简介一个线程的生命周期里有五大状态,分别是:新生就绪运行死亡运行后可能遇到的阻塞状态二、相关方法2.1 新生状态Thread t = new Thread();正如我们前面所说的,一个线程开始之后有自己的内存空间,这些工作空间和主内存进行交互,从主内存拷贝数据到工作空间。当这个语句执行的时候,线程创建,开辟工作空间,也就是线程进入了新生状态。2.2 就绪状态普通情况,一旦调用了:t.start();start 方法被调用,线程立即进入了就绪状态,表示这个线程具原创 2020-08-17 09:45:54 · 12299 阅读 · 1 评论 -
设计模式:装饰者模式介绍及代码示例 && JDK里关于装饰者模式的应用
0、背景来看一个项目需求:咖啡订购项目。咖啡种类有很多:美式、摩卡、意大利浓咖啡;咖啡加料:牛奶、豆浆、可可。要求是,扩展新的咖啡种类的时候,能够方便维护,不同种类的咖啡需要快速计算多少钱,客户单点咖啡,也可以咖啡+料。最差方案直接想,就是一个咖啡基类,然后所有的单品、所有的组合咖啡都去继承这个基类,每个类都有自己的对应价格。问题:那么多种咖啡和料的组合,都相当于是售卖的咖啡的一个子类,全都去实现基本就是一个全排列,显然又会类爆炸。并且,扩展起来,多一个调料,都要把所有咖啡种类算上重新组合一次原创 2020-08-16 14:01:41 · 247 阅读 · 0 评论 -
设计模式:桥接模式及代码示例、桥接模式在jdbc中的体现、注意事项
目录0、背景一、桥接模式二、使用桥接模式的源码:JDBC三、桥接模式的注意事项0、背景加入一个手机分为多种款式,不同款式分为不同品牌。这些详细分类下分别进行操作。如果传统做法,需要将手机,分为不同的子类,再继续分,基本属于一个庞大的多叉树,然后每个叶子节点进行相同名称、但是细节不同的功能实现。问题:类爆炸:类的增加基本没有任何优化,多一个就要妥妥的增加类;违反单一原则:增加一个品牌,影响每种类型下的这个品牌,增加一个类型,影响每个品牌的这个类型。一、桥接模式解决上面说的问题的方式就是使原创 2020-08-15 10:52:06 · 255 阅读 · 0 评论 -
设计模式:适配器模式(类适配器、对象适配器、接口适配器)
目录一、类适配器模式二、对象适配器模式三、接口适配器模式四、适配器模式应用适配器模式的工作原理:将一个类的接口转换为另一种接口,让原本接口不兼容的类可以兼容。从用户的角度是看不到适配器的,是解耦的;用户调用的是适配器转化后的目标接口方法,适配器再调用被适配者的相关接口方法。(比如用户只用type-C,要的是这个口给出的5v电压,而适配器去插插孔),这样对于用户来说,只是目标和接口交互。一、类适配器模式类适配器会有一个 Adapter 类,通过继承 src(被适配者) 类,实现 dst(目标) 接口原创 2020-08-14 09:39:56 · 371 阅读 · 0 评论 -
设计模式:建造者模式及在jdk中的体现,建造者模式和工厂模式区别
0、背景建造模式(Builder模式)假如有一个需求:盖房子,盖房子过程是一致的:打桩、砌墙、封顶。但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅。根据直接的思路,不用设计模式思想,我们也许会:写一个 CommonHouse 抽象类,然后里面规定了打桩、砌墙、封顶三个方法;让不同房子继承这个类;最后调用的时候调用分别的方法即可。在继承抽象类、子类区分这一块,思想没有问题,问题出现这些类本身。缺点:过于简单,将产品(房子)和创建产品(房子建造流程)封装在了一起,耦合性增强了。(可原创 2020-08-14 09:20:22 · 465 阅读 · 0 评论 -
java的线程、创建线程的 3 种方式、静态代理模式、Lambda表达式简化线程
0、介绍线程:多个任务同时进行,看似多任务同时进行,但实际上一个时间点上我们大脑还是只在做一件事情。程序也是如此,除非多核cpu,不然一个cpu里,在一个时间点里还是只在做一件事,不过速度很快的切换,造成同时进行的错觉。多线程:方法间调用:普通方法调用,从哪里来到哪里去,是一条闭合的路径;使用多线程:开辟了多条路径。进程和线程:也就是 Process 和 Thread ,本质来说,进程作为资源分配的单位,线程是调度和执行的单位。具体来说:每个进程都有独立的代码和数据空间(进程上下文),进程间原创 2020-08-12 16:51:34 · 511 阅读 · 0 评论 -
设计模式:原型模式介绍 && 原型模式的深拷贝问题
0、背景克隆羊问题:有一个羊,是一个类,有对应的属性,要求创建完全一样的10只羊出来。那么实现起来很简单,我们先写出羊的类:public class Sheep { private String name; private int age; private String color; //下面写上对应的get和set方法,以及对应的构造器}然后,创建10只一样的羊,就在客户端写一个代码创建: //原始羊 Sheep sheep = new Sheep("tom原创 2020-08-12 15:41:10 · 321 阅读 · 0 评论 -
设计模式:工厂设计模式介绍及3种写法(简单工厂、工厂方法、抽象工厂)
0、介绍给一个背景:一个pizza订购项目,pizza本身的种类要便于扩展和维护,那么种类很多、制作过程也不少、还要完成订购的功能。按照一般的思路,类图设计如下:其中:Pizza类按照面向对象的设计思路,制作过程对应的方法在其中实现;由于需要不同的类型 Pizza,而在 prepare 步骤不同,所以 Pizza 做成抽象类,而两个不同类型的 Pizza 去继承 Pizza 类;还需要一个的 OrderPizza 类,接受预定类型,完成对应的pizza类订购操作;然后提供一个入口 Pizz原创 2020-08-11 10:33:59 · 393 阅读 · 0 评论 -
设计模式:单例模式介绍及8种写法(饿汉式、懒汉式、Double Checked Locking、静态内部类、枚举)
单例模式0、介绍一、饿汉式(静态常量)二、饿汉式(静态代码块)三、懒汉式(线程不安全)四、懒汉式(线程安全,同步方法)五、懒汉式(同步代码块)六、 双重检查Double Check七、静态内部类八、枚举九、总结十、单例模式在JDK里的应用0、介绍单例模式,就是采用一定方法,保证整个软件系统里,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(这种方法一般是静态的)。单例模式在实际开发中有 5 种写法+加 3 种。饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒原创 2020-08-09 16:40:54 · 294 阅读 · 0 评论 -
设计模式七大原则及代码示例
七大原则:单一职责原则;接口隔离原则;依赖倒转原则;里氏替换原则;开闭原则ocp;迪米特法则;合成复用原则。设计模式其实包含了面向对象的精髓,封装、继承、多态。原创 2020-08-08 11:07:18 · 584 阅读 · 0 评论 -
JDK11.0.7下载及安装详细教程,步骤解释(win10)
0.背景知识JRE: Java Runtime EnvironmentJDK:Java Development KitJRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的原创 2020-06-22 16:47:15 · 10660 阅读 · 3 评论 -
终于看懂了 java的 Integer.bitCount() 方法源码,超详细分析
问题来源剑指Offer的一道题目:计算二进制表达里 1 的个数,题解在我的博客里:但是发现 java 本身也提供了这个方法,所以就来看看底层的源码。public static int bitCount(int i) { // HD, Figure 5-2 i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333原创 2020-06-07 22:17:35 · 1790 阅读 · 3 评论 -
作为笨蛋的我终于弄懂了圆圈中最后剩下的数字(约瑟夫环问题)暴力求解和数学解法
先看一下题目描述:0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出:...原创 2020-03-30 17:39:15 · 830 阅读 · 0 评论 -
单词压缩编码问题(LeetCode)的笨方法以及由此产生的String类型陷阱再复习
首先,题目是这样的:给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。例如,如果这个列表是 [“time”, “me”, “bell”],我们就可以将其表示为 S = “time#bell#” 和 indexes = [0, 2, 5]。对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 “#” 结束,来恢复我们之前的单词列表。那么成功对...原创 2020-03-29 00:34:51 · 297 阅读 · 0 评论 -
关于导入外部项目到eclipse编码不匹配的问题
关于导入外部项目到eclipse编码不匹配的问题今天在导师兄的项目代码的时候,发现中文都会乱码:显然是编码的问题,鉴于这个问题很基础也经常遇到,记录一下:这几个操作的优先级是这样的,如果你改了整个工作空间的编码格式,所有的在workspace的编码肯定都会变成这个指定的,如果修改一个项目的,整个项目的会变成这样,如果修改一个文件,就仅仅是这个文件。所以一旦这三者有编码本身不一致的情况,在修改比他大...原创 2020-03-24 23:02:22 · 451 阅读 · 0 评论 -
反射和内省后续—导入第三方beanUtils包以及使用BeanUtils操作javaBean
用内省来操作Bean属性其实有些麻烦,因此后来诞生了另一组操作Bean属性的API,beanUtils框架(Apache公司开发的),在日常开发中,操作Bean属性更常用的是这个。这个API作为第三方API, Apache公司开发的BeanUtils会更常用,同时,BeanUtils还需要配合第三方日志工具来使用,一般同样要使用Apache公司的common logging。在开发中导入的方法如...原创 2019-10-11 21:29:03 · 1134 阅读 · 0 评论 -
我的Java学习笔记(22)—容器接口之List接口(以ArrayList为实现类)学习以及自己实现ArrayList类
Collection表示一组对象,它是集中、收集的意思,Collection接口的两个子接口是List和Set接口。Collection接口中定义了一系列方法,完整的可以查看api文档。而List和Set接口是Collection接口的继承接口,拥有所有的Collection的方法。一、List接口的一些常用方法(ArrayList为例)因此我们先来测试List接口的实现类ArrayList...原创 2019-09-26 18:41:02 · 299 阅读 · 0 评论 -
我的Java学习笔记(10):二维数组
二维数组:二维数组类似一个二维矩阵,通过行下标和列下标来标识数组中的某一个元素,数组的行下标和列下标都是从0开始的。1.二维数组的声明(与一维数组类似)方式一:数据类型[][] 数组名称;例 double[][] b; 方式二:数据类型 数组名称[][];例 doubleb [][];2.二维数组的创建(与一维数组类似)数组名称=new 数据类型[数组行数][数组列数];例:b=...原创 2019-09-02 21:05:41 · 331 阅读 · 0 评论 -
java的内省(introspector)
java的内省相当于反射的一个特例,他专门用来操作java的Bean对象的属性。在“容器的应用”笔记里,我们已经了解了javaBean是什么,首先我们再来学习什么是javaBean的属性:一个类,里面有自己的private字段,只能叫做字段,如果他对外提供了set或get方法,他才能叫做属性。也就是说,javaBean的属性是由set和get方法决定是不是有这个属性的,而不是由这个类里面的字段...原创 2019-10-10 23:18:19 · 176 阅读 · 0 评论 -
java的反射技术(Reflection)详解和简单测试案例
一般来说,只有在编写框架的时候才会用到反射技术,不编写框架的话,是用不到他的,但是可以帮助我们更好的学习和适用框架。一个类有多个组成部分,例如:成员变量,方法,构造方法等等,反射就是加载类,并解析出类的各个组成部分。这里面的两个部分,加载类 和 解析类:一、加载类Java中有一个Class类,看准了这个class的名字叫Class,这个Class类用于代表某一个类的字节码。这个类里就提供...原创 2019-10-10 23:16:44 · 586 阅读 · 0 评论 -
java封装的使用&访问控制符
一、封装的作用和含义:程序设计要追求高内聚、低耦合,低耦合指的就是要外部调用越简单越好,高内聚指的是类的复杂性和内部数据操作的处理细节自己完成,不允许外部干涉。封装有很多优点:* 提高代码的安全性;* 提高代码的复用性;* 高内聚:提高可维护性,便于修改内部代码;* 低耦合:简化外部调用,便于扩展和协作。自己写类的时候也尽量去追求高内聚和低耦合。如果没有封装的话会出现一些问题,比如在另...原创 2019-09-08 15:20:24 · 280 阅读 · 0 评论