java - java如何知道调用哪个方法?
问题描述
我是一个编程新手,并努力理解编码和编程的工作原理。
所以我正在阅读多态性和动态绑定,我想我现在明白了(我希望)但我不明白为什么
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. 或列表。然后它显示所有相同的方法。这对我来说没有意义。我希望我能够让自己清楚我有什么问题/困惑。
解决方案
它显示的方法更少,ac
因为它的类型被声明为AutoCloseable
而不是PrintWriter
。在这种情况下,aPrintWriter
被分配给它,但您可能会遇到这样的情况,即其他类的对象也被分配给它,就像这样。
AutoCloseable ac;
if (condition) ac = new PrintWriter(file);
else ac = new AutoCloseableImpl(); //where AutoCloseableImpl implements AutoCloseable
在这里,您不知道那ac
一定是PrintWriter
. 这就是为什么编译器只允许你访问它肯定知道的方法ac
——在AutoCloseable
.
推荐阅读
- css - 为什么当网格容器包含对齐内容属性时css网格对齐自身不起作用?
- assembly - 将代码转换为 x86 MASM 中的过程
- amazon-web-services - 如何防止 API 返回呈指数增长的转义字符串?
- javascript - 如何在javascript数组中存储所有包括重复(非唯一)对象?
- javascript - Webpack-cli - TypeError:无法将未定义或空值转换为对象
- oracle - oracle 中的权限
- karate - 空手道如何解析这个 json 字符串响应
- powershell - 在 PowerShell 中设置文本颜色
- python - 当程序在 python 中运行时,如何创建一个新变量?
- python-3.x - nginx + gunicorn + flask - EC2 上的 502 和 404 错误