现在的位置: 首页 > 综合 > 正文

Java super 那些事儿

2012年09月23日 ⁄ 综合 ⁄ 共 1067字 ⁄ 字号 评论关闭

super是this的父辈。从面相对象的角度说,这两个概念是很好理解的。

子类从父类继承过来,父类的protected及以上的属性和方法在子类中是天生就具有的。那么,为什么还要有super这个关键字?

第一、看父类的构造

子类构造时要先调用父类的默认构造函数的,这与C++的构造属性一致。当父类有多个构造函数时,你需要指定调用哪个。这是就需要使用super(arg1,arg2...)。

需要注意的是,在子类的构造函数中调用基类的构造函数时,必须要把super写作最前面,否则报错。

第二,在子类覆盖父类的一些方法中再调用父类的此方法。大家都知道,在子类中覆盖父类的一些方法是面向对象中多态的一种方式,而因为其他种种原因,需要在此方法中调用父类的此方法,用以区分,此时需要使用super来完成。

有了上一篇文章Java this 那些事儿的基础,我们在这里新写一个班干部类来继承上文中的Student类,然后看看super的具体使用方法:

public class ClassLeader extends Student
{
	private String duty;
	public ClassLeader()
	{
		duty = "class monitor";
	}
	public ClassLeader(String duty,String name,String college)
	{
		super(name,college);
		this.duty = duty;
	}

	public void print()
	{
		super.print();
		System.out.println("duty is " + duty);
	}
	
    public static void main(String[] args)  
    {  
        ClassLeader leader = new ClassLeader("life","linc","shenyang");
	leader.print();
    }  
	
}

将两个类文件放在同一个目录,编译并运行:

D:\workspace\Java\project261\super>javac -d . *java

D:\workspace\Java\project261\super>java ClassLeader
construct
this student name is linc
this student name is linc college is shenyang
name is: linc age is: 20 college is: shenyang
duty is life

看看在其他语言中是怎样来处理的:

C#中提供了base关键字来完成super相似的功能,C++直接用基类的名字来调用。

抱歉!评论已关闭.