Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 主类作用域中不允许方法调用_Java - Fatal编程技术网

Java 主类作用域中不允许方法调用

Java 主类作用域中不允许方法调用,java,Java,为什么允许我实例化类范围中的字段,但不允许对这些字段调用方法 public class MethodInFieldTest { List<Object> list = new ArrayList<>(); // compilation error // list.add(new Object()); // Compiles just fine, how I usually do it { list.add(new Object()); } // compil

为什么允许我实例化类范围中的字段,但不允许对这些字段调用方法

public class MethodInFieldTest {
List<Object> list = new ArrayList<>();

// compilation error
// list.add(new Object());

// Compiles just fine, how I usually do it
{
    list.add(new Object());
}

// compilation error
// addObject();

public void addObject() {
    list.add(new Object());
}


//usual way of handling this
//constructor one
public MethodInFieldTest(... stuff) {
    list.add(new Object());
}

//constructor two
public MethodInFieldTest(..) {
    list.add(new Object());
}

//etc

//...

//ugly way of doing it
//  List<Object> list = new ArrayList<>(Arrays.asList(new Object[]{new Object(), new Object()}));

public static void main(String[] args) {
    System.out.println(new MethodInFieldTest().list);
}
}
公共类MethodInFieldTest{
列表=新的ArrayList();
//编译错误
//添加(新对象());
//编译得很好,我通常是这样做的
{
添加(新对象());
}
//编译错误
//addObject();
public void addObject(){
添加(新对象());
}
//通常的处理方法
//建造师一号
公共方法内场测试(…东西){
添加(新对象());
}
//构造器二
公共方法内场测试(…){
添加(新对象());
}
//等
//...
//丑陋的做法
//List List=newarraylist(Arrays.asList(newobject[]{newobject(),newobject()}));
公共静态void main(字符串[]args){
System.out.println(新方法infieldtest().list);
}
}
例如,我经常发现用一些默认值启动一个列表是有意义的,如果我的类中有多个构造函数,我必须在构造函数中添加默认值,或者使用下面代码中标记的丑陋方式。“丑陋”的方法适用于列表,但对于需要类的默认状态(对象构造函数未提供的状态)的其他对象,我必须使用私有助手方法。我想知道为什么我不能在课堂上这样做,这不一定会带来很大的不便,但我很好奇为什么

为什么我不能做呢

直截了当的答案是:因为Java语言规范中是这样指定的:

{
    list.add(new Object());
}
这是一个很好的例子。这只是一个代码块,在创建类的实例时执行,它可以包含任何真正的java代码

另一方面,

List<Object> list = new ArrayList<>();

如果您能够将任何java代码与实例变量声明混合在一起,那么还需要另一种语法来决定是在类初始化还是实例初始化期间执行代码

您的实现使用了一种称为实例初始值设定项的东西。据我所知,Java的创建者采用这种方式使其更易于阅读。分离变量声明和初始化可以使类开头的声明更易于阅读。

为什么不能在块内调用addObject(),如下所示

public class MethodInFieldTest {
List<Object> list = new ArrayList<>();

// compilation error
// list.add(new Object());

// Compiles just fine, how I usually do it
{
    //list.add(new Object());
    addObject();

}

// compilation error
// addObject();

public void addObject() {
    list.add(new Object());
}


//usual way of handling this
//constructor one
public MethodInFieldTest(... stuff) {
    //list.add(new Object());
}

//constructor two
public MethodInFieldTest(..) {
    //list.add(new Object());
}

//etc

//...

//ugly way of doing it
//  List<Object> list = new ArrayList<>(Arrays.asList(new Object[]{new Object(), new Object()}));

public static void main(String[] args) {
    System.out.println(new MethodInFieldTest().list);
}
}
公共类MethodInFieldTest{
列表=新的ArrayList();
//编译错误
//添加(新对象());
//编译得很好,我通常是这样做的
{
//添加(新对象());
addObject();
}
//编译错误
//addObject();
public void addObject(){
添加(新对象());
}
//通常的处理方法
//建造师一号
公共方法内场测试(…东西){
//添加(新对象());
}
//构造器二
公共方法内场测试(…){
//添加(新对象());
}
//等
//...
//丑陋的做法
//List List=newarraylist(Arrays.asList(newobject[]{newobject(),newobject()}));
公共静态void main(字符串[]args){
System.out.println(新方法infieldtest().list);
}
}

问题是什么?你可以在你已经有的初始化程序块中完成…为什么我不能完成?这是第一句话作为旁注,根据我的经验,这在正确的面向对象编程中通常是不需要的。所以,你可能是想强迫别人做一些不太合适的事情。他可以做,但这并不能回答OP提出的问题。谢谢!我甚至不知道有一个JLS这样的东西,这将澄清许多困惑和WTF。
public class MethodInFieldTest {
List<Object> list = new ArrayList<>();

// compilation error
// list.add(new Object());

// Compiles just fine, how I usually do it
{
    //list.add(new Object());
    addObject();

}

// compilation error
// addObject();

public void addObject() {
    list.add(new Object());
}


//usual way of handling this
//constructor one
public MethodInFieldTest(... stuff) {
    //list.add(new Object());
}

//constructor two
public MethodInFieldTest(..) {
    //list.add(new Object());
}

//etc

//...

//ugly way of doing it
//  List<Object> list = new ArrayList<>(Arrays.asList(new Object[]{new Object(), new Object()}));

public static void main(String[] args) {
    System.out.println(new MethodInFieldTest().list);
}
}