java中: this(空/有参)和super(空/有参)的区别以及使用时的注意事项

本文详细解析了this和super关键字在Java构造方法中的使用规则,包括它们如何分别用于调用本类和父类的构造方法,并通过具体代码示例展示了调用过程及注意事项。

this(空/有参)用于本类构造方法的调用,而super(空/有参)则用于在子类构造方法对父类构造方法的调用

子类的每个构造方法第一行默认都会隐式的调用super()父类无参构造函数

下面上代码来解释

1.
/**
父类


**/
class Fu
{
public Fu()
{
System.out.println("Fu 空参构造");
}


public Fu(int num)
{
System.out.println("Fu 有参构造 "+num);
}
}


/**
子类
**/


class Zi extends Fu
{
public Zi()
{

System.out.println("Zi 空参构造");
}


public Zi(int num)
{
System.out.println("Zi 有参构造 "+num);
}
}


class ExtendsDemo 
{
public static void main(String[] args) 
{
Zi zi = new Zi(1);
}
}

打印结果如下图1.png:


从而印证了在

public Zi(int num)
{
//super( );此构造的第一行隐式调用了此代码,也可以显示的调用super( )
System.out.println("Zi 有参构造 "+num);
}

当然我们也可以显示的调用我们想调用的父类的构造方法,直接在子类构造方法的第一行显示调用super(参数)即可,而此时,默认的父类无参构造super(),将不会再调用.

除非显示调用的是super( )那么父类的无参构造自然就又调用了,等同于不写的时候,隐式调用父类无参构造

---------------------------------------------------------------------------------------------------------------------------------

2.再看,如果将代码做如下修改:


/**
父类


**/
class Fu
{
public Fu()
{
System.out.println("Fu 空参构造");
}


public Fu(int num)
{
System.out.println("Fu 有参构造 "+num);
}
}


/**
子类
**/


class Zi extends Fu
{
public Zi()
{
super(1);
this(1);


System.out.println("Zi 空参构造");
}


public Zi(int num)
{

System.out.println("Zi 有参构造 "+num);
}
}


class ExtendsDemo 
{
public static void main(String[] args) 
{
Zi zi = new Zi();
}
}

在子类无参构造里又调用了super(1); 和 this(1);且都在第一行,当编译的时候报出了如下错误:如图2.png


说this()语句要放在构造函数的第一行,那么让this(1);和super(1); 互换顺序呢?编译如下图3.png


由此可得到结论,this(空/有参),super(空/有参)都必须放在构造函数的第一行,所以不可同时在构造里显示的调用两者








<think>好的,我现在需要回答用户关于Javasuperthis关键字的用法及区别的问题。首先,我得回忆一下相关的知识,并考用户提供的引用内容来确保准确性。 根据引用内容,用户已经给出了一些示例解释。比如,引用[2]提到this用于本类,super用于父类,而引用[4]中的代码展示了如何通过super调用父类构造方法。我需要把这些信息整理成一个结构清晰的回答。 首先,应该分清楚thisthis()supersuper()区别。引用[2]指出this()调用本类的其他构造方法,而super()调用父类的构造方法,并且必须放在构造方法的第一行。例如,在Chinese类的构造方法中,super()super(name)使用。 然后,关于this.super.的区别,引用[3]中的例子显示,当子类父类有同名变量或方法,可以用super.来访问父类的成员,而this.访问当前类的。比如,City类中的super.value()调用了父类的方法,而namesuper.name分别访问子类父类的变量。 接下来,要组织回答的结构。可能需要分点说明,比如用法对比、区别总结、使用场景注意事项。每个部分需要结合引用中的例子,比如引用[4]中的构造方法调用顺序,以及引用[3]中的成员访问。 还需要注意用户提到的“系统级指令”,比如使用正确的LaTeX格式,但这个问题不涉及数学公式,所以可能不需要。但生成的相关问题要符合用户的要求,比如关于性能优化、应用场景等,但这里需要针对superthis生成相关问题,比如内存影响、常见错误等。 最后,检查是否有遗漏的点,比如thissuper在静态上下文中的使用限制,或者是否可以在普通方法中使用super()等。根据引用[2],super()this()只能在构造方法中使用,并且是第一条语句,这点需要强调。 总结起来,回答的结构应该是先对比用法,再分点说明区别,然后注意事项,最后相关问题。需要确保每个部分都有引用中的例子支持,并且语言清晰易懂。</think>### Javasuperthis关键字的用法及区别解析 #### 一、核心用法对比 1. **this关键字的用法** - **访问本类成员**:`this.成员变量`或`this.方法()`用于明确调用当前类的属性方法,尤其在存在同名局部变量 示例:`this.name = name`(当构造方法数与成员变量同名)[^3] - **调用本类构造方法**:`this()`用于在构造方法中调用本类的其他构造方法,必须作为**第一条语句** 示例:`Chinese(String name, int age) { this(name); ... }`[^4] 2. **super关键字的用法** - **访问父类成员**:`super.成员变量`或`super.方法()`用于调用父类被覆盖的属性方法 示例:`super.run()`(调用父类Animal的run方法)[^1] - **调用父类构造方法**:`super()`或`super()`用于在子类构造方法中调用父类构造方法,必须作为**第一条语句** 示例:`public Bird() { super(); ... }`[^1] #### 二、主要区别总结 | 特性 | this | super | |---------------------|-------------------------------|-------------------------------| | **作用对象** | 当前类 | 父类 | | **构造方法调用** | `this()`调用本类其他构造方法 | `super()`调用父类构造方法 | | **成员访问范围** | 可访问本类所有属性方法 | 仅访问父类非私有属性方法 | | **静态上下文中** | 不可用(因依赖实例) | 不可用(与this同理) | #### 三、典型使用场景 1. **方法覆盖的父类调用** 当子类重写父类方法但仍需复用父类逻辑: ```java @Override public void run() { super.run(); // 先执行父类方法 System.out.println("扩展子类行为"); } ``` 输出结果会先显示父类的`run()`内容,再显示子类新增内容[^1][^3]。 2. **构造方法链式调用** 通过`this()`实现代码复用: ```java Chinese(String name, int age) { this(name); // 先调用Chinese(String name) System.out.println("年龄:" + age); } ``` 通过`super()`确保父类初始化: ```java public Bird() { super(); // 必须显式调用父类无构造方法(若父类没有默认构造方法会报错) System.out.println("鸟类初始化"); } ```[^4] #### 四、注意事项 1. **调用顺序强制要求** `this()``super()`在构造方法中必须作为第一条语句,以下代码会编译错误: ```java public Chinese() { System.out.println("初始化前操作"); // ❌ super(); // 必须放在第一行 } ``` 2. **父类构造方法的隐式调用** 如果子类构造方法没有显式调用`super()`或`this()`,编译器会自动添加`super()`(要求父类必须有无构造方法)[^2][^4]。 3. **成员访问的限制** `super`无法访问父类的private成员: ```java class Parent { private int id; } class Child extends Parent { void print() { System.out.println(super.id); // ❌ 编译错误 } } ``` #### 五、内存视角下的区别 - **`this`指向当前实例对象**,在堆内存中代表对象自身 - **`super`是访问父类成员的语法标记**,不创建独立对象,而是基于继承关系访问父类数据 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值