| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
雷速体育发帖软件开发QQ118000023C语言培训|一对一辅导|零基础学编程LightningChart 快速先进的.Net图表控件
共有 1724 人关注过本帖
标题:子类覆盖了父类的方法,为什么还能够调用父类的该方法
只看楼主 收藏
wancy
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2016-5-27
结帖率:25%
  已结贴   问题点数:20  回复次数:7   
子类覆盖了父类的方法,为什么还能够调用父类的该方法
package wancy;

public class Strange
{
    int a=2;
    static int b=3;
    void f()
    {
        System.out.println("F");
    }
    public static void main(String[]args)
    {
        Str str=new Str();
        
        System.out.println(str.a);
        Strange s=str;
        System.out.println(s.a);
        str.f();
        s.f();
        
        
    }
}

class Str extends Strange
{
    void f()
    {
        System.out.println("Z");
    }
    Str()
    {
        a=21;b=33;
        System.out.println(this.a);
        System.out.println(this.b);
        System.out.println(super.a);
        System.out.println(super.b);
        this.f();
        super.f();
    }
}

结果:21
33
21
33
Z
F
21
21
Z
Z

结果为什么不是21 33 21 33 Z Z 21 21 Z Z,既然父类f()方法被覆盖了,为什么不创建父类对象的情况下还能通过super.f()调用父类的f()方法?
搜索更多相关主题的帖子: package  public  
2016-08-08 21:33
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:ID已被封
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
  得分:5 
存在就可以调用

我不是砖家,要努力成为砖家。
2016-08-09 08:21
yft508
Rank: 1
等 级:新手上路
威 望:1
帖 子:17
专家分:9
注 册:2012-1-4
  得分:0 
在实例化一个子类对象的同时(堆中),在这个子类对象中也包括了一个父类对象(堆中),在子类的构造方法里面调用super,表示调用这个构造方法,实例化一个子类对象,然后调用这个子类对象中的父类对象,而且方法不是存在堆中的,而是在code segment中
2016-08-09 14:41
wancy
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2016-5-27
  得分:0 
回复 3楼 yft508
但是子类中的方法覆盖了父类的方法,在new的时侯,创建对象时,子类的父类那部分方法被覆盖了,没有了,又没有创建(new 父类)的实例,那么super.f()又是怎样调用父类的方法的呢?
2016-08-10 15:27
wancy
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2016-5-27
  得分:0 
回复 2楼 砖家的谎言
没创建对象,怎么存在?
2016-08-10 15:28
wuxiaobo_16
Rank: 2
等 级:论坛游民
威 望:3
帖 子:12
专家分:81
注 册:2016-8-7
  得分:5 
看看java 核心技术吧。 既然继承了,肯定有父类的东西,可以理解有两个函数,只是作用域不一样
2016-08-10 20:54
紫月一殇雪
Rank: 8Rank: 8
来 自:北大某鸟
等 级:蝙蝠侠
威 望:4
帖 子:131
专家分:764
注 册:2015-11-12
  得分:5 
参照下java.lang.object,并看下 java 对象的生成,    就知道为什么还可以调用父类的方法了

---------------------来自北大某鸟
2016-08-11 17:05
yft508
Rank: 1
等 级:新手上路
威 望:1
帖 子:17
专家分:9
注 册:2012-1-4
  得分:0 
回复 4楼 wancy
在继承中,子类的构造方法体类,第一行要显示的调用父类构造方法,如果没有显示的调用,那么系统会默认的调用父类的无参构造方法,也就是说在你的main方法体中,实例化一个子类对象的时候,也实例化了一个父类对象,这个父类对象在子类对象中.另外子类对象中还有2个变量 this 和 super , this指向它自身这个子类对象,super指向子类对象中的那个父类对象,所以可以用super这个指向父类对象的引用,来调用父类的方法
2016-08-11 17:35







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050986 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved