实例变量的多态性[重复]

2024-04-23

这是我写的三个类:

public class Shape {

    public int x = 0;

    public void getArea() {
        System.out.println("I don't know my area!");
    }

    public String toString() {
        return "I am a shape!";
    }

    public int getX() {
        return x;
    }
}

public class Rectangle extends Shape {

    public int x = 1;

    public int getX() {
        return x;
    }

    public void getArea() {
        System.out.println("L*W");
    }

    public String toString() {
        return "I am a rectangle!";
    }
}

public class Tester {

    public static void main(String[] args) {
        Shape s = new Shape();
        Rectangle r = new Rectangle();

        System.out.println(r);
        System.out.println(r.x + "\n");

        s = r;
        System.out.println(s);
        s.getArea();
        System.out.println(s.x);
        System.out.println(s.getX());
    }
}

Tester 类的 main 方法的输出是:



I am a rectangle!

1

I am a rectangle!

L*W

0

1
  

为什么 s.x 返回 0 而不是 1?因为变量的当前实例不是 Rectangle 并且该类也声明了相同的实例变量,或者 Rectangle 类中的变量不会像对 getX() 那样覆盖 Shape 类中先前的公共 x 变量矩形类中的方法因此返回 1?

另外,作为一般规则,只有在该类中也声明了子类方法时,超类才能访问其子类方法的实现?这是因为编译器会看到“Shape”类中具有相同签名的相同数量的方法(具有重写的 Rectangle 实现)并接受这些方法作为有效的 Shape 方法吗?

提前致谢,


Java 中的字段不存在多态性。然而,还有继承。您实际上所做的就是在 Rectangle 类中创建两个具有相同名称的字段。该字段的名称实际上是:

public class Rectangle {
    public int Shape.x;
    public int Rectangle.x;
}

上面并不代表有效的 Java,它只是说明了字段在类中的范围如何

在 Rectangle 类的整个范围内,同名的超类字段是hidden。所以任何时候你引用简单的名字x,或范围名称this.x,在类中,您指的是定义在Rectangle。您实际上也可以使用作用域名称访问超类字段super.x.

现在,从类外部来看,访问哪个字段的规则略有不同。范围将由compile引用字段的类的时间类型。所以在你的代码中:

Shape s = new Shape();
Rectangle r = new Rectangle();

s = r;
System.out.println(s.x);

输出是0因为编译时类型s is Shape (not Rectangle)。当您执行以下操作时,您可以观察到此行为的变化:

Shape s = new Shape();
Rectangle r = new Rectangle();

s = r;
System.out.println(((Rectangle)s).x);

急!你的输出现在是1,因为编译器发现您已将字段访问范围限制为Rectangle.

压缩可见性规则:

您可以阅读有关实例变量隐藏的更多信息JLS,第 8.3.3.2 节 http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.3.3.2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实例变量的多态性[重复] 的相关文章

