Java关键字之super详解

  在学习super关键字之前,我们需要注意的一点就是,super关键字的学习需要和this关键字类比起来学,它们之间有许多共同点,下面我们就来进入正式的讲解吧。
  我们还是以一段代码开篇讲解吧:

class Test{
	public Test(){
		System.out.println("父类的构造方法被执行!");
	}
}
public class Test02 extends Test{
	public Test02(){
		System.out.println("子类的构造方法被执行!");
	}
	public static void main(String[] args){
		Test02 test02 = new Test02();
	}
}

运行结果如图所示:

  由图可知,并没有某个语句来调用父类的构造方法,但是由运行结果可以得到,父类的构造方法一定是执行了,那么由Java语言的“尿性”可以知道,肯定又有某个地方的代码语句被隐藏掉了。在查阅了相关资料之后,这个疑问就可以解决掉了。当一个构造方法的第一行既没有this()又没有super()的话,默认会有一个super();语句,表示通过当前子类的构造方法去调用父类的无参构造方法。也就是说,上面那段代码写具体的话应该是这样的:

class Test{
	public Test(){
	        super();
			System.out.println("父类的构造方法被执行!");
	}
}
public class Test02 extends Test{
	public Test02(){
		super();
		System.out.println("子类的构造方法被执行!");
	}
	public static void main(String[] args){
		Test02 test02 = new Test02();
	}
}

关于super关键字我们需要掌握的内容是:

  1. super是一个关键字,并不是一个引用,也不指向任何对象;
  2. super只代表当前对象内部的那一块父类型特征;
  3. super关键字可以出现在实例方法和构造方法当中;
  4. super的语法有:super.super()
  5. super.在大部分情况下是可以省略的,如果父类和子类当中有同名属性,想在子类当中访问父类的属性,这种情况下不能省略;
  6. super()只能出现在构造方法非注释语句的第一行;
  7. super()通过当前的构造方法去调用父类中的构造方法,目的是在创建子类对象的时候,先初始化父类型特征。

  super()表示通过子类的构造方法调用父类的构造方法,我们可以模拟一种现实世界的场景来理解它,也即要想有儿子,必须要先有父亲。当一个构造方法的第一行既没有this();又没有super();的话,默认有一个super();表示通过当前子类的构造方法调用父类的无参构造方法,所以说必须保证父类的无参数构造方法是存在的。
Tips:this()和super()不能共存,它们都是只能出现在构造方法第一行,无论怎样折腾,父类的无参构造方法是一定会执行的。
由此我们可以总结出一般性的结论:在Java语言当中,不管是new什么对象,最后Object类中的无参构造方法是一定会执行的。
Java是怎么来区分子类和父类的同名属性???
  this.name表示当前对象的name属性;
super.name表示当前对象的父类型特征中的name属性。


本期博文你需要思考的问题是:
分析以下代码的运行结果:

class A{
	public A(){
		System.out.println("1");
	}
}
class B extends A{
	public B(){
		System.out.println("2");
	}
	public B(String name){
		System.out.println("3");
	}
}
class C extends B{
	public C(){
		this("张三");
		System.out.println("4");
	}
	public C(String name){
		this(name,20);
		System.out.println("5");
	}
	public C(String name,int age){
		super(name);
		System.out.println("6");
	}
}
public class Test02{
	public static void main(String[] args){
		C c = new C();
	}
}

Tips:解答如下
主函数当中通过调用C类的无参构造方法new一个C类对象,后面根据每个构造方法当中的语句来执行即可,需要注意的一个陷阱就是B类的有参构造方法的第一行默认省略了super();语句。
执行结果为:
1
3
6
5
4


以上内容均为个人学习的一点心得,其中的知识点若有错误请留言提醒,若有侵权内容提醒马上删除。

猜你喜欢

转载自blog.csdn.net/pf6668/article/details/108249631
今日推荐