java继承2-构造函数详细

1. 继承中构造函数的调用顺序

   先调用父类构造,再调用子类构造

   原因:  必须要先给父类分配空间,这样子类才可以继承

   注意事项:

                   a.对于父类的变量,子类继承,但是是有自己的空间

                   b.静态变量不继承,是存在于Java虚拟机分配的数据空间里

                   c.构造函数也不继承


2.关于super关键字


当父类拥有无参构造时,子类的构造函数可以不写什么,默认调用;

当然也可以通过super()调用。

e.g:

package com.xiyou.weijie.chap5;

public class Base {
	protected int a;

	public Base() {
		System.out.println("Base无参构造");
	}
<span style="font-size:18px;"></span><pre name="code" class="java">        public Base(int a) {
                this.a = a;
                System.out.println("Base有参构造");
       }
}
 
 
package com.xiyou.weijie.chap5;

public class Child extends Base{

    private int b;
    public Child()
    {
        /*
         * 这里不写任何语句,但是会隐形的调用父类的无参构造
         * super();这样是显性调用
         */
        System.out.println("Child无参构造");
    }
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        
        Child c=new Child();
    }

}

如果父类只有有参构造函数,子类必须显性super(实参表)写构造函数

e.g:

package com.xiyou.weijie.chap5;

public class Base {
    protected int a;

    public Base(int a) {
        this.a = a;
        System.out.println("Base有参构造");
    }

}

package com.xiyou.weijie.chap5;

public class Child extends Base{

	private int b;
	public Child()
	{
		super(14);//如果这里不写,报错
		System.out.println("Child无参构造");
	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		
		Child c=new Child();
	}

}

3.super关键字其他使用

a.调用父类同名被隐藏的成员变量

   方式:  super.变量名

b.调用父类同名被覆盖的成员方法

    方式:super.方法名()

e.g:

package com.xiyou.weijie.chap5;

public class Base {
	protected int a;

	public Base(int a) {
		this.a = a;
		System.out.println("Base有参构造");
	}
	
	public void showBase()
	{
		System.out.println("Base.showBase()");
	}
}

package com.xiyou.weijie.chap5;

public class Child extends Base{

	private int a;
	public Child(int a)
	{
		super(14);//如果这里不写,报错
		this.a=a;
		System.out.println("Child无参构造");
	}
	public void showBase()
	{
		System.out.println("super.a:"+super.a);
	}
	public void showChild()
	{
		System.out.println("a:"+a);
	}
	
	public void show()
	{
		super.showBase();
	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		
		Child c=new Child(10);
		c.showBase();
		c.showChild();
		c.show();
	}

}





发布了31 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weijie_home/article/details/49451215