在 Java 中,静态方法是与类关联的方法,可以直接通过类名调用,而不需要创建类的实例对象。而非静态方法是与实例对象关联的方法,需要通过实例对象来调用。...【情况一】:在静态方法中引用了一个非静态方法 报错: Non-static method 'xxx()' cannot be referenced from a static context 形如:...void staticMethod() { // 在静态方法中引用非静态方法,会导致错误 nonStaticMethod(); // 错误:Non-static method...'nonStaticMethod()' cannot be referenced from a static context } } 解决这个问题的方法是,要么将非静态方法改为静态方法,或者在静态方法内部创建实例对象后调用非静态方法...【情况二】:在静态方法中引用了一个实例变量 报错: Non-static variable 'instanceVariable' cannot be referenced from a static
在 Java 中,不允许从静态方法中访问非静态变量的原因主要与静态方法和非静态变量的生命周期和作用域有关。具体来说:生命周期不同:静态方法:静态方法属于类,而不是类的实例。...作用域不同:静态方法:静态方法可以不依赖于任何对象实例而直接调用,因此它们没有上下文来访问特定对象的实例变量。非静态变量:非静态变量必须通过对象实例来访问,因为它们是对象的一部分。...编译器限制:由于静态方法没有对象实例的上下文,编译器无法确定应该访问哪个对象的实例变量。因此,编译器会报错,禁止从静态方法中访问非静态变量。...示例代码下面是一个简单的示例,展示了为什么从静态方法中访问非静态变量会导致编译错误:public class Example { // 非静态变量 int instanceVar; /.../ 静态方法 public static void staticMethod() { // 编译错误:不能从静态上下文中引用非静态变量 // System.out.println
:: 来表示,方法引用是一种函数式接口的另一种书写方式 静态方法引用,通过类名::静态方法名, 如 Integer::parseInt 实例方法引用,通过实例对象::实例方法,如 str::substring...System.out.println("toInt : " + str); return 1; } } 用::提取的函数,最主要的区别在于静态与非静态方法...,非静态方法比静态方法多一个参数,就是被调用的实例。...// 使用双冒号::来构造非静态函数引用 String content = "Hello JDK8"; // public String substring...2.stream处理集合的效率并不一定比迭代器高,如果不要求顺序可以使用parallelStream进行并行流的处理。 字符串 在Java 1.8中,我们可以使用Stream来实现。
{} : 要实现的方法体。只有一行代码时,可以不加括号,可以不写return。...creat(Test::staticMethod);//引用Test类下的static_me方法 //非静态引用 creat(new Test()::notStatic...Stream 2.1 Stream介绍 java8 中的stream 与InputStream和OutputStream是完全不同的概念, stream 是用于对集合迭代器的增强,使之完成 能够完成更高效的聚合操作...findAny().get(); o.setMemberName(member.getName()); }); 2.2 流的三种操作 2.2.1 生成流 处理容器 处理数组 2.2.2 中间操作 非静态...生成流操作 generate 基于迭代生成流,与iterate 不同的是不 后一元素的生成,不依懒前一元素 生成流操作 concat 合并两个相同类型的类 生成流操作 示例 @Test public
5、内置类型有默认值,引用对象的默认值是null; 6、非静态实例变量、非静态方法是通过对象实例进行调用的,不能直接从静态方法中调用;比如java源文件中main方法中不可以直接调用非静态方法; 7、静态变量...因为 e 是 Employee 的引用,所以调用 e 的 mailCheck() 方法时,编译器会去 Employee 类查找 mailCheck() 方法 。...抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。 34、继承: java继承中对构造函数是不继承的,只是调用(隐式或显式)。...原因:Java抽象类中不能有静态的抽象方法,可以有静态的成员方法。...复杂方式存储对象是值键值映射的时候; java集合框架就是提供一些接口和类,位于java.util包中; Iterator(操作集合的迭代器)、Map、Collection是接口;虚线空心箭头是子接口继承父接口
能根据上下文自动推断出来:一个Thread的构造函数接受一个Runnable参数,而传入的λ表达式正好符合其run()函数,所以Java编译器推断它为Runnable。...Java8之前集合类的迭代(Iteration)都是外部的,即客户代码。而内部迭代意味着改由Java类库来进行迭代,而不是客户代码。...2.定义 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。... toUpperConsumer = DoubleColon::toUpper; toUpperConsumer.accept(new DoubleColon()); 非静态方法的函数引用定义和使用就有点让人很困惑了...参数差=1: 说明非静态方法少一个参数,这是就不能保证接口参数和实现方法参一一对应了,这很明显有问题。这时候我们通过【类::方法名】来定义(这种定义方式也是jdk的规定,记住就好)。
为什么内部类持有外部类会导致内存泄露 非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方在使用了)。...解决方案 不要让其他的地方持有这个非静态内部类的引用,直接在这个非静态内部类执行业务。 将非静态内部类改为静态内部类。...内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用。...为什么要持有外部类 Java 语言中,非静态内部类的主要作用有两个: 当内部类只在外部类中使用时,匿名内部类可以让外部不知道它的存在,从而减少了代码的维护工作。...不会内存泄露的方案 简介 内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到 static 类型的引用
for-each 循环允许你无需保持传统 for 循环中的索引就可以遍历数组,或在使用迭代器时无需在 while 循环中调用 hasNext 方法和 next 方法就可以遍历集合。...run() { // 线程处理代码 } }).start(); 精简: new Thread(() -> { // 线程处理代码 }).start(); 1.7.利用方法引用...方法引用(::),可以简化 lambda 表达式,省略变量声明和函数调用。...) .collect(Collectors.toList()); 1.8.利用静态导入 静态导入(import static),当程序中大量使用同一静态常量和函数时,可以简化静态常量和函数的引用...注意:静态引入容易造成代码阅读困难,所以在实际项目中应该警慎使用。 1.9.利用 unchecked 异常 Java 的异常分为两类:Checked 异常和 Unchecked 异常。
userVOList.add(userVO); } 1.7.不可变的静态常量,尽量使用非线程安全类 不可变的静态常量,虽然需要支持多线程访问,也可以使用非线程安全类。...如果指定了一个类为final,则该类所有的方法都是final的,Java编译器会寻找机会内联所有的final方法。...三、方法 ---- 3.1.把跟类成员变量无关的方法声明成静态方法 静态方法的好处就是不用生成类的实例就可以直接调用。静态方法不再属于某个对象,而是属于它所在的类。...final修饰符 方法指定final修饰符,可以让方法不可以被重写,Java编译器会寻找机会内联所有的final方法。....; if (userMap.isEmpty()) { ... } 7.6.非随机访问的List,尽量使用迭代代替随机访问 对于列表,可分为随机访问和非随机访问两类,可以用是否实现
并发源码 来源:knife.blog.csdn.net 简介 为什么要持有外部类 实例:持有外部类 实例:不持有外部类 实例:内存泄露 不会内存泄露的方案 ---- 简介 「说明」 本文介绍 Java...非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方在使用了)。...「解决方案」 不要让其他的地方持有这个非静态内部类的引用,直接在这个非静态内部类执行业务。 将非静态内部类改为静态内部类。...内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用。...不会内存泄露的方案 「简介」 内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到 static 类型的引用
静态内部类: 使用 static 修饰的内部类,不持有外部类的引用,可以通过 OuterClass.InnerClass 直接访问。 局部内部类: 定义在方法内部的内部类,作用范围仅限于所在方法。...静态内部类使用 static 修饰,不持有外部类的引用,可以通过 OuterClass.InnerClass 直接访问,具有以下特点: 不能直接访问外部类的非静态成员,但可以访问外部类的静态成员。...这种关系使得内部类更适合用于实现某些特定的设计模式,如迭代器或观察者模式。 普通类的独立性: 普通类相对独立,不直接依赖于外部类的实例。它们通过接口或继承进行关联,但没有内部类那种直接的引用关系。...静态特性 静态内部类独立于外部类实例: 静态内部类不持有对外部类实例的引用,因此可以在没有外部类实例的情况下实例化。...静态内部类: 使用 static 修饰的内部类,不持有外部类的引用,可以通过 OuterClass.InnerClass 直接访问。 局部内部类: 定义在方法内部的内部类,作用范围仅限于所在方法。
既要二进制向前兼容,又要迭代出新的特性,Java需要进行舍夺,默认方法就是一个例子,必须舍去接口只能定义抽象方法这个延续了多年在Java开发者中根深蒂固的概念,夺取了基于默认方法实现构筑出来的流式编程体系...嵌套类主要分为两种:静态嵌套类和非静态嵌套类,而非静态嵌套类又称为内部类(Inner Classes)。...为了确定Lambda表达式的目标类型,Java编译器会基于对应的Lambda表达式,使用上下文或者场景进行综合推导,判断的一个因素就是上下文中对该Lambda表达式所期待的类型。...方法引用的类型归结如下: 类型 例子 静态方法引用 ClassName::methodName 指定对象实例方法引用 instanceRef::methodName 特定类型任意对象方法引用 ContainingType...::methodName 超类方法引用 supper::methodName 构造器方法引用 ClassName::new 数组构造器方法引用 TypeName[]::new 可见其基本形式是:方法容器
Java Web 实践用静态 ThreadLocal 管理用户信息与请求上下文在多线程的 Java 应用中,尤其是 Web 服务或者微服务中,如何在请求的整个生命周期内方便、安全地传递用户信息、请求上下文等数据...不希望将用户信息通过方法参数逐层传递,避免“参数地狱”。保证多线程并发时,每个请求的数据是隔离的,互不干扰。为了解决这个问题,可以使用 ThreadLocal。...六、总结通过静态 ThreadLocal 封装全局上下文对象,可以在多线程环境下实现数据隔离与便捷访问。结合 set/get/clear 方法,可以有效管理请求生命周期内的数据。...在实际项目中,这种模式极大地简化了跨方法、跨层传递上下文信息的工作,提高了代码可维护性和安全性,是企业级 Java 应用常用的最佳实践之一。...Q6:使用静态 ThreadLocal 有什么优势?A6:线程安全,每个线程数据互不干扰。简化方法参数传递。可以扩展存储多种请求上下文信息,如 traceId、租户信息、权限信息。
Thymeleaf 百叶香 Thymeleaf是一个流行的模板引擎,该模板采用Java语言开发,Java生态下的模板引擎有Thymeleaf、Freemaker、Velocity、Beetl(国产...Thymeleaf对网络环境要求不存在严格的要求,既能用于web环境下,也能用于非web环境下,在非web环境下 ,它能直接显示模板上的静态数据,在web环境下,它能想jsp一样从后台接受数据,并替换模板上的静态数据...index(从0开始计算) count: 当前迭代对象的index(从1开始计算) size:被迭代对象的大小 current:当前迭代变量...= (eq ne) 3、内置对象 功能表达式对象 内置功能对象前都需要加#号,一般以s结尾 #dates java.util.Date对象的实用方法 #calendars 和dates类似,是 java.util.Calendar对象 #numbers 格式化数字对象的方法
流(stream)就如同迭代器(iterator),但附加了许多额外的功能。在Lambda表达式中this是指外围实例,而匿名类中的this是指匿名类实例。...8 中使用双冒号操作符(double colon operator) 此现象较静态引用。...方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。Java 8 对方法引用的支持只是编译器层面的支持,虚拟机执行引擎并不了解方法引用。...编译器遇到方法引用的时候,会像上面那样自动推断出程序员的意图,将方法引用还原成接口实现对象,或者更形象地说,就是把方法引用设法包装成一个接口实现对象,这样虚拟机就可以无差别地执行字节码文件而不需要管什么是方法引用了...这种方法引用的方式较之前两种稍微有一些不好理解,因为无论是通过类名调用静态方法还是通过对象调用实例方法这都是符合Java的语法,使用起来也比较清晰明了。
对比EL表达式: OGNL对象图导航语言,比EL表达式强大很多倍的语言 EL表达式只能从域中获取数据 OGNL可以调用对象的方法,获取struts的值栈的数据。...访问OGNL上下文 操作集合对象 可以直接new一个对象 OGNL入门 OGNL使用要素三个: 表达式 根区 非根区(context对象) OGNL核心OgnlContext本质是一个map java...使用对象方法和静态方法 ? 在页面中使用ognl 导入标签库 ? 调用静态方法默认不行,需要开启 ? ? ? 值栈 什么是值栈? ValueStack实际上就是一个容器。...框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。...通过ActionContext获取值栈对象 ActionContext对象之所以能够访问servlet的API(域对象的数据)就是因为内部有值栈的引用,与action相关的存在根区请求完毕后清空,而其他域的数据存在非根区
泛型是 Java 中的一种语法机制,允许在定义类、接口或方法时使用类型参数(如 ),从而实现类型的“参数化”。目标:编写通用且类型安全的代码。...泛型的关键特性特性说明 类型擦除(Type Erasure)编译后泛型信息被擦除,运行时无 List 和 List 区别,都是 List 只能使用引用类型基本类型不能作为泛型参数...(T[]) new Object[10]; // ⚠️ 警告,但可用(需确保类型安全)静态上下文中不能使用类级别的类型参数java深色版本public class MyClass { static...静态成员不能引用 }泛型异常类不允许java深色版本public class MyException extends Exception { } // ❌ 不允许桥接方法与类型擦除的影响泛型可能导致编译器生成...✅ 总结升华泛型 = 类型参数化 + 编译期检查 + 代码复用泛型是 Java 集合框架的基石,也是现代 Java 编程不可或缺的一部分。
实现方式:方法重载(编译器绑定,前绑定)和方法重写(运行期绑定,后绑定) 18、静态类和非静态类 (1)静态类 静态类中的字段与方法都必须是static的,静态类不需要实例化就可以使用; (2)非静态类...非静态类中可以有static的字段与方法,也可以由非static的字段与方法,访问static的字段与方法不需要实例化,但是访问非static的字段与方法时需要实例化。...19、for和foreach循环效率: for可以不逐个遍历,如每隔一个遍历;也可以从前向后遍历,从后向前遍历;有条件判断,使用已知次数的循环遍历; foreach只能逐个遍历;只能从前向后遍历;没有执行条件限制...2.不能在静态方法中使用this关键字; 3.静态的只能访问静态的(因为静态的代码块在构造方法之前就已经开始初始化,而此时非静态的还未开始初始化,如果静态能访问非静态的就会出现发生错误),非静态的可以访问一切...、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数 53、Java变量类型 (1)变量类型 静态变量、成员变量
String formatDate(Date date) { return formatter.get().format(date); } } 使用 withIntial() 静态方法...比如,定义一个计数器,每个线程需要有一个属于自己的计数器,保证线程安全。...提供了更简单的方法,也就是 ThreadLocal 工具类,使用 ThreadLocal 类可以直接给每个线程提供单独的计数器 public class ThreadLocal_Counter {...弱引用的意思是:如果在发生垃圾回收时,若这个对象只被弱引用指向,那么就会被回收。...通过 ThreadLocal 保存上下文信息,在任意地方调用getCurrentContext()方法就可以获取当前线程的RequestContext,然后再从 RequestContext 获取 Request
线程通过某个类载入器(能够自己定义)载入一个类。 该类分配了大块内存(比方new byte[1000000]),在某个静态变量存储一个强引用,然后在ThreadLocal中存储它自身的引用。...在非常多JVM的实现中Java类和类载入器直接分配到permgen区域不运行GC,这样导致了更严重的内存泄露。...A4:除了被遗忘的监听器,静态引用,hashmap中key错误/被改动或者线程堵塞不能结束生命周期等典型内存泄露场景,以下介绍一些不太明显的Java发生内存泄露的情况,主要是线程相关的。...,以及全部被类载入器载入的类和全部静态引用等等。...(在Java7中已经修正了,创建线程的代码合理地移除了上下文类载入器。)