![](https://img-blog.csdnimg.cn/20210119132901812.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
java学习笔记
ixcoret
这个作者很懒,什么都没留下…
展开
-
工厂设计模式-Java实现(简单工厂模式、工厂方法模式、抽象工厂模式)
目录工厂模式介绍简单工厂模式模式的结构与实现模式的结构模式的实现优缺点应用场景简单工厂模式在JDK中的应用工厂方法模式模式的结构与实现模式的结构模式的实现优缺点应用场景工厂方法模式在JDK中的应用抽象工厂模式模式的定义与特点模式的结构与实现模式的结构模式的实现模式的应用场景模式的扩展工厂模式介绍凡是需要创建复杂对象的地方,都可以尝试考虑使用工厂模式来代替。注意:上述复杂对象指的是类的构造函数参数过多等对类的构造有影响的情况,因为类的构造过于复杂,如果直接在其他业务类内使用,则两者的耦合过重,后续业务原创 2020-10-10 19:10:39 · 278 阅读 · 0 评论 -
Java8新特性之流式编程Stream API
目录1. 流式思想概述2. 获取stream流的方式3. 常用方法:forEach : 逐一处理count:统计流中的元素个数filter:过滤limit:取出前n个元素skip:跳过前n个元素sorted:排序map:映射distinct:去除重复数据reduce:归约concat:组合collect:收集Stream流中的结果到指定结构Stream流中的结果收集到集合中Stream流中的结果收集到数组中1. 流式思想概述Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是原创 2020-09-08 23:58:51 · 369 阅读 · 0 评论 -
Java8新特性之双冒号::语法:方法引用与构造器引用
目录1 方法引用1.1 对象—引用实例方法1.1.1 普通使用情况:1.1.2 super或this引用实例方法1.2 类—引用静态方法1.3 类—引用实例方法2. 构造器引用2.1 类—引用构造器2.2 数组—引用构造器1 方法引用lambda表达式是用来简化函数式接口的匿名内部类的一种函数式编程的语法。当Lambda体的实现是通过调用一个现有的方法来完成功能的,并且该方法满足一些特殊条件时,则可以通过双冒号::来引用该方法替代Lambda表达式。 双冒号::称为方法引用操作符,而它所在的表达式被称原创 2020-09-07 23:39:34 · 971 阅读 · 0 评论 -
Java8新特性之函数式接口-Supplier、Consumer、Predicate、Function详解
目录1. 概述@FunctionalInterface注解2. 供给型接口典型代表—Supplier接口3. 消费型接口典型代表—Consumer接口4. 判断型接口典型代表—Predicate接口5. 功能型接口典型代表—Function接口1. 概述函数式接口在Java中是指:有且仅有一个抽象方法的接口。Lambda表达式是用来实现SAM接口的,所谓SAM就是Single Abstract Method,即该接口中只有一个抽象方法需要实现,当然该接口可以包含其他非抽象方法。从应用层面来讲,Ja原创 2020-09-06 00:23:14 · 2259 阅读 · 2 评论 -
Java8新特性之Lambda表达式
目录1. Lambda表达式引入2. Lambda表达式的格式标准格式:省略格式:3. Lambda表达式的前提条件4. Lambda表达式的本质5. Lambda表达式和匿名内部类的区别1. Lambda表达式引入当需要启动一个线程去完成任务时,通常会通过 java.lang.Runnable 接口来定义任务内容,并使用 java.lang.Thread 类来启动该线程。传统写法,代码如下:public class ThreadDemo { public static void main(Str原创 2020-09-05 13:03:29 · 184 阅读 · 0 评论 -
Java泛型通配符和泛型的上限、下限
目录1. 通配符基本使用2. 受限泛型1. 通配符基本使用假设有这样的需求:定义一个方法,可以遍历任意数据类型的ArrayList集合。从前面已经知道,ArrayList 集合和 ArrayList、ArrayList 集合等不存在继承关系,所有方法的形参不能使用ArrayList,那么该如何实现呢?方式一:不使用泛型:public class WildcardTest { public static void main(String[] args) { ArrayLis原创 2020-09-04 17:50:10 · 687 阅读 · 0 评论 -
Java泛型与继承
目录泛型与继承instanceof后面不支持泛型类泛型与继承通过泛型使得一个类型的功能增强了,好像扩展出好多子类一样。例如:ArrayList,通过指定泛型,可以延伸出ArrayList只能处理字符串类型的集合,ArrayList只能处理Ingeter类型的集合。但是,实际上,系统并没有为ArrayList等生成新的class文件,而且也不会把ArrayList当成新的类型处理。看下面的代码的打印结果是什么?ArrayList list1 = new ArrayList();ArrayList&l原创 2020-09-04 13:13:24 · 258 阅读 · 0 评论 -
Java反射获取类的加载器、修饰符、属性、构造器、方法、注解等信息
1. 反射概念JVM会为每一个加载到内存的class文件创建一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了类的完整的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构。将java类的各个组成部分封装为对象,可以在程序运行过程中操作这些对象,这就是java的反射机制。反射具体能干那些事:1、在运行时能够获取任意类型的详细信息2、在运行时能够创建任意引用数据类型的对象3、在运行时读取某个注解信息3、在运行时读取某个类的泛型实参5原创 2020-09-02 10:33:22 · 820 阅读 · 0 评论 -
Java注解(Annotation)、元注解、自定义注解
目录1. 注解概述2. 注解的使用3. 元注解(meta-annotation)@Target@Retention@Documented@Inherited4. 自定义注解定义格式注解的配置参数5. 注解解析与注解解析相关的接口获取注解数据的原理使用反射获取注解的数据代码实现6. 模拟Junit1. 注解概述注解(Annotation)是 JDK5.0增加的功能,该机制允许在Java代码中添加特殊标记,并允许通过反射(reflection),以编程方式访问这些特殊标记。通过使用注解,开发人员可以在不改变原创 2020-08-28 21:56:24 · 185 阅读 · 0 评论 -
idea生成javadoc时编码报错“错误: 编码GBK的不可映射字符”的解决办法
使用idea生成开发文档,报错(错误: 编码GBK的不可映射字符)并出现乱码问题解决:菜单 Tools -> Generate JavaDoc,弹出的配置面板,在Other command line arguments 栏指定编码,输入:-encoding utf-8 -charset utf-8...原创 2020-08-27 09:24:26 · 2595 阅读 · 0 评论 -
Java比较器:Comparator接口与Comparable接口的compare(compareTo)方法返回值的正负与升序、降序的关系
目录原创 2020-08-25 23:36:47 · 1788 阅读 · 1 评论 -
Java枚举(enum)详解
目录1. 枚举概述2. 枚举类型的定义2.1 自定义枚举类2.2 使用enum定义枚举3. 枚举的隐含直接父类:Enum类3.1 Enum类的主要方法4. 枚举实现接口1. 枚举概述枚举:列举,一个一个地列出来。Java枚举:把某个类型的对象,全部列出来。什么情况下会用到枚举类型?某些类的对象只有确定的有限个时,可以把这样的类声明为枚举。例如:星期:Monday(星期一)…Sunday(星期天)性别:Male(男)、Female(女)月份:January(1月)…December(1原创 2020-08-23 19:14:35 · 968 阅读 · 0 评论 -
Java类加载器ClassLoader的双亲委派模型
类加载器我们编写的.java文件被编译器编译成.class的字节码文件,类加载器ClassLoader负责将这些字节码文件加载到内存中去执行。JVM提供了三种类加载器:引导类加载器Bootstrap:最顶层类加载器,负责加载JDK核心类库,C++语言实现扩展类加载器ExtClassLoader:负责加载JDK扩展类库,Java语言实现应用类加载器AppClassLoader:负责加载我们自己定义的类和第三方jar包中的类,Java语言实现AppClassLoader的父加载器是ExtClassL原创 2020-08-21 15:33:57 · 120 阅读 · 0 评论 -
Java类的加载时机与类的初始化
目录1. 类的加载时机2. 类的初始化会发生类的初始化的情况:不会发生类的初始化的情况:1. 类的加载时机以下5个情况,只要有1个出现,那么类的加载器就会将这个类的class文件加载到内存中:创建类的实例。使用类的静态变量或静态方法。使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。初始化某个类的子类。直接使用java.exe命令来运行某个主类。2. 类的初始化类的初始化主要就是对静态的类变量进行初始化:(1)执行类构造器()方法的过程。类构造器()方法是由原创 2020-08-19 10:45:16 · 314 阅读 · 0 评论 -
Java多态详解及对象的向上转型、向下转型
目录1. 概述定义前提条件2. 多态的体现3. 多态的好处4. 引用类型转换向上转型向下转型为什么要转型转型的异常instanceof 关键字5. 多态的弊端6. 接口多态案例案例需求代码实现1. 概述生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。定义多态: 是指对同一方法的调用,由于编译时类型和运行时类型不一致可能会有不同的行为前提条件继原创 2020-08-18 17:01:20 · 420 阅读 · 0 评论 -
Java接口详解,含接口新特性及抽象类与接口的区别
目录1. 概述2. 定义格式常量抽象方法默认方法和静态方法私有方法3. 基本的实现实现的概述抽象方法的使用默认方法的使用静态方法的使用私有方法的使用4. 接口的多实现抽象方法默认方法静态方法方法重名时的优先级问题5. 接口的多继承6. 接口的其他特点7. 抽象类和接口的区别1. 概述接口,是Java语言中一种引用数据类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法(JDK原创 2020-08-18 14:00:37 · 127 阅读 · 0 评论 -
Java抽象类、抽象方法详解
目录1. 概述2. 抽象方法3. 抽象类4. abstract关键字5. 抽象类简单案例5.1案例介绍5.2 案例分析5.3 示例代码1. 概述类用于描述现实生活中一类事物。类中有属性、方法等成员。父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有 意义,而方法主体则没有存在的意义了。某种情况下,父类只能知道子类应该具备一个怎样的方法,但是不能够明确知道如何实现该方法。只能在子类中才能确定如何去实现方法体。例如:所有几何图形都应该具备一个计算面积的方原创 2020-08-18 11:26:37 · 776 阅读 · 0 评论 -
Java成员内部类、静态内部类、局部内部类、匿名内部类详解
目录成员内部类定义成员内部类特点如何使用成员内部类静态内部类定义静态内部类的特点如何使用静态内部类局部内部类定义局部内部类的特点如何使用局部内部类匿名内部类定义前提格式:匿名内部类的特点如何使用匿名内部类成员内部类定义成员内部类 :定义在外部类中方法外的类定义格式:[public] class 外部类名 [extends 外部类的父类] [implements 外部类的父接口们] { [修饰符] class 内部类名 [extends 非静态内部类自己的父类] [implements原创 2020-08-17 10:47:19 · 407 阅读 · 1 评论 -
Java中“==”运算符和equals(Object obj)方法的区别
目录== 运算符equals(Object obj) 方法== 运算符== 既可以用于基本数据类型的比较,也可以用于引用数据类型的比较(1)如果比较的是基本数据类型变量:比较两个变量的值是否相等,相等即为true注意:当基本数据类型进行比较时,符号两边的数据必须类型兼容(类型相同或可自动类型转换),否则编译出错。测试代码:public class EqualsTest { public static void main(String[] args) { //基本数据类型原创 2020-08-14 18:50:12 · 234 阅读 · 0 评论 -
静态代码块和类初始化、实例初始化过程
目录1. 静态代码块2. 类初始化3. 子类初始化4. 类初始化和实例初始化结合5. 子类初始化和子类实例初始化结合非静态代码块和实例初始化过程1. 静态代码块静态代码块:定义在类中方法外,使用static修饰①可以为类变量(静态变量)初始化②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次③若有多个静态代码块,那么按照定义的先后顺序依次执行④在静态代码块中不能访问非静态成员(属性、方法、内部类)⑤在静态代码块中不能使用this和super关键字⑥静态代码块的执行优先原创 2020-08-13 21:45:22 · 938 阅读 · 0 评论 -
非静态代码块和实例初始化过程
1. 非静态码块1.1 声明格式修饰符 class 类名 { ... { //非静态代码块的内容 ... } ...}1.2 非静态代码块中的代码什么时候执行①在每次创建对象的时候执行②比构造器早测试代码:class MyClass { private String str; public MyClass() { System.out.println("无参构造"); }原创 2020-08-13 10:40:02 · 269 阅读 · 0 评论 -
Java方法重载和方法重写的区别
方法重载:在同一个类中,允许存在多个同名方法,只要它们的参数个数或者参数类型不同,与修饰符和返回值类型无关,这样的多个同名方法之间构成重载。根据实际传入的参数决定调用哪个方法。方法重写:当父类中的方法对于子类来说不适用的时,子类可以对从父类中继承来的方法进行重写/覆写。根据对象所属的类决定调用调用哪个类的方法。总结:重载(Overload)与重写(Override)的区别重载重写定义位置同一个类中父类(接口)、子类(实现类)方法名必须相同必须相同形参列表必须原创 2020-08-11 23:52:48 · 145 阅读 · 0 评论 -
继承后访问成员的特点
目录继承后的特点——成员变量super和this父类空间优先于子类对象产生super和this的含义super和this的用法继承后的特点——成员方法成员方法不重名时成员方法重名——重写(Override)重写的应用方法重写注意事项继承后的特点——构造方法继承后的特点——成员变量对象访问成员变量时,会先在子类中查找有没有定义对应的变量,若子类中存在就会就近使用子类中的变量,若子类中没有定义就会沿着继承关系往上找有没有定义相应的变量,若父类中也没有则编译不通过。代码示例:class Fu { /原创 2020-08-11 15:42:07 · 178 阅读 · 0 评论 -
Java成员变量和局部变量的区别
定义位置不同:成员变量:类中方法外分为类变量(static修饰)、实例变量(没有使用static修饰)局部变量:方法形参、方法内部的变量、语句块内变量(for循环初始化语句及其循环体属于同一个作用域)默认值不同:成员变量:有默认初始化值局部变量:没有默认初始化值,必须显式赋值,方可使用作用范围不同:成员变量:静态变量(类变量),在本类中随便用,在其他类中使用“类名.静态变量"非静态变量(实例变量),在本类中只能在非静态成员中使用,在其他类中使用“对象..原创 2020-08-11 10:37:25 · 188 阅读 · 0 评论 -
Java中对象和对象引用的区别,引用、指向是什么意思
Java的变量分为两大类:基本数据类型和引用数据类型。其中基本类型变量有四类8种:byte short int long float double char boolean,除了8种基本数据类型变量,其他变量都是引用数据类型,如类、接口、数组等。基本数据类型,只有一块存储空间, 在栈中,存放的是具体数据值。引用数据类型,有两块存储空间一个在栈(Stack)中,一个在堆(heap)中。堆中存放对象本身(使用new关键字,即表示在堆中开辟一块新的存储空间),栈中存放对象在堆中所在位置的首地址。引用类型变量原创 2020-08-11 09:20:53 · 2655 阅读 · 0 评论 -
Collection集合迭代器iterator遍历集合元素的过程及源码分析
迭代器是遍历Collection集合的通用方式,任意Collection集合都可以使用迭代器进行遍历,那么每一种集合的自身特性是不同的,也就是存储元素的方式不同,那么是如何做到遍历方式的统一呢,接下来我们分析一下迭代器的源代码。Collection接口中有一个抽象方法 Iterator<E> iterator(),返回对集合中元素进行迭代(遍历)的迭代器。java.util.Iterator接口public interface Iterator<E> { boolean原创 2020-07-24 13:53:21 · 532 阅读 · 0 评论 -
Java异常处理的两种方式
目录1 方式1:try…catch...finally捕获异常1.1 try…catch代码块1.2 finally 代码块2 方式2:throws声明抛出异常2.1 throw关键字2.3 throws关键字异常处理方式一:在当前方法中直接用try…catch处理异常处理方式二:在当前方法中不处理,throws 异常抛给调用者处理1 方式1:try…catch…finally捕获异常1.1 try…catch代码块try-catch的方式就是捕获异常。**try:**该代码块中编写可能原创 2020-07-23 16:03:25 · 3975 阅读 · 0 评论 -
Java集合泛型之泛型方法
目录定义格式:泛型方法使用非静态泛型方法静态泛型方法泛型可变个数形参为了让方法可以操作不同类型的数据,而且类型不确定,可以将泛型定义在方法上。定义格式:权限修饰符 <类型形参> 返回值类型 方法名(参数){...}只有在修饰符和返回值类型之间用 <类型形参> 声明的方法才是泛型方法,使用泛型类或泛型接口的泛型的方法不一定是泛型方法。在方法返回值类型前面声明的类型形参,只能在当前方法中使用,用于表示形参的类型、返回值类型或方法局部变量的类型,与泛型方法所属的类或接口无关,与原创 2020-07-19 13:06:39 · 345 阅读 · 0 评论 -
Java集合之泛型类和泛型接口
为什么要有泛型不使用泛型的问题当不使用泛型时,集合中是可以存放任意类型对象的,只要把对象存储集合后,那么他们都会被提升为Object类型。当我们在取出每一个对象,并且进行相应的操作,需要进行类型转换。观察下面代码:public static void main(String[] args) { Collection coll = new ArrayList(); coll.add("abc"); coll.add("def"); coll.add(5);//由于集合没原创 2020-07-19 12:24:52 · 373 阅读 · 0 评论 -
一篇文章理解Java的匿名内部类语法
什么是匿名内部类?将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,类B则称为外部类。匿名内部类 是内部类的简化写法。它的本质是一个带具体实现的 父类或者父接口的 匿名的 子类对象如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略该类的定义,而改为使用 匿名内部类。特征:声明匿名内部类的同时创建该类的对象前提存在一个类或者接口,这里的类可以是抽象类也可以是普通类。语法格式:继承父类:new 父类名称([实参列表]){ // 类的成员列表}原创 2020-07-08 17:37:56 · 296 阅读 · 0 评论 -
Java多线程之创建线程有几种方式
创建线程的四种方式及区别1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口4. 线程池方式1. 继承Thread类一般步骤:定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。创建Thread子类的实例,即创建了线程对象子类对象调用start()方法:启动线程,然后调用run()方法代码示例/** * 定义子类并重写run方法 */public class My原创 2020-07-04 20:34:18 · 207 阅读 · 0 评论