开发者社区> 问答> 正文

在Java中使用super关键字

即使在子类中未使用super()关键字,我也对超级类构造函数语句的打印有疑问。

class A
{
    int i;
    A()
    {
        System.out.println("A's constructor");
    }
}
class B extends A
{
    int i;
    B(int a , int b)
    {
        super.i=a;
        i=b;
    }
    void show()
    {
        System.out.println(super.i);
        System.out.println(i);
    }
}
class UseSuper
{
    public static void main(String[] args)
    {
        B b=new B(1,2);
        b.show();
    }
}

我的程序的输出是:

A的构造函数

1个

2

我不明白为什么我要在控制台上打印A的构造函数?

问题来源:Stack Overflow

展开
收起
montos 2020-03-26 11:13:38 365 0
2 条回答
写回答
取消 提交回答
  • 1.在子类的成员方法中,访问父类的成员变量。

    2.在子类的成员方法中,访问父类的成员方法。

    3.在子类的构造方法中,访问父类的构造方法。

    2020-03-26 11:27:00
    赞同 展开评论 打赏
  • 从https://docs.oracle.com/javase/tutorial/java/IandI/super.html检查以下几行

    注意:如果构造函数未明确调用超类构造函数,则Java编译器会自动将调用插入到超类的无参数构造函数中。如果超类没有无参数构造函数,则将出现编译时错误。对象确实具有这样的构造函数,因此如果对象是唯一的超类,就没有问题。

    如果子类构造函数显式或隐式调用其超类的构造函数,则您可能会认为将调用整个构造函数链,一直返回到Object的构造函数。实际上就是这种情况。这称为构造函数链接,当类下降很长时,您需要意识到这一点。

    希望能消除您的疑虑。

    [更新]

    发布此更新可以消除OP在下面的评论中提到的疑虑。

    以下代码将不会编译,因为A()尚未定义隐式超级构造函数,我们也未明确定义它。注意,A()当没有其他带参数的构造函数被定义时,隐式的超级构造函数会自动定义。

    class A {
        int i;
    
        A(int x,int y){
    
        }
    }
    
    class B extends A {
        int i;
    
        B(int a, int b) {
            super.i = a;
            i = b;
        }
    
        void show() {
            System.out.println(super.i);
            System.out.println(i);
        }
    }
    
    public class UseSuper {
        public static void main(String[] args) {
            B b = new B(1, 2);
            b.show();
        }
    }
    

    [另一个更新]

    发布此更新以清除OP在他的以下评论中提到的另一个疑问。

    以下代码也不会编译,因为A()已将超级构造函数声明为private阻止子类构造函数调用它。

    class A {
        int i;
    
        private A() {
            System.out.println("A's constructor");
        }
    }
    
    class B extends A {
        int i;
    
        B(int a, int b) {
            super.i = a;
            i = b;
        }
    
        void show() {
            System.out.println(super.i);
            System.out.println(i);
        }
    }
    
    class UseSuper {
        public static void main(String[] args) {
            B b = new B(1, 2);
            b.show();
        }
    }
    

    回答来源:Stack Overflow

    2020-03-26 11:14:38
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载