java 中的默认构造函数如何被调用?

how default constructor in java gets called?

public class Hello {

  int i;
  char ch;
   Hello(int x){
    i=x;

   }
    Hello(char c){
     ch=c;
     }  

   public static void main(String[] args) {
  Hello h=new Hello(1);
   System.out.printf("value of i  is %d"+"value of ch is %c",h.i,h.ch);
   //Hello h=new Hello('T');
   //System.out.printf("value of i  is %d"+"value of ch is %c",h.i,h.ch);
    }

O/p 是:value of i is 1value of ch is

我的问题是为什么ch值没有初始化?? 而如果另一种情况 O/p 是:value of i is 0 value of ch is T 为什么在这种情况下我被初始化了??

Java 默认将 int 初始化为 0,将 char 初始化为空字符。因此,System.out.println 会让 ch 看起来好像没有输出,但它在技术上已经被初始化。在第一种情况下,第二个构造函数不是 运行 因为 Hello 是通过传入一个 int 参数创建的,它调用第一个构造函数,因此 ch 没有设置任何值。注释代码的行为方式相同,但由于 i 默认初始化为 0,因此 System.out.println 显示 value of i is 0 value of ch is T

在Java中,int原始类型的默认值为0,而char默认为'\u0000',即空字符。这就是为什么您无法从 int 构造函数中获得任何可识别的 ch 值的原因。

您的 class 有两个构造函数,一个接受 int,另一个接受 char。无论您使用哪个来初始化 class 的实例,另一个变量都将使用它的默认值。

  • 类型 int 默认为 0
  • 类型 char 默认为 \u0000,即 null 字符,如 here 所述。

因此,当您调用:

Hello h=new Hello(1);

您的结果有效:

h.i = 1;
h.ch = '\u0000';

通话时:

Hello h=new Hello('T');

有效地导致:

h.i = 0;
h.ch = 'T';

根据 this,int 的默认值为 0,char 的默认值为 '\u0000'(它只是 null),这就是您所看到的。