随机推荐

  • 有没有办法在jupyter中一次删除所有单元格?

    我每天都会在堆栈溢出中回答 pandas 问题之前尝试我的解决方案 通常两到三天后 我使用的 jupyter 笔记本将有 n 个单元 除了通过删除当前笔记本创建新笔记本之外 还有其他方法可以一次性删除所有单元吗 D D一次删除一个单元格 您
  • VideoView 未从所需位置播放视频

    我正在使用VideoView和搜索栏 但是当我通过seekBar在所需位置上seekTo 时 它从头开始播放视频 我尝试这段代码 public void onProgressChanged SeekBar seekBar int progr
  • 如何将 ToolbarItem 放置在后缘?

    我试图将工具栏项目放置在工具栏 MacOS 的后缘上 我浏览了文档 发现以下内容 automatic 项目被放置在center bottomBar 对于 MacOS 不适用 cancellationAction 与工作表相关 confirm
  • Android针对不同屏幕应用样式

    我有一个应用程序 需要在两个不同的设备上运行 600x1024 480x800 对于这些设备 我想应用不同的样式 它们具有不同的比例 我该怎么做 因为它们都有 hdpi values hdpi values mdpi没有效果 P S And
  • 确定 python 函数是否已更改

    Context 我正在尝试在数据处理框架中缓存执行 kedro http kedro readthedocs io 为此 我想为 python 函数开发一个独特的哈希值 以确定函数体 或该函数调用的函数和模块 中的任何内容是否已更改 我调查
  • Dispose 如何与实体框架配合使用

    有人可以向我解释一下我们如何以及为什么需要使用 Dispose 吗 它是 ASP NET MVC 4 附带的默认控制器模板的一部分 当对象 在本例中是数据库中的数据 不再使用时 NET 中的垃圾收集器是否应该自动启动 从数据库加载时应使用
  • 在 Bash 中循环元组

    是否可以在 Bash 中循环元组 举个例子 如果以下内容有效 那就太好了 for i j in c 3 e 5 do echo i and j done 有没有一种解决方法可以让我循环遍历元组 for i in c 3 e 5 do IFS
  • HTML中有透明的颜色代码吗?

    我正在构建一个新网站 并且正在寻找一个透明的导航栏 以便背景可见 没有透明颜色代码 但有不透明样式 查看有关它的文档 开发者 mozilla org https developer mozilla org en US docs Web CS
  • 为什么 godbolt 生成的 asm 输出与我在 Visual Studio 中的实际 asm 代码不同?

    这是生成的代码godbolt https godbolt org z 1F1t6Z 以下是 Visual Studio 在我的 main asm 文件上生成的相同代码 通过 汇编器输出 字段下的 项目 gt C C gt 输出文件 gt 使
  • HRESULT:工作表上的 0x800A03EC。范围

    我在 Worksheet range 方法上收到 HRESULT 0x800A03EC 行数超过70K 办公室2007 Code Microsoft Office Interop Excel Range neededRange curren
  • 如何在表上选择并计算某些值的出现次数

    我请求你的帮助 因为我不太了解 SQL 我需要计算表列中某些值的出现次数 以达到类似统计表的效果 如下图所示 需要的结果 Comment 我的结果表需要有前两列 国家和站点 来自第一个表 Violations 接下来的 5 列将包含状态表中
  • 配置规范未选择 ClearCase 签出版本

    从使用基本 ClearCase 的快照视图中 我想从快照视图中未选择的分支中签出文件的最新版本 我希望这是可能的 因为您可以通过版本树浏览器工具来完成此操作 然而 的文档checkout command http publib boulde
  • Visual Studio 2015 中的 TypeScript、Html 和 JS 文件嵌套

    如何在 Visual Studio 中管理 控制 TypeScript 文件的嵌套 我得到了嵌套和非嵌套文件的混合 我不确定如何 为什么 如下所示 TypeScript 项目中 JavaScript 文件的默认设置是排除它们而不是嵌套它们
  • VHDL FSM多驱动网Q连接到常量驱动程序,其他驱动程序被忽略,我的代码有什么问题?

    这段代码是一个 FSM 它是一个摩尔机 艾莉莎 P 哈克 Alyssa P Hacker 有一只蜗牛 沿着纸带爬下去 上面有 1 和 0 蜗牛 每当最后两个时都会微笑 它爬过的数字是 01 设计摩尔和米利 蜗牛大脑的 FSM 代码如下所示
  • Hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联[重复]

    这个问题在这里已经有答案了 可能的重复 Hibernate 具有相同标识符值的不同对象已与会话关联 https stackoverflow com questions 3553200 hibernate different object w
  • 使用 Javascript 播放音频元素 (html5)

    我正在尝试弄清楚如何触发从 javascript 播放音频 我得到了一些 html 看起来像 div class audio foo div
  • 删除 geom_tile 中的空白并匹配 geom_vline&hline 位置

    使用时我无法删除矩形之间的空白geom tile功能 df lt data frame x c seq 2 16 2 seq 17 39 2 y c rep c seq 8 26 2 seq 27 45 2 each 20 z c 1 40
  • Jquery Dialog 打开多个对话框

    我在同一页面上有多个图像 对于每个图像 单击时 我试图打开一个对话框 我在 HTML 设置中设置了以下 6 个图像 当前 当我单击图像时 会弹出 6 个对话框 所有对话框都具有与第一个 div 中找到的相同信息 如何修改我的脚本以使其正常工
  • div 中的文本 - 使用 jQuery 自动滚动 - jsFiddle

    我有以下 HTML 我的小提琴 http jsfiddle net 8yKjD 1 我想要 p 元素及其文本从下到上垂直滚动 我如何在不使用任何插件的情况下使用 jQuery 来做到这一点 提前致谢 http jsfiddle net 8y
  • 实例变量的多态性[重复]

    这个问题在这里已经有答案了 这是我写的三个类 public class Shape public int x 0 public void getArea System out println I don t know my area pub