05 2022 档案
摘要:对象照镜子后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个结构(class/interface/enum/annotation/primitive type/void/)的有关信息
阅读全文
摘要:Java反射: Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 Class C=Class.forName("java.lang.String") 加载完类之后,在堆内
阅读全文
摘要:动态语言 是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构 主要动态语言:Object-C、C#、JavaScript、PHP、Python等 静态语言 与动态语言相对应的,运行
阅读全文
摘要:Annotation是从JDK5.0开始引入的新技术 Annotation的作用: 不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别) 可以被其他程序(比如:编译器等)读取 Annotation的格式: 注解是以"@注释名"在代码中存在的﹐还可以添加一些参数值,例如:@S
阅读全文
摘要:背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。 好处: 提高响应速度(减少了创建新线程的时间) 降低资源消耗(重复利用线程池中线程
阅读全文
摘要:线程通信: 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库﹐消费者将仓库中产品取走消费 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止 如果仓库中放有产品,则消费者可以将产品取走消费﹐否则停止消费并等待,直到
阅读全文
摘要:从JDK5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当 java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开
阅读全文
摘要:死锁: 多个线程各自占有一些共享资源﹐并且互相等待其他线程占有的资源才能运行﹐而导致两个或者多个线程都在等待对方释放资源﹐都停止执行的情形﹒某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题. 产生死锁的四个必要条件: 互斥条件:一个资源每次只能被一个进程使用。 请求与保持条件:
阅读全文
摘要:同步方法: 由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是synchronized关键字,它包括两种用法:synchronized方法和synchronized块. 同步方法:public synchronized void met
阅读全文
摘要:1. 不安全买票 public class UnSafeBuyTicket { public static void main(String[] args) { BuyTicket buyTicket = new BuyTicket(); new Thread(buyTicket,"张三").sta
阅读全文
摘要:并发:同一个对象被多个线程同时操作 现实生活中,我们会遇到"同一个资源,多个人都想使用”的问题,比如,食堂排队打饭,每个人都想吃饭,最天然的解决办法就是:排队,一个个来。 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象.这时候我们就需要线程同步,线程同步其实就是一种等待机制,
阅读全文
摘要:线程分为用户线程和守护线程 虚拟机必须确保用户线程执行完毕,如main()线程 虚拟机不用等待守护线程执行完毕,如后台记录操作日志,监控内存,垃圾回收:gc()等。 public class ThreadDaemon { public static void main(String[] args)
阅读全文
摘要:Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。 线程的优先级用数字表示,范围从1~10. Thread.MIN_PRIORITY = 1; Thread.MAX_PRIORITY = 10; Thread.NORM_PRIORIT
阅读全文
摘要:线程可以处于以下状态之一: NEW 尚未启动的线程处于此状态。 RUNNABLE 在Java虚拟机中执行的线程处于此状态。 BLOCKED 被阻塞等待监视器锁定的线程处于此状态。 WAITING 正在等待另一个线程执行特定动作的线程处于此状态。 TIMED_WAITING 正在等待另一个线程执行动作
阅读全文
摘要:Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞 可以了解成插队 public class ThreadJoin implements Runnable{ @Override public void run() { try { Thread.sleep(100); } catch
阅读全文
摘要:礼让线程,让当前正在执行的线程暂停,但不阻塞 将线程从运行状态转为就绪状态 让cpu重新调度,礼让不一定成功!看CPU心情 代码: public class ThreadYield implements Runnable{ public static void main(String[] args)
阅读全文
摘要:sleep(时间)指定当前线程阻塞的毫秒数; sleep存在异常InterruptedException; sleep时间达到后线程进入就绪状态; sleep可以模拟网络延时,倒计时等。 每一个对象都有一个锁,sleep不会释放锁; 倒计时Demo: public class ThreadSleep
阅读全文
摘要:建议线程正常停止:利用次数,不建议死循环。 建议使用标志位:设置一个标志位 不要使用stop或者destroy等过时或者JDK不建议使用的方法 public class ThreadStop implements Runnable{ private boolean flag = true; publ
阅读全文
摘要:流程: 详细: 方法 说明 setPriority(int newPriority) 更改线程的优先级 static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠线程 void join() 等待该线程终止 static void yield() 暂停当前
阅读全文
摘要:1. Lambda(λ)表达式: λ希腊字母表中排序第十一位的字母,英语名称为Lambda 避免匿名内部类定义过多 其实质属于函数式编程的概念 2. 为什么要使用Lambda表达式? 避免匿名内部类定义过多 可以让你的代码看起来很简洁 去掉了一堆没有意义的代码,只留下核心的逻辑。 3. 也许你会说,
阅读全文
摘要:对比: new WeddingCompany(new You()).HappyMarry(); new Thread(()->{System.out.println("我爱你");}).start(); 静态代理总结: 真实对象和代理对象需要实现同一个接口 代理对象需要代理真是角色 静态代理好处:
阅读全文
摘要:步骤: 实现Callable接口,需要返回值类型 重写call方法,需要抛出异常 创建目标对象 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1); 提交执行:Future<Boolean> result1 = ser.submi
阅读全文
摘要:案例: 首先来个赛道距离,然后要离终点越来越近 判断比赛是否结束 打印出胜利者 龟兔赛跑开始 故事中是乌龟赢的,兔子需要睡觉,所以我们来模拟兔子睡觉 终于,乌龟赢得比赛 代码: public class Race implements Runnable{ final int nums=100; pr
阅读全文
摘要:模拟买票的场景:张三、李四和王五一起买票。 代码: public class TicketThread implements Runnable{ private int ticket =3; public static void main(String[] args) { TicketThread
阅读全文
摘要:继承Thread类: 子类继承Thread类具备多线程能力启动线程:子类对象. start() 不建议使用:避免OOP单继承局限性 实现Runnable接口: 实现接口Runnable具有多线程能力 启动线程:传入目标对象+Thread对象.start() 推荐使用:避免单继承局限性,灵活方便,方便
阅读全文
摘要:步骤: 定义MyRunnable类实现Runnable接口 实现run()方法,编写线程执行体 创建线程对象(将MyRunnable实例作为线程对象创建时的参数),调用start()方法启动线程 代码: public class MyRunnable implements Runnable{ @Ov
阅读全文
摘要:步骤: 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用start()方法启动线程 //方式一:继承Thread类 public class Demo01 extends Thread{ //主线程 public static void main(String[
阅读全文
摘要:Process和Thread 说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 而进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是
阅读全文
摘要:处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理 在多重catch块后面,可以加一个catch (Exception)来处理可能会被遗漏的异常 对于不确定的代码,也可以加上try-catch,处理潜在的异常 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印
阅读全文
摘要:使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。 在程序中使用自定义异常类,大体可分为以下几个步骤: 创建自定义异常类。 在方法中通过throw关键字抛出异常对象。 如果在当前抛出异常的方法中处理异常,
阅读全文
摘要:抛出异常 public class Demo02 { public static void main(String[] args) { Demo02 demo02 = new Demo02(); try { demo02.division(1,0); } catch (ArithmeticExcep
阅读全文
摘要:在Exception分支中有一个重要的子类RuntimeException(运行时异常) ArraylndexOutOfBoundsException(数组下标越界) NullPointerException(空指针异常) ArithmeticException(算术异常) MissingResou
阅读全文
摘要:Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。 Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止;
阅读全文
摘要:Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。
阅读全文
摘要:要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: 检查性异常:最具代表的检苣性浮吊定用一阳庆一P此导堂在编译时不能被简单地忽略。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时
阅读全文
摘要:实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了。等等。 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们
阅读全文
摘要:1.标准内部类:直接在大类中定义,内部类的方法可以获取外部类的私有属性。 2. 静态内部类:直接在大类中定义,并在class之前加上static关键字 3. 成员内部类:在方法中定义 3. 匿名内部类:new对象,不把示例保存到变量中 public class Outer { private int
阅读全文
摘要:普通类:只有具体实现 抽象类:具体实现和规范(抽象方法)都有! 接口:只有规范! 接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。声明类的关键字是class,声明接口的关键字是interface public interface Demo06 { void add(); void de
阅读全文
摘要:abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。 抽象方法,只有方法的声明,没有方法的实现,它是
阅读全文
摘要:public class Demo03 { // 1. 最先执行,只会执行一次 static { System.out.println("静态代码块"); } // 2. 其次执行,每次new都会执行 { System.out.println("匿名代码块"); } // 3. 最后执行,每次new
阅读全文
摘要:public class Demo02 { public static void main(String[] args) { //Object>Person>Student //Object>Person>Teacher //Object>String Object object = new Stu
阅读全文
摘要:即同一方法可以根据发送对象的不同而采用多种不同的行为方式。 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多 多态存在的条件 有继承关系 子类重写父类方法 父类引用指向子类对象 注意:多态是方法的多态,属性没有多态性。 instanceof
阅读全文
摘要:为什么需要重写: 父类的功能,子类不一定需要,或者不一定满足 重写: 需要有继承关系,子类重写父类的方法 方法名必须相同 参数列表列表必须相同 修饰符:范围可以扩大但不能缩小: public>Protected>Default>private 抛出的异常:范围可以被缩小,但不能扩大;classNot
阅读全文
摘要:super:1. super调用父类的构造方法,必须在构造方法的第一个 2. super 必须只能出现在子类的方法或者构造方法中 3. super和 this 不能同时调用构造方法 this:1. 代表的对象不同: this:本身调用者这个对象 super:代表父类对象的应用 2. 前提 this:
阅读全文
摘要:继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。 extands的意思是“扩展”。子类是父类的扩展。 JAVA中类只有单继承,没有多继承! 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。 继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承
阅读全文
摘要:该露的露,该藏的藏 我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。 封装(数据的隐藏) 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。 记住这句话就够了:属性私有,get/se
阅读全文
摘要:内存分析图 宠物类 public class Pet { String name; int age; void speak(String words){ System.out.println(words); } static void sayHi(){ System.out.println("Hi"
阅读全文
摘要:使用new关键字创建对象 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下俩个特点: 必须和类的名字相同 必须没有返回类型,也不能写void 构造器必须要掌握
阅读全文
摘要:类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物 动物、植物、手机、电脑..... Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为 对象是抽象概念的具体实例 张三就是人的一个具体实例,张三家里的旺财就是狗的一个
阅读全文
摘要:面向对象编程(Object-Oriented Programming, OOP) 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。 抽象 三大特性: 封装 继承 多态 从认识论角度考虑是先有对象后有类。对象,是具体的事物。类是抽象的,是对对象的抽象 从代码运行角度考虑是先有类后
阅读全文
摘要:面向过程思想 步骤清晰简单,第一步做什么,第二步做什么.... 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。 面向对象适合处理复杂的问题,适合处理需要多人协作
阅读全文
摘要:需求:编写五子棋游戏中,有存盘退出和续上盘的功能。 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。 解决:稀疏数组 public class Demo04 { //稀疏数组 public static void main(String[] args) { System.o
阅读全文
摘要:public class Demo03 { public static void main(String[] args) { int[] nums = {5,2,86,12,45,756,12,3,1,9,32,7856}; System.out.println(Arrays.toString(nu
阅读全文
摘要:其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。 其元素必须是相同类型,不允许出现混合类型。 数组中的元素可以是任何数据类型,包括基本类型和引用类型。 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。 数组本身就是对象,Java中对象是在堆中的,因此数组无
阅读全文
摘要:1. 静态初始化 2. 动态初始化(包含默认初始化) 3. 默认初始化 public class Demo02 { public static void main(String[] args) { //1. 静态初始化 int[] nums1 = {1,2,3,4,5}; System.out.pr
阅读全文
摘要:首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法: dataType[ ] arrayRefVar;//首选的方法 或 dataType arrayRefVar[]; //效果相同,但不是首选方法 Java语言使用new操作符来创建数组,语法如下: dataType[ ] arr
阅读全文
摘要:A方法调用B方法,我们很容易理解! 递归就是:A方法调用A方法!就是自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能
阅读全文
摘要:JDK 1.5开始,Java支持传递同类型的可变参数给一个方法。 在方法声明中,在指定参数类型后加一个省略号(.….)。 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。 public class Demo02 { public static void m
阅读全文
摘要:有时候希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。 public class Demo01 { public static void main(String[] args) { for (int i = 0; i < args.length; i++) { Sys
阅读全文
摘要:重载就是在一个类中,有相同的函数名称,但形参不同的函数。 方法的重载的规则: 方法名称必须相同。 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。 方法的返回类型可以相同也可以不相同。 仅仅返回类型不同不足以成为方法的重载。 实现理论: 方法名称相同时,编译器会根据调用方法的参数个数、
阅读全文
摘要:Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法: 方法包含一个方法头和一个方法体。下面是一个方法的所有部分: 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。 返回值类型︰方法可能会返回值。returnValu
阅读全文
摘要:package com.zx.scanner; /** 打印n层三角形 **/ public class Demo05 { public static void main(String[] args) { //层数 int n = 5; for (int i = 1; i <= n; i++) {
阅读全文
摘要:1. break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用) 2. continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定
阅读全文
摘要:package com.zx.scanner; /** 九九乘法表 */ public class Demo04 { public static void main(String[] args) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <
阅读全文
摘要:输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果: package com.zx.scanner; import java.util.Scanner; public class Demo3 { public static void main(Stri
阅读全文
摘要:scanner对象next():1、一定要读取到有效字符后才可以结束输入。2、对输入有效字符之前遇到的空白,next()方法会自动将其去掉。3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。4、next()不能得到带有空格的字符串。 package com.zx.scanner; im
阅读全文
摘要:Java语言支持如下运算符: 1. 算术运算符: +,-,*,l, %,++,--2. 赋值运算符=3. 关系运算符:>,<,>=,<=,==,!=, instanceof4. 逻辑运算符:&&,Ⅱ,!5. 位运算符: &,|,^,~,>>,<<, >>>(了解! ! ! )。 &:全为1才为1,有
阅读全文
摘要:1. 所有变量、方法、类名:见名知意 2. 类成员变量:首字母小写和驼峰原则: monthSalary局部变量:首字母小写和驼峰原则 3. 常量:大写字母和下划线:MAX_VALUE 4. 类名:首字母大写和驼峰原则: Man, GoodMan方法名:首字母小写和驼峰原则: run(), runRu
阅读全文
摘要:常量(Constant):初始化(initialize)后不能再改变值!不会变动的值。所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。 final 常量名=值; final double PI=3.14; 常量名一般使用大写字符。
阅读全文
摘要:类变量:从属于类,需要加上static关键字,可以直接使用。 实例变量:从属于对象,不需要加static关键字,需要声明对象后使用。注:不需要初始化,如果不初始化,则为默认值,基本类型除了boolean,默认值是0,boolean默认值为false,其他类型都是null。 局部变量:从属于方法,必须
阅读全文
摘要:# 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ## 字体 *斜体* **加粗** ***斜体并加粗*** ~~划去~~ ## 引用 > 这是一句引用的句子 ## 分割线 *** ## 图片  ## 超链接 [链接](https://w
阅读全文