面向对象之super关键字

本文详细探讨了Java中的super关键字,区分了this与super的关键区别。super用于访问父类的成员变量和方法,包括构造方法。它在子类构造过程中用于调用父类的构造方法,帮助初始化继承的成员。文章指出,创建子类对象并不意味着创建了父类对象,而是通过super调用父类构造方法来完成初始化。同时,super必须位于构造方法的第一行,并且在静态上下文中不能使用this和super。
摘要由CSDN通过智能技术生成

super关键字

首先来了解下this和super的区别
this可以理解为当前对象,谁调用this就代指那个调用者对象,
每次创建一个对象,默认都会创建一个this变量指向同一个堆区空间
super本质是父类存储空间的标识,但是你可以理解为父类对象,
那么同样可以使用super这个关键字来访问父类的成员

访问成员
成员变量

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

成员方法

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

构造方法
this(参数列表)
super(参数列表)

注意:
1.任何一个类的无参或者带参构造方法的第一句都默认省略 super();
2.任何一个类都直接或者间接继承自Object类
3.为什么设计Object类,满足了万事万物皆对象的原则
访问根类Object的无参构造方法的意义何在? - 加载Object类中静态成员和静态代码块
4.创建一个子类对象默认会去调用父类的构造方法,那么有没有在创建子类对象的同时也创建了父类对象呢?
没有创建父类对象,本质就相当于访问了一个普通方法,创建对象开启空间需要new关键字
5.super访问父类带参构造方法的意义? – 帮助子类初始化父类继承下来的成员,简化编程
6.静态环境/静态上下文(static修饰的方法),不能够出现this和super
7.super必须出现在构造方法的第一句
8.this和super不能够共存

举例1代码如下:

public class SuperDemo01 {
	public static void main(String[] args) {
//		Zi zi = new Zi();
//		Zi zi = new Zi("张三", 18, "北京西路");
		Fu fu = new Fu();
		System.out.println(fu.name + "|" + fu.age);
		/*
		 * 我是父类带参构造方法
		 * 我是父类无参构造方法
		 * "王五" 20
		 */
	}
}

class Fu extends Object {
	public String name;
	public int age;
	private double weight;
	
	public Fu() {
		super();
//		this("王五", 20);
		System.out.println("我是父类无参构造方法");
	}
	
	public Fu(String name, int age) {
		System.out.println("我是父类带参构造方法");
		this.name = name;
		this.age = age;
	}
	
	public void fuMethod() {
		
	}
	
	public static void staticMethod() {
	}
}

class Zi extends Fu {
	
	private String address;
	
	public Zi() {
		super();
		System.out.println("我是子类无参构造方法");
	}
	
	public Zi(String name, int age, String address) {
//		super();
//		System.out.println("我是子类带参构造方法");
//		this.name = name;
//		this.age = age;
		super(name, age);
		this.address = address;
	}
	
	public void ziMethod() {
		System.out.println(super.name);
		this.fuMethod();
		super.fuMethod();
	}
	
}

举例2代码如下:

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

class Father{
	
	public int num = 10;
	
	public void method() {
		int num = 20;
		System.out.println(num);
	}
}

class Son extends Father{
	
	int num = 30;
	
	public void show() {
		int num = 40;
		// 我想要输出40?
		System.out.println(num);
		// 我想要输出30?
		System.out.println(this.num);
		// 我想要输出20,怎么做?
		this.method();
		super.method();
		// 我想要输出10怎么做?
		System.out.println(super.num);
	}
	
}

举例3代码如下:(此案例有错误,编译错误)

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

class Fathers{
	
	public int num = 10;
	//下面这个要加上
	//public Fathers() {
		//父类默认也有无参构造方法,但是没有写,下面的有参构造方法覆盖了无参构造方法,所以当子类的super()方法访问父类时,父类只有有参构造方法,所以编译就报错,需加上父类的无参构造方法
	//}
	public Fathers(int num){
		this.num = num;
	}
}

class Sons extends Fathers{
	
	int num = 20;
	//public Son(){
	//super();	//子类的默认无参构造方法,默认有一个super()方法
	//}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值