stack overflow-stackoverflow上面的java的域不能“重写”问题

问题描述

stackoverflow上面的java的域不能“重写”问题
package test;

class A
{
    int x = 5;
}
class B extends A
{
    int x = 6;
}
public class CovariantTest
{
    public A getObject()
    {
       return new A();
    }
    public static void main(String[]args)
    {
       CovariantTest c1 = new SubCovariantTest();
       System.out.println(c1.getObject().x);
    }
}

class SubCovariantTest extends CovariantTest
{
    public B getObject()
    {
       return new B();
    }
}

最后输出的答案是5不是6
stackoverflow上面的解释我看了还是不太理解。
1.成员变量是编译时决定我了解,但这与“c1.getObject().x”有什么关系?毕竟c1.getObject()返回的是类B的对象呀?
2.解释里提到了隐藏域,子类的域会隐藏父类同名域,和重写是不一样的。我不太明白这个与答案有什么联系?

stackoverflow的问题地址:
http://stackoverflow.com/questions/12589274/slight-confusion-regarding-overriding-where-variables-are-concerned

解决方案

提到了隐藏域,子类的域会隐藏父类同名域,和重写是不一样的。我不太明白这个与答案有什么联系
这就是说两个变量都叫x,但是是两个我完全不同的变量,既然不同的变量,干脆我们就用不同的名字。
看下面的代码,我把派生类的x修改为y,使得派生类的x叫做y

 /* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

class A
{
    int x = 5;
}
class B extends A
{
    int y = 6;
} 

class SubCovariantTest extends CovariantTest
{
    public B getObject()
    {
        System.out.println("sub getobj");
       return new B();
    }
}
/* Name of the class has to be "Main" only if the class is public. */
class CovariantTest
{
    public A getObject()
    {
        System.out.println("ct getobj");
       return new A();
    } 

    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        CovariantTest c1 = new SubCovariantTest();
        System.out.println(c1.getObject().y);
    }
}

现在这代码没办法编译了。

System.out.println(c1.getObject().x);
可以编译。

说明派生类定义的那个变量,编译器根本就不承认它的存在。为什么如此?因为

public B getObject()
{
    System.out.println("sub getobj");
   return new B();
}

你一厢情愿把返回值写成B,但是它仍然只能返回A

这个叫做协变式覆盖

http://blog.csdn.net/kiss_the_sun/article/details/7846413

所以它返回的其实还是被当作A,既然是A,那么显然B定义的类型不作数了。

时间: 2024-09-10 14:24:04

stack overflow-stackoverflow上面的java的域不能“重写”问题的相关文章

"Java"一台电脑上面的java程序如何打开另一台电脑上面的java程序

问题描述 "Java"一台电脑上面的java程序如何打开另一台电脑上面的java程序 就是我在一台电脑上面先编写一个java程序,然后通过这个java程序打开另一台电脑上面的一个*.jar的应用程序,如何实现?请大神赐教!!!!

Stack Overflow 公布 2013 年用户调查结果

截止2013年,Stack Overflow社区的月访问量从2150万次增长到了2690万次,访问者分别来自全球的242个国家.为了维持社区的增长,我们做了很多的努力-- Careers 2.0已经有了法语和德语两个本地化版本,我们正致力于为整个Stack Overflow网络开发iOS和Android应用,并且Stack Overflow历史上的首次本地化尝试--葡萄牙语版Stack Overflow-- 已经处于Beta状态.为了让我们更好地为Stack Overflow社区和用户服务,我们

Java中方法的重写与成员变量的隐藏

这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量) 在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么? /**   * @author Hollis 17/9/27.   */  public class FieldOverriding {        public static void main(String[] args) {          Sub c1 = new Sub();          System.

独家 | 一探Stack Overflow工作搜索

大约在两年前,Stack Overflow上发生了一件大事:Stack Overflow发布了一个叫做Providence的新系统.这个系统可以得知访问者对什么样的技术有兴趣,也可以衡量某个访问者和某个工作之间的匹配程度. 更通俗的说,Providence的发布可以被看作是Stack Overflow向"更智能"迈进以及在数据科学领域上持续投资的道路上的里程碑.如果想了解更多关于Providence的信息,可以参考下面这个系列博客(https://kevinmontrose.com/2

Stack Overflow 发布 2016 开发者调查报告:JavaScript 最受欢迎,46%开发者没有相关学位

开发者问答网站 Stack Overflow 是颇受开发者欢迎的开发知识经验问答网站.网站每年都会对用户进行调查,了解开发者的构成.开发语言选择等情况.今年该网站对约 50000 名用户进行调查后的结果已经出炉,里面不乏一些有趣同时也令人深思的发现:比如说 JavaScript 仍然是最受欢迎的编程语言,而将近一半的开发者并没有计算机的相关学位. 在 语言方面,JavaScript 仍然以压倒性的优势当选最受欢迎开发语言,超过 55.4 的受访者称自己使用这么语言.实际上前 5 名的排名与去年都

Stack Overflow新网站Documentation开启Beta测试

Stack Overflow新推出了一个名为Documentation的网站,让开发人员可以创建有关各种软件开发主题的文档,供其他开发人员参考. 与Stack Overflow Q&A网站旨在回答特定的问题不同,新网站的目标是提供关于许多编程技术的参考和指导文档.它类似一个由开发人员编写的在线手册. 文档的组织以Q&A网站上现有的将近5万个标签为基础.由于尚在起步阶段,所以目前只有几百个标签有文档.对于每个标签,文档按主题进行组织.主题中包含解释主题的示例,接下来是语法.参数和说明等部分.

Stack Overflow 推出 Documentation Beta

Stack Overflow新推出了一个名为Documentation的网站,让开发人员可以创建有关各种软件开发主题的文档,供其他开发人员参考. 与Stack Overflow Q&A网站旨在回答特定的问题不同,新网站的目标是提供关于许多编程技术的参考和指导文档.它类似一个由开发人员编写的在线手册. 文档的组织以Q&A网站上现有的将近5万个标签为基础.由于尚在起步阶段,所以目前只有几百个标签有文档.对于每个标签,文档按主题进行组织.主题中包含解释主题的示例,接下来是语法.参数和说明等部分.

什么样的硬件设备在支撑 Stack Overflow?

Stack Overflow 是使用 ASP.NET 开发的. 我更愿意把 Stack Overflow 看作是能够运行于大规模数据下,但本身并不算大规模的(running with scale but not at scale).意思是我们的网站非常有效率,但至少目前为止,我们的规模还不够"大".让我们通过一些数字来介绍Stack Overflow当前是一个怎样的规模吧.以下是一些核心的数字,来自于不久前在一整天(24小时)内的统计,准确说是2013年11月12日.这是一个典型的工作

Stack Overflow 最流行的编程语言和标签

我们分析了Stack Overflow的标签(tag)以了解最流行的编程语言,并在更大的语言范围内统计了大家关心的问题来进一步了解子标签. 最流行的编程语言莫过于Java了,之后是Javascript,C#,PHP,jQuery,Python,HTML,C++.在标签排名 TOP50中,前10名占据了所提问题的55%,并且前6名,即Java.Javascript.C#.PHP.jQuery.Python占比超过 41%. Java Java凭借超过10%的问题成为了标签排名TOP50的榜首.当我