【问题标题】:Another "cannot find symbol"另一个“找不到符号”
【发布时间】:2014-06-11 23:50:59
【问题描述】:

我在代码中找不到符号错误(符号:方法 setAr(boolean))。

这是我的Main.java 文件:

class Vehicle {
    protected int marchs;
    protected int rode;
    public void xydar(int km) { System.out.print("\nxydei "+ km +" km!"); }
}
class Car extends Vehicle {
    public Car() { this.rode = 4; }
    public void xydar(int km) {
    super.xydar(km);
    System.out.println(" Estou de car!");
    }
}
class CarLux extends Car {
    private boolean ar;
    public CarLux() { this.ar = true; }
    public void setAr(boolean newAr) { this.ar = newAr; }
    public void xydar(int km) {
        super.xydar(km);
        if (this.ar)
        System.out.println(" ON!");
        else System.out.println(" OFF!");
    }
}
public class Main {
public static void main(String []args) {
    Vehicle moto = new Vehicle();
    moto.xydar(90);
    Vehicle car1 = new Car();
    car1.xydar(100);
    Vehicle car2 = new CarLux();
    car2.xydar(400);
    car2.setAr(false);
    car2.xydar(400);
    }
}

如何正确调用setAr() 方法?谁能帮我?我是 Java 新手。 提前致谢。

【问题讨论】:

标签: java inheritance visibility


【解决方案1】:

您需要将car2 声明为CarLux,而不是Vehicle

CarLux car2 = new CarLux();

那是因为您的 setAr() 方法是在 CarLux 上定义的。 car2 当前保存在Vehicle 类型的变量中,因此当您调用car2 的方法时,只有Vehicle 声明的方法可用。

【讨论】:

  • 除非我遗漏了什么,否则他会遗漏。编辑:derpy derpy derpy,类型是你的朋友
  • @Timr:他正在实例化CarLux,但该对象不是CarLux 的具体实例。
  • 我知道 car2 是 CarLux,但为什么这段代码适用于 xydar 方法并从正确的子类调用 xydar?仅仅因为车辆类上的 xydar 方法吗? CarLux 是一种交通工具,对吧?那是我的头疼。
  • @eightShirt:正确。 xydarVehicle声明。子类可能会覆盖CarLux 所做的实现Java Tutorial for Polymorphism 将帮助您探索这个主题。
【解决方案2】:

您只能通过 CarLux 类型的对象调用 setAr 方法,因为这是 CarLux 而不是 Vehicle 的方法,因此您必须将 car2 转换为 CarLux 然后调用这样的方法 -

((CarLux)car2).setAr(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2014-10-09
    • 2016-10-02
    相关资源
    最近更新 更多