【问题标题】:Is it necessary to have a constructor in every class in JavaJava中的每个类都需要一个构造函数吗
【发布时间】:2012-09-02 15:52:57
【问题描述】:
class Temp
{ 
   {
      System.out.println("this is in it block");
   }


   public static void main(String... s)
   {
      System.out.println("abhi");
   }
}

上面的代码没有打印 init 块的内容,但我们知道 init 块是构造函数的第一行。

但另一方面,如果我使用new Temp();,它会被打印出来。为什么会这样?

如果构造函数在每个类中,上面的代码也应该在没有对象初始化的情况下打印它。不应该吗?

【问题讨论】:

  • 请查看常见问题解答如何正确标记您的问题。这样可以确保您的问题引起正确的人的注意。
  • init 块是构造函数的 第二 行,在隐式或显式 super() 调用之后。

标签: java oop constructor


【解决方案1】:

您不需要在类中编写构造函数。如果您没有任何构造函数,系统会自动为您生成一个默认构造函数。您的内部块称为instance initializer;它在构造函数执行时 after 运行,在构造函数中对 super(...) 的任何调用之后以及构造函数主体(其余部分)之前运行。 (如果构造函数以调用this(...) 开始,则不会为该构造函数运行实例初始化程序。)但是,您确实需要为构造函数和要执行的任何实例初始化程序创建类的实例。 (如果您创建了内部块static,它将是一个静态初始化程序,并且在初始化类对象时只运行一次,无论是否创建了实例。)

【讨论】:

    【解决方案2】:
    { System.out.println("this is in it block");
    
    }
    

    为您创建的每个对象调用。即使您不创建对象,也会调用 static {}。 请参阅static-and-instance-initializers-in-java 或static-and-instance-initializers-in-java 了解更多详情。

    【讨论】:

      【解决方案3】:

      您的代码中没有调用构造函数的内容,因此实例 init 块也永远不会被调用。

      如果构造函数在每个类中,上面的代码也应该在没有对象初始化的情况下打印它。不应该吗?

      没有。为什么要呢?您必须调用它才能做到这一点。它不会因为它存在而运行。

      【讨论】:

        【解决方案4】:

        您好,如果您运行此代码,您将了解实例块和静态块之间的区别。

        它是第一个运行并且只运行一次的静态块,第一次调用静态方法或者第一次启动实例。就像在您的代码中调用静态方法(main)一样,您应该创建一个静态块,但它只调用一次。

        实例块,它总是在启动一个实例时运行。

        class Temp
        {
            {System.out.println("this is an instance block");}
        
            static {System.out.println("this is a static block");}
        
            public static void main(String... s){
                System.out.println("This a static method");
                Temp myTemp = new myTemp();
                myTemp.myMethod();
            }
        
            void myMethod (){
                System.out.println("This an instance method");
            }
        }
        

        另一方面,如果你不输入任何构造,Java 会为你创建一个

        Temp(){//Or whatever name of your class
            super();
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-09
          • 2015-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-30
          • 1970-01-01
          • 1970-01-01
          • 2013-08-05
          相关资源
          最近更新 更多