14

我的问题是我们不能在java的main之外写一个输出语句吗?如果我将它括在 { } 大括号中,则不会出现错误,但如果我直接编写它,则会出现错误。为什么这样?

public class abc 
{ 
   int a=3; 
   int b=0; 
   System.out.println("this statement gives error"); //Error!! 
   {System.out.println("this works fine");} 
   public static void main(String args[]) {

   System.out.println("main"); 
      abc t=new abc();
   }
} 

我尝试在main中编写它,它有效。为什么没有方法就不行?

4

4 回答 4

9

当您将它括在大括号中时,您就是将它放在一个初始化程序块中,该程序块在类被实例化时运行。除了变量声明/初始化之外,任何语句都不能发生在 Java 中的方法或初始化块之外。

于 2013-09-13T21:24:38.847 回答
5

AClass只能有属性或方法。

类是创建单个对象的蓝图

    int a=3;   // attributes
    int b=0;   // attributes
    System.out.println("this statement gives error"); //Error!! 

    {System.out.println("this works fine");}  // init block whenever an object is created.
                                              // since it is inside { }
于 2013-09-13T21:31:02.943 回答
4

{...}被称为实例初始化器。每次创建实例对象时,它都会在构造函数之外运行。

static{...}是另一种称为静态初始化器的块,它是在您在 { } 之前添加静态关键字时。此静态初始化程序仅在首次加载类时运行。

所以你可以在这两个块和类成员函数中编写代码。

除此之外,唯一剩下的地方是类数据成员声明和初始化。

于 2013-09-13T21:35:11.590 回答
1

基础/基础

JavaClass只包含成员函数和类变量,以及一些其他异常,如实例 initliazer、静态块等。

您不能只是将可执行文件(如System.out.println())撒在您希望在Class.


实例初始化器

{...}在 Java 中instance initializer,每当创建 an 时都会调用它object。因为它是instance initializer,它实际上之前被调用过constructor

你可以System.out.println()在里面写{...} instance initializer


静态块

static{...}在 Java中调用static block,其中包含的代码行仅classJVM.

同样,你可以System.out.println()在里面写{...} static block.


下面的简单可执行示例

public class JavaExample {
    public JavaExample (String name){
        System.out.println("Inside constructor" + name);
    }
    {
        System.out.println("Inside instance initializer");
    }

    static{
        System.out.println("Inside static block");
    }
    //System.out.println("Will give error"); //ERROR

    public static void main(String[] args) {
        JavaExample obj1 = new JavaExample ("obj1");
        JavaExample obj2 = new JavaExample ("obj2");
        System.out.println("Inside the public static void main");
    }
}

输出

> Inside static block 
> Inside instance initializer 
> Inside constructor: obj1 
> Inside instance initializer 
> Inside constructor: obj2 
> Inside the public static void main

请注意执行顺序。

  1. 静态块(当 JVM 加载 Class 时被调用一次,因此首先)
  2. 实例初始化器(在调用任何对象实例化之前)
  3. 构造函数(在对象创建/初始化期间)
于 2022-02-18T11:00:16.010 回答