【问题标题】:How java knows which method to invoke? [duplicate]java如何知道调用哪个方法? [复制]
【发布时间】:2020-06-03 19:54:30
【问题描述】:

我完全是个编程菜鸟,我努力理解编码和编程的工作原理。

所以我正在阅读有关多态性和动态绑定的内容,我想我现在明白了(我希望),但我不明白为什么

AutoClosable ac = new PrintWriter(file);

当我使用点运算符时显示的执行方法比我使用点运算符时更少

PrintWriter pw = new PrintWriter(file);

我想在这里问的是,当实际类型是 PrintWriter 时,当我将点与“pw”一起使用时,我应该获得 PrintWriter 中可用的所有方法。声明类型是什么并不重要,因为动态绑定应该根据实际类型向我显示所有方法,但这里似乎并非如此。这对我来说没有意义。

但是,如果我使用

List<String> list = new ArrayList<String>();

ArrayList<String> arList = new ArrayList<String>();

然后当我使用 arList.或列表。然后它显示所有相同的方法。这对我来说没有意义。 我希望我能够让自己清楚我有什么问题/困惑。

【问题讨论】:

  • 如果你声明了一个AutoClosable类型的变量,那么编译器就会把它当作一个AutoClosable,所以你可以在它上面调用AutoClosable方法。如果您不想将其视为AutoClosable,为什么还要声明AutoClosable 类型的变量?
  • 向上转换为超类型/接口的唯一原因是使用该超类型的通用接口。该通用接口在相同访问级别具有严格较少的方法/字段数量。毕竟,该 ac 字段也可能包含 AutoClosable 的任何其他实例。
  • 在这种情况下,您从不向上转型,因为它是一个特定于半自动化资源处理的标记接口,特别是 try-与资源 建设。而且,虽然我们这样做了,但现在您也可以使用 var,如 try (var printWriter = new PrintWriter(file)) { /* code */ }

标签: java


【解决方案1】:

它显示了更少的 ac 方法,因为它的类型被声明为 AutoCloseable 而不是 PrintWriter。在这种情况下,PrintWriter 被分配给它,但您也可能遇到其他类的对象也被分配给它的情况,就像这样。

AutoCloseable ac;
if (condition) ac = new PrintWriter(file);
else ac = new AutoCloseableImpl(); //where AutoCloseableImpl implements AutoCloseable

在这里,您不知道ac 一定是PrintWriter。这就是为什么编译器只允许您访问它肯定知道ac 具有的方法——那些在AutoCloseable 中声明的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多