当前位置: 首页 > 知识库问答 >
问题:

Java静态非静态[重复]

施越彬
2023-03-14

我的程序有问题。Eclipse写道:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
Cannot make a static reference to the non-static method umfang() from the type GeoPolygon
Cannot make a static reference to the non-static method laenge() from the type GeoPolyline

我做错了什么?我的应用程序中有2个错误。班你能改进我的代码并解释一下吗?先谢谢你。

    import java.util.ArrayList; //import Array List (java.util)
import java.util.List;  //import List (java.util)

public class App {      //new public class App


    public static void main(String[] args) { //main methode

        GeoPoint p1 = new GeoPoint(10.681,-48.857);   // new Points (x,y)
        GeoPoint p2 = new GeoPoint(96.980,20.724);
        GeoPoint p3 = new GeoPoint(66.647,-66.558);
        GeoPoint p4 = new GeoPoint(-2.674,-58.571);
        GeoPoint p5 = new GeoPoint(40.11,-12.342);
        GeoPoint p6 = new GeoPoint(27.782,46.809);
        GeoPoint p7 = new GeoPoint(54.759,-46.709);
        GeoPoint p8 = new GeoPoint(-33.89,-90.787);
        GeoPoint p9 = new GeoPoint(15.84,-67.553);
        GeoPoint p10 = new GeoPoint(19.481,51.331);


        List<GeoPoint> list1 = new ArrayList<GeoPoint>(); // Create ArrayList and add Points
        list1.add(p1);
        list1.add(p2);
        list1.add(p3);
        list1.add(p4);
        list1.add(p5);
        list1.add(p6);
        list1.add(p7);
        list1.add(p8);
        list1.add(p9);
        list1.add(p10);



        BoundingBox bbox = new BoundingBox(list1);          // get the list from BoundingBox
        double c = GeoPolygon.umfang();     //new variable c = height
        double d = GeoPolyline.laenge();        //new variable d = width

        System.out.println("Das Array beinhaltet die Punkte: " + list1 ); // This prints: "Das Array beinhaltet die Punkte" and the list
        System.out.println("Der Gesamtlaenge des Polygons betraegt (" + d +")." );  // This prints the polygons circumference
        System.out.println("Der Umang des Polygons betraegt: (" + c +")." );    // This prints the polygons area


    }
} 

多边形

import java.util.List;

public class GeoPolygon implements Geometry {

    private List<GeoPoint> Polylinelist;
    private String name;
    private double umfang;

    public double umfang() {

        umfang = 0;

        for (int i = 0; i < Polylinelist.size() -1 ; i++) {
            GeoPoint p1 = Polylinelist.get(i);
            GeoPoint p2 = Polylinelist.get(i + 1);

            umfang += GeoUtil.distance(p1, p2);

        }
        umfang += GeoUtil.distance(Polylinelist.get(0), Polylinelist.get(Polylinelist.size() -1 ));

        return umfang;
    }

    public GeoPolygon(List<GeoPoint> punktliste, String name) {
        this.Polylinelist = punktliste;
        this.name = name;
    }

    public BoundingBox getBoundingBox() {
        BoundingBox bbox = new BoundingBox(Polylinelist);
        return bbox;
    }

    public String getName() {
        {
            return name;
        }
    }

    public void addGeoPoint(GeoPoint geoPoint) {
        Polylinelist.add(geoPoint);
    }

}

地聚线

import java.util.List;

public class GeoPolyline implements Geometry {

    private List<GeoPoint> Polylinelist;
    private String name;
    private double laenge;

    public double laenge() {

        laenge = 0;

        for (int i = 0; i < Polylinelist.size() - 1; i++) {
            GeoPoint p1 = Polylinelist.get(i);
            GeoPoint p2 = Polylinelist.get(i + 1);

            laenge += GeoUtil.distance(p1, p2);

        }

        return laenge;
    }

    public BoundingBox getBoundingBox() {
        BoundingBox bbox = new BoundingBox(Polylinelist);
        return bbox;
    }

    public GeoPolyline(List<GeoPoint> punktliste, String name) {    //Konstruktor
        this.Polylinelist = punktliste;
        this.name = name;
    }

    public String getName() {
        {
            return name;
        }
    }

    public List<GeoPoint> getPolylinelist() {
        {
            return Polylinelist;
        }

    }

    public void addGeoPoint(GeoPoint geoPoint) {
        Polylinelist.add(geoPoint);
    }

}

共有3个答案

华献
2023-03-14

您需要将关键字static添加到GeoPolygon上的方法中

    public static double umfang() {
    ...
    }
郑衡
2023-03-14

在你的应用程序类中,你在publicstaticvoidmain中有以下行:

double c = GeoPolygon.umfang();

注意它所在的方法是静态的。因此,您不能调用umfang(),因为它不是静态的。这同样适用于laenge()

在这里阅读静电

可以直接访问类中的静态项,但不能直接访问类中的非静态项。若要访问非静态项(如方法或字段),必须创建该类的新实例。

全弘深
2023-03-14
double c = GeoPolygon.umfang();     
double d = GeoPolyline.laenge();

这些不是静态方法。如果希望它们是静态的,请将它们声明为静态的。

或者,您可以在调用类之前创建类的实例:

如:

GeoPolygon x = new GeoPolygon();
double c = x.umfang();
 类似资料:
  • 问题内容: 直到几周前,我还以为我知道何时创建字段和方法或。例如,当一个字段(例如另一个类的对象)对于该类的任意数量的对象是唯一的时,应将其设置为。 但是几周后,我读到了有关JVM垃圾收集的信息。 我知道字段永远不会被垃圾收集,并且始终保持在内存中,除非类加载器本身是垃圾收集的。 但是,如果我不创建该字段,至少它将被垃圾回收。 因此,在使字段/方法静态化与否之间似乎有一条 很细的界限 。 有人可以

  • 问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该

  • 我想澄清一下,在java中,静态字段是整个类使用的变量/字段,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它可以对对象1的静态字段具有不同的值?

  • 我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式

  • 问题内容: 在UNI atm上做Java课程,我遇到了骰子问题。 我有以下内容: 编译时,我得到:无法从静态上下文引用非静态变量n。我如何解决这个问题,同时让它从用户给定的值中随机化? 问题答案: 不是静态变量,因此您不能以静态方式()引用它。 由于它是类中的实例变量,并且您正在类中引用它,因此可以使用代替。

  • 我有以下代码: 当我尝试编译它时,会出现以下错误: 因此,我尝试使dbConnect静态如下: