【问题标题】:Can't access methods of an object?无法访问对象的方法?
【发布时间】:2020-07-31 13:49:07
【问题描述】:

我有一个小例子,我有一个如下界面

public interface Chair {
    int getHeight();
    String getType();
    int getPrice();
}

还有一个班级:

public class ExpensiveChair implements Chair {
    private int height;
    private int price;
    static private String type = "Expensive";

    public ExpensiveChair(int height, int price){
        this.height = height;
        this.price = price;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    public int getHeight() {
        return this.height;
    }

    @Override
    public String getType() {
        return this.type;
    }

    @Override
    public int getPrice() {
        return this.price;
    }
}

但是如果我做类似的事情

Chair chair = new ExpensiveChair(1, 2);

我不能打电话

chair.setHeight(5)

我需要先进行类型转换吗?

((ExpensiveChair) chair).setHeight(1);

为什么我需要显式地转换它或者我不能调用该方法?

【问题讨论】:

  • 因为类型Chair没有方法setHeight。只有ExpensiveChair 可以
  • @QBrute 所以本质上它不知道对象在运行前是 ExpensiveChair 类型的?因为如果我执行chair.getClass 之类的操作,那么它会显示 ExpensiveChair,但我猜它会在运行时发生
  • 不是这样的。这是因为您说创建的实例是Chair 类型。想象一下,您有另一个类 CheapChair 也扩展了 Chair,但没有 setHeight 方法。你可以做Chair chair = new CheapChair();。那么chair.setHeight(5) 会做什么呢?
  • @QBrute 那么它可以看到对象是CheapChair,看看它是否有一个方法setHeight然后采取相应的行动?
  • 这不是它的工作方式。在您声明静态类型为Chair 的变量时,您只能在该实例上调用您在Chair 接口中定义的方法。您唯一能做的就是将setHeight 方法添加到Chair 接口,或者像您已经做的那样将其转换为更具体的类型ExpensiveChair

标签: java inheritance interface casting polymorphism


【解决方案1】:

当您创建对象Chair chair 时,Java 将其作为Chair 对象读取,即使您稍后将其分配给ExpensiveChair。因此,您只能访问Chair 中的方法。由于Chair 没有方法setHeight(),只有ExpensiveChair 有,所以它会报错。

我在 cmets 中看到您说“因为如果我执行 chair.getClass 之类的操作,那么它会显示 ExpensiveChair。”那是因为在运行时,它调用了ExpensiveChair的所有方法,并且调用了ExpenisveChairgetClass()方法。但在编译时,它会将其读取为Chair 对象。

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 2013-03-27
    • 2019-08-28
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多