继承条件下的构造方法调用 super

运行TestInherits.java示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大!

程序:

class Grandparent
{

     public Grandparent()
    {

         System.out.println("GrandParent Created.");

     }

    public Grandparent(String string)
    {
        System.out.println("GrandParent Created.String:" + string);

       }

}    

class Parent extends Grandparent
{

   public Parent()
    {

          //super("Hello.Grandparent.");

        System.out.println("Parent Created");

          // super("Hello.Grandparent.");

       }

}

class Child extends Parent
{

     public Child()
     {

             System.out.println("Child Created");

       }

}

public class TestInherits
{

    public static void main(String args[])
    {

         Child c = new Child();

     }

}

结果截图:

1  原程序

2  super在第一句

3  super不在第一句

结论:

通过super 调用基类构造方法,必须是子类构造方法的第一个语句。

思考

为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

   因为子类的初始化会造成父类构造函数的执行。  而Parent类继承了Grandparent类,Child类又继承了Parent类,由于super位于Parent类中,调用其基类Grandparent的构造函数,由于super("Hello.Grandparent.")带有参数,调用的是第二个构造函数。

时间: 2024-10-12 14:53:09

继承条件下的构造方法调用 super的相关文章

java 继承条件下的构造方法调用

运行 TestInherits.java示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大!   1.没有super的调用 1 class Grandparent 2 { 3 4 5 public Grandparent() 6 { 7 8 System.out.println("GrandParent Created."); 9 10 } 11 12 13 pu

课堂例子验证—继承条件下的构造方法调用

代码一: class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public

继承条件下的构造方法调用

程序源代码: package homework;class Grandparent{ public Grandparent() { System.out.println("GrandParent Created."); }public Grandparent(String string){ System.out.println("GrandParent Created.String:"+string); }}class Parent extends Grandpar

构造函数的继承--子类不继承父类的构造函数,只能调用

关于子类对父类构造函数的继承: 子类必须调用父类的构造函数.默认情况下会自动调用父类的无参构造函数.如果父类没有无参构造函数,则必须显式的用super()调用一个构造函数. 创建对象时,先调用父类的构造函数对对象进行初始化, 然后再调用子类自己的构造函数 子类只继承(其实是默认调用)父类的默认(无参)构造函数,如果父类重写了自己的构造函数,就会导致父类没有无参构造函数,这样子类就不能从父类继承构造函数.

C++对象模型——"无继承"情况下的对象构造(第五章)

5.2 继承体系下的对象构造 当定义一个object如下: T object; 时,实际上会发生什么事情呢?如果T有一个constructor(不论是由user提供或是由编译器合成),它会被调用.这很明显,比较不明显的是,constructor的调用真正伴随了什么? constructor可能内带大量的隐藏码,因为编译器会扩充每一个constructor,扩充程度视 class T的继承体系而定.一般而言,编译器所做的扩充操作大约如下: 1.记录在member initialization li

java 构造方法中super()的作用?

手贱百度了一下 :java里面自定义类的有参构造方法为什么不用super() 举个例子: class Father { Father(){print ('father');}; } class Son { Son(){print ('son')}; } 如果只是这样,那么构造Son之前会在后台调用一下super()函数,调用过程你看不到,但是确实执行了,结果是先father后son但是这种时候你显示的写个super就没有意义了,那么他在什么时候用呢,再举个例子 给你举个例子 class Fath

OC类的继承以及类的循环调用

一, 关于OC的实例变量的可见度,即实例变量的访问权限有三种: 1),@public           公有的 被@public修饰的实例变量是公共的,即没有访问权限,在任何文件中都可以访问,(访问方式是通过对象+指向操作符) 2),@protected    受保护的 被@protected修饰的实例变量有一定的访问限,只允许在本类文件及子类文件中访问,其他文件不可访问 3),@private         私有的 被@private 修饰的实例变量,只允在在本类文件中访问,不可以在子类文

子类-父类构造方法调用问题

当一个类继承了某个类时,在子类的构造方法里,super()必须先被调用:如果你没有写,编译器会自动调用super()方法,即调用了父类的构造方法: 这并不是创建了两个对象,其实只有一个子类Sub对象:之所以需要调用父类的构造方法是因为在父类中,可能存在私有属性需要在其构造方法内初始化: 在Java中,如果一个类没有定义构造方法,编译器会默认插入一个无参数的构造方法:但是如果一个构造方法在父类中已定义,在这种情况,编译器是不会自动插入一个默认的无参构造方法. 要修复这个错误,很简单: 1.在父类手

继承中的自定义构造方法

1.继承中的自定义构造方法 不能在子类访问父类私有变量 @interface Person : NSObject @property int age; - (id)initWithAge:(int)age; @end @interface Student : Person @property NSString *name; - (id)initWithAge:(int)age andName:(NSString *)name; @end @implementation Student - (id