Java基础 super关键字和this关键字

鳄鱼君

发表文章数:642

热门标签

, , ,

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Java » Java基础 super关键字和this关键字

this能出现在实例方法中和构造方法中,this语法是:“this.”“this()”,this不能使用在静态方法中,this在大部分情况下可以省略,但是在区分局部变量和实例变量的时候不能省略,例如:

public void doSome(String name){
    this.name = name;
}

this()只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中的其它的构造方法,目的是代码复用


super能出现在实例方法中和构造方法中,super语法是:“super.”“super()”,super不能使用在静态方法中,this在大部分情况下可以省略,但是在区分局部变量和实例变量的时候不能省略

super()只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中的其它的构造方法,目的是代码复用

public class Test{
	public static void main(String[] args){
		// 创建子类对象
		new B();
		/*A类的无参数构造方法
		B类的无参数构造方法*/
	}
}

class A{
	public A(){
		System.out.println("A类的无参数构造方法");
	}
}
class B extends A {
        super(); //默认存在
	public B(){
		System.out.println("B类的无参数构造方法");
	}
}

一个类如果没有手动提供任何构造方法,系统会默认提供一个无参数的构造方法
一个类如果手动提供了一个构造方法,那么无参数构造系统不再提供
当一个构造方法第一行,既没有this(),又没有super()的话,默认会有一个super(),表示必须保证父类的无参数构造方法是存在的

public class Test{
	public static void main(String[] args){
		new B();
		/*A类的有参数参数构造方法
		B类的无参数构造方法*/
	}
}

class A{
	public A(){
		System.out.println("A类的无参数参数构造方法");
	}
	public A(int i){
		System.out.println("A类的有参数参数构造方法");
	}
}
class B extends A {
	
	public B(){
		super(1);
		System.out.println("B类的无参数构造方法");
	}
}

this()和super()不能共存,它们都是只能出现在构造方法的第一行

在java语言中,不管是new什么对象,最后老祖宗的Object类的无参数构造方法一定会执行,Object类的无参数构造方法处于栈顶部,所以会最先输出

public class Test{
	public static void main(String[] args){
		B b = new B("鳄鱼君");
		b.doSome();
	}
}
class A{
	String name;
	public A(){}
	public A(String name){
		this.name =  name;
	}
}

class B extends A{
	public B(){}
	public B(String name){
		super(name);
		
	}
	public void doSome(){
		// this表示当前对象
		System.out.println(this.name + "在干什么事");
		// super表示的是当前对象的父类型特征,super是this指向的呢个对象中的一块空间
		System.out.println(super.name + "在干什么事");
		// 默认是this.name
		System.out.println(name + "在干什么事");
	}
}

this.和super.大部分情况下都可以省略,但是如果父中有,子中也有,想在子中访问父的特征,super.不能省略

public class Test{
	public static void main(String[] args){
		B b = new B("鳄鱼君");
		b.doSome();
	}
}
class A{
	String name;
	public A(){}
	public A(String name){
		this.name =  name;
	}
}

class B extends A{
	// 假设子类也有一个同名属性
	String name;
	public B(){}
	public B(String name){
		super(name);
		// this.name = null;
	}
	public void doSome(){
		// this表示当前对象
		System.out.println(this.name + "在干什么事");//null
		// super表示的是当前对象的父类型特征,super是this指向的呢个对象中的一块空间
		System.out.println(super.name + "在干什么事");
		// 默认是this.name
		System.out.println(name + "在干什么事");//null
	}
}

super不是引用,super也不保存内存地址,super也不指向任何对象,super只是代表当前对象内部的呢一块父类型的特征,所以不能单独使用super:

public class Test{
	public void doSome(){
		// 输出当前对象的内存空间
		System.out.println(this);
		// 编译报错
		System.out.println(super);
	}
	public static void main(String[] args){
		Test b = new Test();
		b.doSome();
	}
}

this和super不能使用在静态方法中!

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Java基础 super关键字和this关键字》 发布于2020-08-10

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

3 + 9 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册