我的问题是我们不能在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();
}
}
我尝试在主要中编写它,它可以工作。为什么没有方法就不起作用?
当您将其括在大括号中时,您将它放在初始值设定项块中,该块在实例化类时运行。除了变量声明/初始化之外,任何语句都不能在 Java 中的方法或初始化块之外发生。
Class
只能具有属性或方法。
类是从中创建单个对象的蓝图。
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 { }
{...}
称为实例初始值设定项。每次创建实例对象时,它都会在构造函数之外运行。
static{...}
是另一种称为静态初始值设定项的块,当您在 { } 之前添加静态关键字时。此静态初始值设定项仅在首次加载类时运行。
因此,您可以在这两个块和类成员函数中编写代码。
除此之外,剩下的唯一地方是用于类数据成员声明和初始化。
基础知识/基础知识
Java Class
只包含成员函数和类变量,以及很少有其他异常,如实例初始化器、静态块等。
您不能只是将可执行文件(如System.out.println()
)洒在您希望Class
中的任何位置。
Instance initliazer
Java 中的{...}
是instance initializer
每当创建object
时都会调用它。因为它是instance initializer
,所以它实际上在constructor
之前被调用。
您可以在{...}
或instance initializer
中写入System.out.println()
。
静态块
static{...}
在 Java 中称为 static block
,它包含的代码行,当class
由 JVM
加载时,这些代码行仅被调用一次。
同样,您可以在{...}
或static block
中写入System.out.println()
。
下面的简单可执行示例
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
请注意执行顺序。
- 静态块(当JVM加载类时被调用一次,因此首先) 实例
- 初始值设定项(在调用任何对象实例化之前)
- 构造函数(在对象创建/初始化期间)