动手动脑
1.以下代码为何无法通过编译?
package test; public class Test { public static void main(String[] args) { Foo obj1=new Foo(); } } class Foo { int value; public Foo(int initValue) { value=initValue; } }
在类中的构造方法有一个参数,定义对象时没有参数,所以无法通过编译
2. 请依据代码的输出结果,自行总结Java字段初始化的规律
package init; public class InitializeBlockDemo { /** * @param args */ public static void main(String[] args) { InitializeBlockClass obj=new InitializeBlockClass(); System.out.println(obj.field); obj=new InitializeBlockClass(300); System.out.println(obj.field); } } class InitializeBlockClass{ //下面这句在初始化块之前与之后,会影响到field字段的初始值 //public int field=100; { field=200; } public int field=100; public InitializeBlockClass(int value){ this.field=value; } public InitializeBlockClass(){ } }
package init; public class InitializeBlockDemo { /** * @param args */ public static void main(String[] args) { InitializeBlockClass obj=new InitializeBlockClass(); System.out.println(obj.field); obj=new InitializeBlockClass(300); System.out.println(obj.field); } } class InitializeBlockClass{ //下面这句在初始化块之前与之后,会影响到field字段的初始值 public int field=100; { field=200; } //public int field=100; public InitializeBlockClass(int value){ this.field=value; } public InitializeBlockClass(){ } }
java会在初始化块和构造方法中进行初始化,当对同一变量进行多次初始化时,会按照顺序进行初始化,并保留最后一次的结果。如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。
3.观察输出结果,总结出“静态初始化块的执行顺序”
执行顺序:
先执行父类的静态初始化块,在执行子类的静态初始化块,在执行父类的实例初始化块、构造方法,子类的实例初始化块、构造函数。先执行静态,在执行实例和构造方法。
4.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
package test; public class Test { public static void main(String[] args) { Foo.s(); } } class Foo { int value1=1; static int value2=2; public static void s() { System.out.println("value1="+new Foo().value1); System.out.println("value2="+value2); } }
静态方法在访问本类的成员时,只允许访问静态成员,当需要在静态方法中访问本类中的静态成员时,需定义一个该类的对象,然后在方法中通过对象名.静态成员的方法来访问。
5.两对整数明明完全一样,为何一个输出true,一个输出false?
public class StrangeIntegerBehavior { public static void main(String[] args) { Integer i1=100; Integer j1=100; System.out.println(i1==j1); Integer i2=129; Integer j2=129; System.out.println(i2==j2); } }
i1和j1调用了integer中的cache方法,所以i1和j1指向的是同一个对象,所以为true。i2和j2创建了新的对象,指向不同,所以结果是false
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~