资讯专栏INFORMATION COLUMN

创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法,而被子类重载的方法不会调

guyan0319 / 1225人阅读

摘要:问题为什么创建对象的时候父类会调用子类方法但是创建对象父类会调用父类的方法答案当子类被加载到内存方法区后,会继续加载父类到内存中。如果子类重载了父类方法,则子类重载方法引用还指向子类方法。

public class Basic{
    public void add(int i)
    {
        System.out.println("Basic add");
    }
    
    public Basic()
    {
        add("a");
    }
}

public class A extends Basic{
    public void add(int i)
    {
        System.out.println("A add");
    }
}

public class B extends Basic{
    public void add(char i)
    {
        System.out.println("B add");
    }
}

public class Main{
    public static void main(String[] args)
    {
        A a = new A();
        B b = new B();
    }
}

问题:为什么创建A对象的时候父类会调用子类方法?
但是:创建B对象父类会调用父类的方法?

答案:
当子类被加载到内存方法区后,会继续加载父类到内存中。
如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。
如果子类重载了父类方法,则子类重载方法引用还指向子类方法。
如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。

当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。
但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。
上边代码在编译前已经转换为下面这个样子的了。

public class Basic{
    public void add(int i)
    {
        System.out.println("Basic add");
    }
    
    public Basic()
    {
        add((int)"a");
    }
}

public class A extends Basic{
    public void add(int i)
    {
        System.out.println("A add");
    }
}

public class B extends Basic{
    public void add(char i)
    {
        System.out.println("B add");
    }
}

public class Main{
    public static void main(String[] args)
    {
        A a = new A();
        B b = new B();
    }
}

看一下上边的代码,是不是恍然大悟?

更多文章:http://blog.gavinzh.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64399.html

相关文章

  • java面向对象(上)

    摘要:根据出现的位置,作为对象的默认引用有两种情形构造器中引用该构造器正在初始化的对象。在构造器中代表该构造器正在初始化的对象。用于限定该对象调用它从父类得到的实例变量和方法。 子类继承父类就可以继承到父类的成员变量和方法。如果访问控制允许,子类实例可以直接调用父类里定义的方法。 如果多个重载的构造器里包含了相同的初始化代码,则可以把这些初始化代码放置在普通代码块里完成,初始化块总在构...

    liaosilzu2007 评论0 收藏0
  • Java 面向对象(上)

    摘要:对象的引用关键字总是指向调用该方法的对象。根据出现位置的不同,作为对象的默认引用有两种情形。构造器中引用该构造器正在初始化的对象。如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则被称为方法重载。 类和对象 定义类 面向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也被称为实例,instance),其中类是某一批对象的抽象,可以把类理解成...

    SimonMa 评论0 收藏0
  • Java类继承

    摘要:的继承具有单继承的特点,每个子类只有一个直接父类。继承的特点的继承通过关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有的也称其为基类超类。是提供的一个关键字,用于限定该对象调用它从父类继承得到的实例变量或方法。 继承是面向对象的三大特征之一,也是软件复用的重要手段。Java的继承具有单继承的特点,每个子类只有一个直接父类。 继承的特点 Java的继承通过extends关键...

    seanHai 评论0 收藏0
  • 谈谈Java面向对象

    摘要:也就是说,一个实例变量,在的对象初始化过程中,最多可以被初始化次。当所有必要的类都已经装载结束,开始执行方法体,并用创建对象。对子类成员数据按照它们声明的顺序初始化,执行子类构造函数的其余部分。 类的拷贝和构造 C++是默认具有拷贝语义的,对于没有拷贝运算符和拷贝构造函数的类,可以直接进行二进制拷贝,但是Java并不天生支持深拷贝,它的拷贝只是拷贝在堆上的地址,不同的变量引用的是堆上的...

    ormsf 评论0 收藏0
  • Java 面向对象特性之多态性

    摘要:多态性面向对象三大特性封装继承多态。面向对象多态性存在的三个必要条件继承重写父类引用指向子类对象多态性的实现方式重写与重载静态多态性方法重载方法重载允许类具有多个相同名称的方法,但是方法参数列表不同。 多态性 面向对象(OOP)三大特性:封装、继承、多态。 多态性(polymorphism)指同一行为具有多种不同表现形式,在面向对象程序设计中表现为同一消息可以根据发送对象的类型不同,做...

    _ang 评论0 收藏0

发表评论

0条评论

guyan0319

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<