簡體   English   中英

從另一個類調用方法時,Java 找不到符號

[英]Java cannot find symbol when calling a method from another class

我試圖從我的演示類調用 klub 類中的方法 show,並在演示類(從我的 klub 類中)調用方法 visAlleAtleter,但我收到一個錯誤,說它找不到符號,然后方法的名稱。 我試圖指定我想要它的來源,但我不確定如何去做。 這是我的俱樂部課程

import java.util.ArrayList;

public class Klub {
    
    private String navn;
    private ArrayList<Atlet> atleter;

    public Klub(String navn) {
       this.navn = navn;
       atleter = new ArrayList<>();
    }
    
    public void addAtlet(Atlet atlet) {
        atleter.add(atlet);
    }
    
    public void visAlleAtleter() {
        System.out.println(navn);
        for(Atlet atlet: atleter) {
            atlet.display();
            
        }
        
    }
    public void visAlleAtleter2(boolean samletValue) {
      if(samletValue = true) {
          Atlet.show();
        } else {
            
        }
    }
}

這是我的演示課

public class Demo { 
    public static void main(String[] args) {
        
        Klub minKlub = new Klub("SWU United");
       

        Atlet atlet1 = new Atlet("Pan", "Tennis", 43.5, 21);
        Atlet atlet2 = new Atlet("Peter", "Golf", 41.5, 29);
        Atlet atlet3 = new Atlet("Robby", "Tennis", 43.5, 20);
        Atlet atlet4 = new Atlet("Niklas Klein", "Maisball", 21.2, 23);
        Atlet atlet5 = new Atlet("Linni Maister", "Maisball", 44.1, 32);
        Atlet atlet6 = new Atlet("Dennis Michael", "Maisball", 32.5, 11);
        minKlub.addAtlet(atlet1);
        minKlub.addAtlet(atlet2);
        minKlub.addAtlet(atlet3);
        minKlub.addAtlet(atlet4);
        minKlub.addAtlet(atlet5);
        minKlub.addAtlet(atlet6);
   
         Klub.visAlleAtleter();

    
    
    } 
    
}

和我的 atlet 課

public class Atlet {

    private String navn;
    private String sportsgren;
    private double pris;
    private int alder;

    public Atlet(String navn, String sportsgren, double pris, int alder) {
    
    this.navn = navn;
    this.sportsgren = sportsgren;
    this.pris = pris;
    this.alder = alder;
    
    }
    
    public void oppdaterPris(double nyPris) {
        pris = nyPris;
    }
    
    public double getPris() {
        return pris;
    }
    
    public double predSalgspris() {
        return pris-0.95*Math.abs(25-alder);
    }
    
    public void display() {
        System.out.println(navn + " (" + alder + ") - " + 
        sportsgren + ": " + pris + "kr (" + predSalgspris() + "kr)");
    }
    
}

方法visAlleAtleter不是靜態的,所以你不能像Klub.visAlleAtleter()那樣調用它。 只需在對象minKlub.visAlleAtleter()上調用方法。

問題在於Klub.visAlleAtleter(); Demomain方法中。 要糾正此問題,您必須將其替換為minKlub.visAlleAtleter(); .

這樣做的原因是,根據您的代碼,您有一個名為minKlub Klub類的實例。 方法visAlleAtleter()綁定到類Klub任何實例,而不是類Klub本身。

編輯:為了說明為什么您的嘗試可能是一個問題,請考慮以下示例:

public class Demo { 
    public static void main(String[] args) {
        
        Klub minKlub = new Klub("SWU United");
        Klub dinKlub = new Klub("SEU United")
       
        Atlet atlet1 = new Atlet("Pan", "Tennis", 43.5, 21);
        Atlet atlet2 = new Atlet("Peter", "Golf", 41.5, 29);
        minKlub.addAtlet(atlet1);
        minKlub.addAtlet(atlet2);

        Atlet atlet3 = new Atlet("Mads", "Fotball", 123, 123);
        Atlet atlet4 = new Atlet("Mikkelsen", "Curling", 123, 123);
        dinKlub.addAtlet(atlet3);
        dinKlub.addAtlet(atlet4);
   
        Klub.visAlleAtleter();
    }    
}

在這個例子中,當調用Klub.visAlleAtleter() ,不可能知道 Java 應該調用minKlubb還是dinKlubb上的方法。 minKlubdinKlub視為Klub類的物理實例很重要。

巧的是,寫Klub.someArbitraryMethod()其實是java中常用的一個特性,其中someArbitraryMethod()是靜態聲明的。 僅當您將該方法聲明為static才可能采用這種編寫方式:

public static void someArbitraryMethod() {...}

這意味着該方法不屬於類Klub任何物理實例,而是屬於類Klub本身。 正在做

minKlubb.someArbitraryMethod();

因此會導致編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM