首页 文章 精选 留言 我的

精选列表

搜索[Java表达式],共10000篇文章
优秀的个人博客,低调大师

Java父子类加载顺序

加载顺序 先上桌结论: 父类静态属性(成员变量) > 父类静态代码块 > 子类静态属性 > 子类静态代码块 > 父类非静态属性 > 父类非静态代码块 > 父类构造器 > 子类非静态属性 > 子类非静态代码块 > 子类构造器 这么长怎么记呀?! 这里帮大家小结几个特点: 静态属性和代码块,当且仅当该类在程序中第一次被 new 或者第一次被类加载器调用时才会触发(不考虑永久代的回收)。也正是因为上述原因,类优先于对象 加载/new,即 静态优先于非静态。 属性(成员变量)优先于构造方法,可以这么理解,加载这整个类,需要先知道类具有哪些属性,并且这些属性初始化完毕之后,这个类的对象才算是完整的。另外,非静态代码块其实就是对象 new 的准备工作之一,算是一个不接受任何外来参数的构造方法。因此,属性 > 非静态代码块 > 构造方法。 有趣的是,静态部分(前4个)是父类 > 子类,而 非静态部分(后6个)也是父类 > 子类。 另外容易忽略的是,非静态代码块在每次 new 对象时都会运行,可以理解:非静态代码块是正式构造方法前的准备工作(非静态代码块 > 构造方法)。 测试代码如下: /** * @author Lean.Li * @date 2018/10/15 */ public class Main { static class A { static Hi hi = new Hi("A"); Hi hi2 = new Hi("A2"); static { System.out.println("A static"); } { System.out.println("AAA"); } public A() { System.out.println("A init"); } } static class B extends A { static Hi hi = new Hi("B"); Hi hi2 = new Hi("B2"); static { System.out.println("B static"); } { System.out.println("BBB"); } public B() { System.out.println("B init"); } } static class Hi { public Hi(String str) { System.out.println("Hi " + str); } } public static void main(String[] args) { System.out.println("初次 new B:"); B b = new B(); System.out.println(); System.out.println("第二次 new B:"); b = new B(); } } 运行结果如下: 初次 new B: Hi A A static Hi B B static Hi A2 AAA A init Hi B2 BBB B init 第二次 new B: Hi A2 AAA A init Hi B2 BBB B init

优秀的个人博客,低调大师

java 面试题分析

题: 定义两个 Integer 对象传递给一个方法, 方法执行后两个 Integer 的值需要互相转换 public static void practise(MyConsumer<Integer> consumer) { Integer value1 = 1; Integer value2 = 2; System.out.println("start: value1=" + value1 + ", value2=" + value2); consumer.accept(value1, value2); System.out.println("end: value1=" + value1 + ", value2=" + value2); } @FunctionalInterface public interface MyConsumer<T> { void accept (T value1, T value2); } 编程方式一: 传值与传引用的区别 practise((value1, value2) -> { Integer temp = value1; value1 = value2; value2 = temp; return; }); 输入结果: start: value1=1, value2=2 end: value1=1, value2=2 编程方式二: Integer 在 -127 ~ 128 之间的缓存 practise((value1, value2) -> { try { Field declaredField = Integer.class.getDeclaredField("value"); declaredField.setAccessible(true); Integer intValue = value1.intValue(); declaredField.set(value1, value2); declaredField.set(value2, intValue); } catch (Exception e) {} return; }); 输出结果: start: value1=1, value2=2 end: value1=2, value2=2 编程方式三: 清空缓存 practise((value1, value2) -> { try { Field declaredField = Integer.class.getDeclaredField("value"); declaredField.setAccessible(true); Integer intValue = new Integer(value1.intValue()); declaredField.set(value1, value2); declaredField.set(value2, intValue); } catch (Exception e) {} return; }); 输出结果: start: value1=1, value2=2 end: value1=2, value2=1

优秀的个人博客,低调大师

Java获取用户IP

/** * 获取访问者IP * * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。 * * 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割), * 如果还不存在则调用Request .getRemoteAddr()。 * * @param request * @return */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Real-IP"); if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { return ip; } ip = request.getHeader("X-Forwarded-For"); if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { // 多次反向代理后会有多个IP值,第一个为真实IP。 int index = ip.indexOf(','); if (index != -1) { return ip.substring(0, index); } else { return ip; } } else { return request.getRemoteAddr(); } }

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册