
深入Java基础
文章平均质量分 90
深挖基础知识,学习JVM,练习javap,阅读字节码指令
TD230
干就完了
展开
-
Java泛型详解
文章目录第一次接触泛型 完成泛型概念好处泛型与多态无关泛型类基本原理泛型方法类型参数的限定泛型的上界泛型接口泛型通配符无限定通配符 `<?>`有限定通配符 `<? extends >`超类型通配符`< ? super >`泛型擦除为什么进行泛型擦除?运行时获取泛型信息泛型擦除与静态类型第一次接触泛型 完成使用容器类时ArrayList<Integer> list = new ArrayList<>();list.add(123);Inte原创 2021-08-03 18:24:55 · 635 阅读 · 0 评论 -
Java异常详解
文章目录异常 Exception,错误 Error异常/错误处理机制异常处理原理简述ExceptionCheckedException 受检异常RuntimeException 运行时异常Error名字相似的 Exception ,Error抛出 throw 、throwsthrow 主动抛出异常浅谈 fail-fast 机制浅谈 fail - safe 机制throws 主动声明异常方法声明异常也是多态的一种体现方法声明的异常算在 Java 方法特征签名中吗?方法声明异常与代码复用接住(捕获) catch原创 2021-07-17 13:35:13 · 478 阅读 · 6 评论 -
Java反射及原理
一、反射是什么?学习反射,首先要知道"反"是什么意思,"正"又是什么。对于 Java 来说,已知类型创建对象是"正":Object o = new Object(); ,编译期间已知要创建的对象 o 的静态类型为 java.lang.Object。通过对象映射到类型信息是"反":例如 Class clazz = Class.forName("xxx");,编译期间无法得知要创建的对象的静态类型。只能在运行期间根据给出的类的全限定名加载类型。Java 为了让我们能够使用反射在运行期间检查类型信息,将类原创 2021-07-12 20:58:14 · 571 阅读 · 18 评论 -
深入了解JVM中的对象
1.对象的创建方式及是否调用构造方法new 无参/有参构造clone 不调用构造方法,由 JVM 创建新的对象并赋值字段。反序列化 调用第一个没有实现序列化接口的父类的无参构造,如果没有,则调用 Object 类的无参构造Class.newInstance 无参构造,实际上是调用 5 的无参构造Constructor.newInstance(…args) 无参/有参构造2.对象的创建流程public class Test { private int anInt = 1; p原创 2021-07-08 16:45:27 · 311 阅读 · 9 评论 -
java基础-深、浅克隆
1.Cloneable 接口空的接口,用于标记,让 JVM 知道这个类具有浅克隆功能。如果不实现此接口,在调用 clone() 方法时会抛出 CloneNotSupportException。1.1浅克隆只是将对象的内容拷贝一份给新对象。对象的内容分为1.基本类型数据 2.引用类型数据拷贝基本类型数据就是拷贝值而已,很简单。拷贝引用类型数据也只是拷贝对象引用而已。单纯的拷贝导致克隆后的两个对象中的引用类型数据指向堆中同一个地址。浅克隆public class CloneTest { p原创 2021-07-07 17:48:14 · 143 阅读 · 1 评论 -
借助HSDB工具解析JVM中的对象及this&super关键字
this 关键字this 关键字是什么? this 指代的是被调用的实例方法的所有者,称为方法接收者(Receiver),以下代码中对于 test() 方法来说,person 就是接收者。public class ThisTest { static class Person{ private int anInt; private static int anStaticInt; public Person(){原创 2021-06-25 16:30:37 · 388 阅读 · 9 评论 -
Java方法调用(静态解析,方法分派)
1.两个概念先给出两个概念 1.静态类型 2.实际类型,下面这行代码中 Father 是静态类型,编译期间已知。Son 是实际类型,编译期间不能确定,在运行期代码执行到这里时才能知晓。Father guy = new Son();为什么说不可知晓呢?例如下面的代码,只有运行到 Random 才能知晓方法返回对象的实际类型。public static void main(String[] args) { Father guy = new Random().nextBoolean()原创 2021-06-20 22:13:18 · 840 阅读 · 4 评论 -
Java中字段不参与多态
字段不参与多态学习到这里的时候很好玩,记录一下。直接来个例子,如果你能答对,也就不用看这这篇文章了。public class FieldHasNoPolymorphic { static class Father{ public int money = 1; public Father(){ System.out.println("father`s constructor is invoked by:" + this);原创 2021-06-20 22:06:19 · 384 阅读 · 7 评论 -
javap—跟在new指令屁股后面的dup指令
每当我查看反编译结果时,经常会看到 dup 字节码指令跟在 new 字节码指令之后,又不知道它是干嘛的,很影响阅读,所以就有了这篇博客~JVM 中的字节码指令操作是基于操作数栈的,栈操作一个数据只能通过先出栈计算,再将结果压栈的方式。操作数栈主要用于保存执行过程的中间结果:配合局部变量表,将中间结果保存在变量槽中;需要使用局部变量时,读取局部变量表对应变量槽中的元素压入栈顶再出栈。以下代码创建了 CreateObjectTest 对象,并使用局部变量 createObjectTest 保存实例的引用。原创 2021-06-13 21:56:51 · 634 阅读 · 2 评论 -
配合JVM+javap解析Java中参数的传递方式与方法返回值方式
1. 参数的传递方式首先给出答案:Java 中只有值传递,没有引用传递值传递和引用传递都是一种求值策略,它们的区别并不在于传递的是什么东西,而在于传递方式。1.1 值传递是什么不论传递的是什么,值传递会拷贝一份将要被传递的变量,然后将拷贝传递给方法。例子1:public static void anInt(int i){ i = 6;}int i = 1;System.out.println(i);//1anInt(i);System.out.println(i);/原创 2021-06-04 18:48:12 · 407 阅读 · 9 评论 -
清晰理解java的instanceof关键字
通过重写 Object 的 equals 方法开始本文 ( instanceof 详解跳转)由于 Object 类中 equals 方法实际上就是 == ,所以大部分类都按需重写了 equals 方法。public class EqualsFather { private int father; @Override public boolean equals(Object o) { if (this == o) return true; if.原创 2021-06-03 11:24:45 · 507 阅读 · 3 评论 -
深入理解java静态、非静态内部类
1.内部类的存在意义是什么?如果有两个类A、B,关系紧密,且 B 类的设计初衷只是为了帮助 A 类的实现。那么类 B 可以作为类 A 的成员,也就是内部类。2.有几种类型我们知道,类的成员分为两种,静态成员和实例成员(非静态成员)。那么内部类也就自然分为两种,静态内部类,成员内部类。静态内部类是为了帮助外部类静态部分的实现,成员内部类是为了帮助外部类实例部分的实现。我们还知道,静态成员与类关联,实例成员依赖于对象。静态成员由类调用,实例成员由对象调用。那么同样静态内部类与外部类关联,成员内部原创 2021-05-30 15:44:14 · 704 阅读 · 4 评论 -
深入经典面试题:new String(“123“) 创建了几个String对象
经典面试题 String str = new String(“hello world”);创建了几个对象。学习 java 准备面试,不能光背面试题的答案,更要深入面试题,了解面试题背后的java基础。那么让我们来看一下 String str = new String("hello world");这段代码到底涉及到了多少 java 基础。我知道的创建 String 对象的方式共有五种。new String(char[ ])通过 char 数组创建 String 对象new Strin.原创 2021-05-18 21:53:32 · 519 阅读 · 0 评论 -
jvm+反编译深入了解final,static关键字的作用
1.final 可以修饰什么类变量方法2.static 可以修饰什么内部类成员变量代码块方法3.final 的作用保证数据的一致性。3.1 类被 final 修饰的类被称为最终的类 / 不可变类。例如 String 类,设计者认为 String 已经完美了,不想因为 String 被随意继承、重写方法而导致的错误。光使用 final 修饰一个类还达不到不可变类的标准,还要保证:1. 成员变量私有化,并被 final 修饰。2.不向外提供修改成员变量的方法 3.当类中含有可变原创 2021-05-27 18:39:25 · 474 阅读 · 0 评论 -
深入浅出Java基础——字符串拼接
字符串拼接(jdk8)public static void main(String[] args) { String str1 = "string"; 代码1. String str2 = str1 + "merge"; 代码2. String str3 = "string" + "merge1"; }字符串拼接可以说是我们日常中的基本操作中的基本操作,就是两个 String 对象相加一下就完事了。可你有没有想过,两个对象怎么能相加呢,对象存储的不是内存原创 2021-05-20 21:16:23 · 297 阅读 · 0 评论 -
深入浅出Java基础——字符串常量池
String Table(jdk8)1.字符串常量池是什么字符串常量池用于存储编译期间存在的所有字符串实例的引用,以及运行时动态添加的引用。字符串常量池是全局的,只有一个。当我们以 String str = "123"形式创建字符串实例时,首先会去判断字符串常量池中是否有引用指向相同内容的实例,如果有则返回该实例。否则在堆中创建 String 对象并将引用驻留在字符串常量池中。2.为什么要有字符串常量池的存在想象现在有这样一个场景:一个内容为 username 的字符串需要经常使用,没有字符串常量池原创 2021-05-13 15:00:14 · 1648 阅读 · 9 评论 -
java基础——String的不可变性
String & Immutable1.概念String 类被 final 修饰,类似的被 final 修饰的类还有 Integer、Double等等包装类。我们小学二年级时候都学过,被 final 修饰的类是不可被继承的,在 Java 中,被 final 修饰的类被称为 “不可变类”。好奇的同学可能会问了,1.这些类为什么需要被 final 修饰呢?2.为什么不能改变呢,不可变有什么好处?我们以 String 为例,进行探讨。2.不可变 (immutable)如果你阅读了 String 方原创 2021-05-07 08:09:33 · 706 阅读 · 6 评论 -
深入浅出Java包装类
1.包装类1.1 基本数据类型对应的包装类都有哪些基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble1.2自动装箱 AutoBoxing,自动拆箱 AutoUnboxing1.2.1 什么是装箱、拆箱 我们以 Integer 为例。 首先,什么是装箱、拆箱。又何来自动一说?让原创 2021-04-23 09:31:25 · 930 阅读 · 6 评论 -
Java基础——基本数据类型
1.基本数据类型类型位字节特点byte81char162short162int324java 中整数的默认类型long648需要在数字末尾加上 Lfloat324需要在数字末尾加上 F / fdouble648java 中浮点数的默认类型boolean没有给出精确的定义没有给出精确的定义1.1基本数据类型的级别整型数中 byte < short < int < .原创 2021-04-22 08:00:11 · 430 阅读 · 2 评论