1.
早期经常这样定义变量 int value=100; 前面的示例中这样定义变量 MyClass obj = new MyClass(); 这两种方式定义的变量是一样的吗?
不,这两种方式定义的变量并不相同。
在第一个例子中,int value = 100; 是在Java中定义一个名为value的整数类型变量,并将其初始化为100。这是基本数据类型的变量定义方式,用于存储简单的数值。
而在第二个例子中,MyClass obj = new MyClass(); 是在Java中定义一个名为obj的对象变量,并使用new关键字创建了MyClass类的一个新实例,并将其赋值给obj变量。这种方式适用于引用数据类型,用于存储对象实例的引用。
因此,这两种方式定义的变量类型和用途不同。基本数据类型的变量存储的是简单的数值,而对象变量则存储的是对象的引用,可以通过该引用访问对象的属性和方法。
2.
对象变量也可以使用“==”判断两变量值是否相等吗?
对象变量可以使用"=="来判断两个变量是否引用了同一个对象(即对象的内存地址是否相同),而不是判断对象的值是否相等。在Java中,"=="用于比较对象引用的地址。
3.
false
4.
-
自定义的
equals
方法:这个类定义了一个自己的equals
方法,而不是使用继承自Object
类的默认equals
方法。这是因为默认的equals
方法只比较对象引用地址,而不比较对象的内容。通过自定义equals
方法,你可以实现你自己的逻辑来比较对象的内容。 -
比较对象的
Value
属性:在equals
方法中,它比较了对象的Value
属性是否相等,而不是比较整个对象。这表示该类的equals
方法只关心Value
属性是否相等,而不关心其他可能存在于类中的属性。 -
参数类型:
equals
方法接受一个名为obj
的参数,这个参数类型是MyTestClass
。这是因为equals
方法通常用来比较两个相同类的对象,所以它接受一个同类对象作为参数。 -
返回类型:
equals
方法返回一个布尔值,指示两个对象是否相等。如果Value
属性相等,它返回true
,否则返回false
。 -
使用了成员变量:该方法比较了对象的成员变量,这意味着在比较对象时,它关注的是对象内部状态的一部分(即
Value
属性)。这种方式可以使你更灵活地定义两个对象何时被认为是相等的 -
提供的代码无法通过编译,因为在
Test
类的main
方法中尝试创建Foo
对象时,没有提供所需的构造函数参数。Foo
类定义了一个接受整数参数的构造函数,但在main
方法中没有提供这个参数。 -
public static void main(String[] args) { InitializeBlockClass obj = new InitializeBlockClass(); System.out.println(obj.field); // 输出结果: 4 obj = new InitializeBlockClass(300); System.out.println(obj.field); // 输出结果: 300 }
根据输出结果可以总结以下规律:
-
字段初始化块:在类定义中,类包含一个字段初始化块,其中使用来为字段赋值。这个字段初始化块在创建对象时会被执行。
InitializeBlockClass
field = 4
field
-
无参构造函数:当使用无参构造函数创建对象时,首先执行字段初始化块来给字段赋值为4。然后输出的值为4。
InitializeBlockClass
field
obj.field
-
有参构造函数:当使用有参构造函数创建对象时,会跳过字段初始化块,并通过构造函数参数来初始化字段。在这种情况下,使用参数值来为字段赋值。然后输出的值为构造函数参数所提供的值。
InitializeBlockClass
field
field
obj.field
综上所述,Java字段的初始化规律是:
- 字段初始化块在对象创建时会被执行,可以在其中为字段进行初始化。
- 当对象创建时,如果使用了构造函数,则构造函数参数可以用来初始化字段,而字段初始化块会被跳过。
- 如果没有提供显式的初始化值,在没有字段初始化块或构造函数参数的情况下,Java会为字段提供默认值(例如,整数类型的字段默认值为0,布尔类型的字段默认值为false,引用类型的字段默认值为null等)。
- 在初始化代码块、构造函数参数和默认值中,以最后的赋值为准。
9.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序
-
”初始化块的执行顺序是按照类加载的顺序依次执行的,而实例初始化块和构造函数则是在对象创建时按照继承层次依次执行的
-
10.
静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)? 请编写代码验证你的想法。(发表到博客)
-
在静态方法中,不能直接访问类的实例成员(非静态字段或方法),因为静态方法在对象创建之前就可以被调用,而实例成员需要在对象创建之后才能访问。
然而,可以通过传递对象的引用作为参数,从而在静态方法中访问类的实例成员。以下是一个示例代码:
javapublic class MyClass { // 实例成员 private int myField; // 静态方法 public static void staticMethod(MyClass obj) { int value = obj.myField; // 使用对象引用访问实例成员 System.out.println(value); } public static void main(String[] args) { MyClass obj = new MyClass(); obj.myField = 10; staticMethod(obj); // 通过传递对象的引用来访问实例成员 } }
-
11.
Integer类的装箱和拆箱到底是怎样实现的?
在这个示例中,通过调用
Integer.valueOf(200)
创建了一个Integer
类型的对象。然后,通过将obj
赋值给result
,自动进行了拆箱操作。编译器提取了obj
对象中的基本类型值,将其赋给result
变量。 -
12.
上述神奇代码(StrangeIntegerBehavior.java)输出诡异的结果,原因何在?
首先检查输入的整数是否在缓存范围内(即
-128
到127
),如果是的话,它会返回缓存中的对象,否则它会创建一个新的Integer
对象
-