2023.09.19课上问题的实践
今天主要对昨天java课上的动手动脑的问题进行了实践,
public class ScoreInformation { public static void main(String[] args) { Foo obj1 = new foo(); } } class Foo{ int value; public foo(int initValue) { value= initValue; } }
这个代码由于类提供了一个自定义的构造方法,系统不再提供默认的构造方法。
如果没有自定义构造方法,系统会提供一个默认的构造方法
package ScoreInformation; public class InitializeBlockClass { { field = 200; } public int field = 100; public InitializeBlockClass(int value) { this.field = value; } public InitializeBlockClass() { } } import java.util.Objects; import java.util.Scanner; public class ScoreInformation { public static void main(String[] args) { InitializeBlockClass obj = new InitializeBlockClass(); System.out.println(obj.field); obj = new InitializeBlockClass(300); System.out.println(obj.field); } }
InitializeBlockClass obj = new InitializeBlockClass();调用的是不带参数的构造函数。
obj = new InitializeBlockClass(300);调用的是带int类型的构造函数。
请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
class Root { static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参数的构造器"); } } class Mid extends Root { static{ System.out.println("Mid的静态初始化块"); } { System.out.println("Mid的普通初始化块"); } public Mid() { System.out.println("Mid的无参数的构造器"); } public Mid(String msg) { //通过this调用同一类中重载的构造器 this(); System.out.println("Mid的带参数构造器,其参数值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的静态初始化块"); } { System.out.println("Leaf的普通初始化块"); } public Leaf() { //通过super调用父类中有一个字符串参数的构造器 super("Java初始化顺序演示"); System.out.println("执行Leaf的构造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }
静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。
import java.util.Objects; import java.util.Scanner; public class ScoreInformation { public static void main(String[] args) { Integer j1 =100; Integer j2 =100; System.out.println(j1==j2); Integer j3 =129; Integer j4 =129; System.out.println(j3==j4); } }
两对整数明明完全一样,为何一个输出true,一个输出false?
-
Integer j1 = 100;
和Integer j2 = 100;
创建了两个Integer对象,分别包含值100。由于这个值在默认范围内(-128到127),Java会使用一个内部的整数缓存来存储这些值,以提高性能。因此,j1
和j2
实际上指向相同的内部对象,所以j1 == j2
返回true
。 -
Integer j3 = 129;
和Integer j4 = 129;
也创建了两个Integer对象,分别包含值129。然而,这个值超出了默认范围,因此Java不会使用内部缓存,而是会创建两个独立的对象来存储这两个值。所以,j3 == j4
返回false
,因为它们实际上指向不同的对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)