Java构造器内部的多态方法的行为

Posted 大冰的小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java构造器内部的多态方法的行为相关的知识,希望对你有一定的参考价值。

在一般的方法内部,动态绑定的调用是在运行时才决定的,因为对象无法知道它是属于方法所在的那个类,还是属于那个类的导出类。如果要调用构造器内部的一个动态绑定方法,就要用到那个方法的被覆盖后的定义。但是这个调用的效果可能很难预料,因为被覆盖的方法在对象被完全构造之前就会被调用。而C++则会避免这个问题。
Java 例子:

package com.myjava.study;

class Glyph 
    void draw() 
        System.out.println("Glyph.draw()");
    

    public Glyph() 
        System.out.println("Glyph() before draw()");
        draw();
        System.out.println("Glyph() after draw()");
    


class RoundGlyph extends Glyph 
    private int radius = 1;
    public RoundGlyph(int r) 
        radius = r;
        System.out.println("RoundGlyph(), radius = " + radius);
    

    void draw() 
        System.out.println("RoundGlyph.draw(), radius = " + radius);
    



public class PloyConstructors 
    public static void main(String[] args) 
        new RoundGlyph(5);
    

输出结果:

Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph(), radius = 5

在调用构造函数之前,对象已经分配好空间,并进行了默认初始化。在基类的构造函数调用的draw方法实际上是导出类的draw方法,但是这个时候radius的值还是默认的初始值,而不是5。
而对于C++,多态不会在构造函数中体现,因为在基类构造过程中,使用的是基类自己的虚函数指针,导出类的虚函数指针还未生成,因此在基类的构造函数中只会调用自己的方法。

#include <iostream>

using namespace std;

class Glyph 
public:
    Glyph() 
        cout << "Glyph() before draw()" << endl;
        draw();
        cout << "Glyph() after draw()" << endl;
    

    virtual void draw() 
        cout << "Glyph.draw()" << endl;
    
;

class RoundGlyph : public Glyph 
public:
    RoundGlyph(int r) 
        radius = r;
        cout << "RoundGlyph.RoundGlyph(), radius = " << radius << endl;
    
private:
    int radius;
;

int main()

    RoundGlyph roundGlyph(5);
    return 0;

输出结果:

Glyph() before draw()
Glyph.draw()
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5

在基类的构造方法中调用draw方法实际调用的就是基类自己的draw方法,不会产生多态。

以上是关于Java构造器内部的多态方法的行为的主要内容,如果未能解决你的问题,请参考以下文章

《Java编程思想》笔记 第八章 多态

构造器内部的多态方法的行为

构造器内部的多态行为

构造器内部的多态行为

Java编程最佳实践之多态

java构造器内部多态方法