super的详解

为什么需要学习super?

能够帮助子类 初始化 父类继承下来的成员,从而 简 化 代 码 \color{red}{简化代码}

super的定义:

与this概念区分

  • this代表当前对象,创建任何一个对象,都会创建一个this引用和该对象指向同一个堆区的空间, t h i s 就 是 一 个 地 址 \color{red}{this就是一个地址} this
  • super代表父类存储空间的标识,super可以通过这个标识访问父类的成员,super可以理解为父类对象,
  • t h i s 可 以 作 为 参 数 传 入 到 方 法 的 形 参 中 \color{red}{this可以作为参数传入到方法的形参中} this ,super不可以

super和this访问成员的特点:

成员变量

  •  	this.成员变量
    
  •  	super.成员变量
    

成员方法

  •  	this.成员方法
    
  •  	super.成员方法
    

构造方法

  •  	this(参数列表)    ----------------只能在构造方法中写
    
  •  	super(参数列表)
    

特点分析

  •   任何一个构造方法第一句都会先访问父类无参构造方法
    
  •  this super 访问构造方法必须出现第一句
    
  •  this 和 super 访问构造方法不能够共存
    
  •  super可以访问父类的成员(*************但不能访问private*****************)
    
  •  7.static上下文不能够出现this super(static加载好了,可能对象还没被创建)
    

1.为什么访问子类构造方法之前会访问父类构造方法?

访问父类无参构造方法导致所有的父类的静态成员和静态代码块被加载,最终根类Object类的注册方法也会被加载 帮 助 子 类 初 始 化 父 类 继 承 过 来 的 成 员 、 方 法 \color{red}{ 帮助子类初始化父类继承过来的成员、方法}

2.访问子类构造方法会访问父类构造方法,那么会不会创建子类对象的同时创建父类对象?

不会 使用super/this方法构造方法就相当于调用普通方法,需要创建对象访问构造方法必须结合 new

super相关面试题

输出10 20 30 40

 
public class SuperDemo02 {
	public static void main(String[] args) {
		Son son = new Son();
		son.show();
	}
}

class Father {
	int num = 30;
	
	public void show() {
		int num = 40;
		System.out.println(num);
	}
}

class Son extends Father {
	
	int num = 20;
	public void show() {
		int num = 10;
		// 希望打印结果是 10
		System.out.println(num);
		// 希望打印结果是 20
		System.out.println(this.num);
		// 希望打印结果是 30
		System.out.println(super.num);
		// 希望打印结果是 40
		super.show();
	}
	
}

另一个代码题

请问输出的值是多少?

public class SuperDemo03 {
	
	public static void main(String[] args) {
		Zi zi = new Zi();
		System.out.println(zi.num);
	}
}

class Fu {
	
	int num = 10;
	

	
	public Fu(int num) {
		this.num = num;
	}
}

class Zi extends Fu {
	int num = 20;
}

其实这段代码会报错,因为在ZI类实例化时会自动调用父类的无参构造方法,但是父类的无参构造没有了(Fu已经写了构造方法,会覆盖系统给Fu的无参构造)
此时没有无参构造,则报错!
解决方法:在Fu中添加无参构造
正常情况下是20

  • 31
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值