//这是一个研究集合如何工作的小代码,但是当我在main方法中创建一个Mountain对象时,它会出错。最后进一步解释。
import java. util. * ;
public class sortMountains {
class Mountain {
String name;
int height;
Mountain(String n, int h) {
name = n;
height = h;
}
public String toString( ) {
return name + + height;
}
}
List<Mountain> mtn = new ArrayList<Mountain> ();
class NameCompare implements Comparator <Mountain> {
public int compare(Mountain one, Mountain two) {
return one.name. compareTo(two. name);
}
}
class HeightCompare implements Comparator <Mountain> {
public int compare(Mountain one, Mountain two) {
return (two. height - one. height) ;
}
}
public void go() {
mtn.add(new Mountain("Longs ", 14255));
mtn.add(new Mountain("Elbert ", 14433));
mtn.add(new Mountain("Maroon " , 14156));
mtn.add(new Mountain("Castle ", 14265));
System.out.println("as entered:\n" + mtn);
NameCompare nc = new NameCompare();
Collections.sort(mtn, nc);
System.out.println("by name:\n'" + mtn);
HeightCompare hc = new HeightCompare();
Collections.sort(mtn, hc);
System.out.println("by height:\n " + mtn);
}
public static void main(String args[]){
sortMountains sorting=new sortMountains();
sorting.go();
//error line Mountain a=new Mountain("Everest",12121);
}
}
以上编译时没有错误行工作正常但是当我想在main方法中创建Mountain的对象时,它会给出错误“非静态无法从静态方法引用”
答案 0 :(得分:3)
制作Mountain
班static
,如下所示:
static class Mountain {
...
如果不这样做,Mountain
的每个实例都必须有一个与sortMountains
关联的实例。由于main()
中没有此类实例(方法本身为static
),编译器将不允许您在那里实例化Mountain
。
有关进一步的讨论,请参阅:
答案 1 :(得分:3)
内部类就像一个类的任何其他成员一样。因此,您无法在main()
方法中引用非静态内部类,就像您无法在{{1}中引用非静态全局变量一样} 方法。因此,您可以将您的类声明为main()
以避免该错误:
static
答案 2 :(得分:1)
Mountain类是内部类,因此创建山对象为:
sortMountains sorting=new sortMountains();
Mountain a = sorting.new Mountain("Everest",12121);
对于您的程序,您无法执行此操作,因为Mountain类是非静态的,您无法从静态方法访问非静态成员。
因此,您可以将Mountain类声明为static,并将其对象创建为Mountain a = new Mountain("Everest",12121);
答案 3 :(得分:1)
如您所见,Mountain
类没有封闭的类sortMountains
就无法创建它。如果你想以你想要的方式创建sortMountains
,你应该在Mountain
内声明{。}}。
答案 4 :(得分:1)
您已在sortMountains
类中声明了Mountain类。在这种情况下,您可以访问您的内部类
如果您的内部类是静态的(static class Mountain{}
)或
创建外部instance.new innerClass()。
Mountain a=sorting.new Mountain("Everest",12121);
答案 5 :(得分:1)
因为你的内部类不是静态的,所以你必须以下面的方式创建该类的对象。
public static void main(String args[]){
sortMountains sorting=new sortMountains();
sorting.go();
Mountain a = sorting.new Mountain("Everest", 12121);
}
或者您可以使您的Mountain类保持静态,如下所示:
static class Mountain {
...