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?

  1. Integer j1 = 100;Integer j2 = 100; 创建了两个Integer对象,分别包含值100。由于这个值在默认范围内(-128到127),Java会使用一个内部的整数缓存来存储这些值,以提高性能。因此,j1j2 实际上指向相同的内部对象,所以 j1 == j2 返回 true

  2. Integer j3 = 129;Integer j4 = 129; 也创建了两个Integer对象,分别包含值129。然而,这个值超出了默认范围,因此Java不会使用内部缓存,而是会创建两个独立的对象来存储这两个值。所以,j3 == j4 返回 false,因为它们实际上指向不同的对象。





 

 

posted @   new菜鸟  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示