super与this

1.**super的两种用法**

在构造方法中,可以使用this或super调用其他的构造方法
super()
作用:调用父类的构造器
只能出现在子类的构造器中,且必须是第一行
super()中的参数,决定了调用父类哪个构造器
如果子类构造器中没有出现super,那么编译器会默认加上super(),即调用父类的空构造器,如果父类没有空构造器,编译器提示错误。

name = "子类名字";
        super.name = "父类的名字";
        System.out.println(name);//使用super.name显示调用父类的属性
        //如果不加super,那么打印得失子类的name属性

**this三种用法**

**方法一定有小括号。没有参数小括号不能省略。**

![*](file:///C:\Users\ADMINI~1\AppData\Local\Temp\art190F.tmp)this()

![*](file:///C:\Users\ADMINI~1\AppData\Local\Temp\art1910.tmp)作用:调用本类的构造器

![*](file:///C:\Users\ADMINI~1\AppData\Local\Temp\art1911.tmp)只能写在构造器的第一行、

![*](file:///C:\Users\ADMINI~1\AppData\Local\Temp\art4282.tmp)在同一个构造器中super()和this()不能同时出现

**this第二个用法**

当一个成员方法中(非静态方法中),局部变量和成员变量同名的时候,局部变量会屏蔽成员变量,我们需要使用this.成员变量     显示的调用成员变量。

public class Student{

private int a;//成员变量a

public void setA(int a)//这个int a是局部变量和成员变量a同名,在方法setA中,局部变量a会屏蔽成员变量a

{

a = a;//此时两个a都是局部变量。

}

}

public void setName(String name) {

        this.name = name;
    }
java编程规范固定,成员方法引用成员变量,一定加this.name

**this的第三种用法,是this代表当前对象的引用,用来做实参**
 

<think>我们正在讨论Java中的superthis关键字。根据引用内容,我们可以总结如下: 1. this关键字指向当前对象的实例,主要用于: - 区分成员变量和局部变量(当两者同名时) - 调用当前类的其他构造器(使用this()) - 返回当前对象(在方法中返回this) 2. super关键字指向父类对象,主要用于: - 调用父类的构造器(使用super(),必须放在子类构造器的第一行) - 调用父类的方法(当子类重写了父类方法时,可以通过super调用父类版本) - 访问父类的成员变量(需符合访问权限,不能访问父类的私有成员) 3. 共同点和区别: - 两者都不能在静态上下文中使用(因为静态方法没有实例) - this()和super()在构造器中都必须放在第一行,因此一个构造器中不能同时使用this()和super() - 通过this可以访问当前类从父类继承的成员,而super则直接访问父类的成员(不包括父类私有成员) 我们将按照以下结构组织回答: 1. this关键字的用途和示例 2. super关键字的用途和示例 3. 两者的对比表格 4. 常见问题和使用注意事项 注意:引用标记[^1][^2][^3][^4][^5]需要正确对应到引用内容。</think>### Java中`super``this`关键字的区别作用 #### 一、核心区别 | **特性** | **`this` 关键字** | **`super` 关键字** | |------------------|--------------------------------|--------------------------------| | **指向对象** | 当前对象实例 | 父类对象 | | **主要作用** | 访问当前类的成员 | 访问父类的成员 | | **构造器调用** | `this()`调用本类其他构造器 | `super()`调用父类构造器 | | **访问权限** | 可访问本类所有成员(含继承) | 不可访问父类私有成员[^5] | | **静态方法** | 禁止使用(无实例上下文) | 禁止使用(同理)[^5] | | **典型场景** | 变量名冲突、链式调用、构造器重载 | 继承中调用父类方法或构造器 | --- #### 二、`this`关键字的用途示例 1. **解决变量名冲突**(成员变量 vs 局部变量) ```java public class Student { private String name; public void setName(String name) { this.name = name; // this.name指成员变量,name是局部参数 } } ``` 2. **调用本类其他构造器**(必须放在构造器第一行) ```java public class Rectangle { int width, height; public Rectangle() { this(10, 10); // 调用带参构造器 } public Rectangle(int w, int h) { width = w; height = h; } } ``` 3. **链式调用方法** ```java public class Builder { private int count; public Builder setCount(int count) { this.count = count; return this; // 返回当前对象 } } // 使用:new Builder().setCount(5).build(); ``` --- #### 三、`super`关键字的用途示例 1. **调用父类构造器**(必须放在子类构造器第一行) ```java public class Animal { public Animal(String type) { System.out.println("Animal: " + type); } } public class Cat extends Animal { public Cat() { super("Mammal"); // 调用父类构造器 System.out.println("Cat created"); } } ``` 2. **访问父类被重写的方法** ```java public class Parent { public void print() { System.out.println("Parent method"); } } public class Child extends Parent { @Override public void print() { super.print(); // 调用父类方法 System.out.println("Child method"); } } ``` 3. **访问父类成员变量** ```java public class Parent { protected String name = "Parent"; } public class Child extends Parent { private String name = "Child"; public void printNames() { System.out.println(super.name); // 输出"Parent" System.out.println(this.name); // 输出"Child" } } ``` --- #### 四、关键规则注意事项 1. **构造器调用限制** - `this()`和`super()`不能共存于同一构造器(均需第一行)[^3] - 若未显式调用`super()`,编译器自动添加父类无参构造器 2. **访问权限限制** - `super`无法直接访问父类私有成员(需通过父类公有方法)[^5] - `this`可访问从父类继承的公有/受保护成员 3. **静态上下文禁用** ```java public static void staticMethod() { // this.name = "error"; // 编译错误! // super.name = "error"; // 编译错误! } ``` --- #### 五、使用场景对比 | **场景** | **推荐关键字** | **原因** | |---------------------------|----------------|------------------------------| | 子类需扩展父类方法逻辑 | `super` | 先执行父类核心逻辑 | | 避免成员变量参数名冲突 | `this` | 明确指向当前对象成员 | | 实现链式调用 | `this` | 返回当前对象实例 | | 子类构造器需初始化父类状态 | `super` | 确保父类构造优先执行 | > **本质区别**: > - `this` 是**指向当前对象的指针** > - `super` 是**访问父类成员的语法关键字**[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值