java - 为什么在尝试打印 Derived 字段时未编译由类 Base 引用引用的 Derived 类的对象?
问题描述
一般来说,我是 Java 和面向对象编程的新手,遇到了一个我找不到答案的问题:
键入时:
Base someDerive = new Derived(2.2);
java基本上创建了一个实际上是Base类型的对象
我写了 Derived 而不是 Base (对于类类型),并且一切都按预期工作 - 但又一次 - 我假设如果类型 Base 指向 Derived ,那么它应该作为派生工作。
足够的谈话 - 一些代码的时间:
public class test{
public static void main(String args[])
{
Base someDerive = new Derived(2.2);
System.out.println(someDerive);
System.out.println(someDerive.baseField);
System.out.println(someDerive.baseString);
System.out.println(someDerive.derivedDouble);
}}
class Base{
int baseField;
String baseString;
Base(int field, String str) {
baseField = field;
baseString = str;
}
}
class Derived extends Base{
double derivedDouble;
Derived(double someDouble) {
super(10, "some_string");
derivedDouble = someDouble;
}
}
我期待打印输出,例如:“10”“some_string”“2.2”
相反,我得到了一个编译错误:
Test.java:8: 错误:找不到符号 System.out.println(someDerive.derivedDouble); ^ 符号:变量派生双位置:变量 someDerive 类型为 Base 1 错误
解决方案
键入时:
Base someDerive = new Derived(2.2);
java基本上创建了一个实际上是Base类型的对象
你有那个倒退。它创建一个类型为的对象Derived
,并将对该对象的引用分配给一个类型为的变量Base
。
你会得到一个编译错误,因为变量是 type Base
,并且类中没有derivedDouble
字段Base
。尽管在运行时引用的对象是 a Derived
,但在编译时编译器只知道变量是什么类型。
如果要访问 中定义的字段Derived
,则需要将变量强制转换为该类型:
System.out.println(((Derived)someDerive).derivedDouble);
推荐阅读
- c# - 从 Nlog 配置中读取?
- go - 如何处理 Golang 中的动态接口类型?
- css - 如何在css中使网格高度与响应高度中的网格相同
- python-3.x - 使用 buildozer 构建 apk 文件时出现错误“没有名为 'virtualenv.__main__' 的模块;'virtualenv' 不是包”
- javascript - 仅在单击的函数内部而不是在 Type Script 代码的 UI 中更新可淘汰可观察值
- git - 是否可以避免使用 ansible git 模块更改 remote_url?
- python - 在 Python 中获取 Bing 搜索结果
- amazon-web-services - Route 53 托管的 zome 记录指向旧的负载均衡器
- swift - TextField 接受有限的字符 SwiftUi
- laravel - 在laravel中将文件下载为未知文件