注册 登录
编程论坛 JAVA论坛

子类覆盖了父类的方法,为什么还能够调用父类的该方法

wancy 发布于 2016-08-08 21:33, 3975 次点击
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()方法?
7 回复
#2
砖家的谎言2016-08-09 08:21
存在就可以调用
#3
yft5082016-08-09 14:41
在实例化一个子类对象的同时(堆中),在这个子类对象中也包括了一个父类对象(堆中),在子类的构造方法里面调用super,表示调用这个构造方法,实例化一个子类对象,然后调用这个子类对象中的父类对象,而且方法不是存在堆中的,而是在code segment中
#4
wancy2016-08-10 15:27
回复 3楼 yft508
但是子类中的方法覆盖了父类的方法,在new的时侯,创建对象时,子类的父类那部分方法被覆盖了,没有了,又没有创建(new 父类)的实例,那么super.f()又是怎样调用父类的方法的呢?
#5
wancy2016-08-10 15:28
回复 2楼 砖家的谎言
没创建对象,怎么存在?
#6
wuxiaobo_162016-08-10 20:54
看看java 核心技术吧。 既然继承了,肯定有父类的东西,可以理解有两个函数,只是作用域不一样
#7
紫月一殇雪2016-08-11 17:05
参照下java.lang.object,并看下 java 对象的生成,    就知道为什么还可以调用父类的方法了
#8
yft5082016-08-11 17:35
回复 4楼 wancy
在继承中,子类的构造方法体类,第一行要显示的调用父类构造方法,如果没有显示的调用,那么系统会默认的调用父类的无参构造方法,也就是说在你的main方法体中,实例化一个子类对象的时候,也实例化了一个父类对象,这个父类对象在子类对象中.另外子类对象中还有2个变量 this 和 super , this指向它自身这个子类对象,super指向子类对象中的那个父类对象,所以可以用super这个指向父类对象的引用,来调用父类的方法
1