[英]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();
在Demo
的main
方法中。 要糾正此問題,您必須將其替換為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
上的方法。 將minKlub
和dinKlub
視為Klub
類的物理實例很重要。
巧的是,寫Klub.someArbitraryMethod()
其實是java中常用的一個特性,其中someArbitraryMethod()
是靜態聲明的。 僅當您將該方法聲明為static
才可能采用這種編寫方式:
public static void someArbitraryMethod() {...}
這意味着該方法不屬於類Klub
任何物理實例,而是屬於類Klub
本身。 正在做
minKlubb.someArbitraryMethod();
因此會導致編譯錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.