java中this和super相同和不同分析

this指向当前实例,super指向父类视图;二者均为非静态上下文中的隐式引用,可调用构造方法且须为首句;this用于访问本类成员或解决命名冲突,super用于调用父类构造、方法或访问被遮蔽的父类成员。

thissuper 都是 Java 中的引用关键字,用于在类内部明确指代特定对象或成员,但它们指向的对象不同、使用场景不同、作用范围也不同。理解它们的异同,对正确编写构造器、重写方法、访问成员变量至关重要。

相同点:都是隐式引用,都只能在非静态上下文中使用

• 两者都不是对象,而是指向某个对象的引用(this 指向当前实例,super 指向直接父类实例)
• 都只能出现在实例方法、构造方法或实例初始化块中,不能在 static 方法或 static 块中使用
• 都可以用来调用构造方法(this(...)super(...)),且必须作为构造方法的第一条语句

不同点一:所指对象不同

this 指向当前对象本身(即正在执行代码的那个对象实例)
super 指向当前对象中“继承自父类的部分”,即当前对象的父类视图,用于访问被子类隐藏或覆盖的父类成员
例如:
// 父类
class Animal { String name = "animal"; }
// 子类
class Dog extends Animal {
  String name = "dog";
  void print() {
    System.out.println(this.name); // 输出 "dog"
    System.out.println(super.name); // 输出 "animal"
  }
}

不同点二:可访问的成员范围不同

this 可以访问:
• 当前类的实例变量(包括继承来的,但优先找本类定义的)
• 当前类的实例方法(含重写后的方法)
• 当前类的其他构造方法(通过 this(...)

super 可以访问:
• 直接父类中 publicprotected 的实例变量(即使子类有同名变量)
• 直接父类

中可访问的实例方法(常用于调用被重写的方法)
• 直接父类的构造方法(通过 super(...)),且是唯一能显式调用父类构造的方式
注意:super 不能访问父类的 private 成员,也不能访问父类的静态成员(要用类名访问)

不同点三:典型使用场景差异明显

this 的常见用途:
• 区分形参和成员变量名冲突(如 this.name = name;
• 在构造方法中调用本类其他构造方法(构造器链)
• 将当前对象作为参数传递给其他方法或返回当前对象(如链式调用)

super 的常见用途:
• 在子类构造方法中显式调用父类构造方法(尤其父类无默认构造时)
• 在重写方法中调用父类同名方法(如 super.toString()
• 访问被子类变量遮蔽(shadowing)的父类同名变量

基本上就这些。this 和 super 不是对等概念,也不是“互为反义词”;它们协同工作,共同支撑 Java 的面向对象机制——this 聚焦于“我是什么”,super 聚焦于“我从哪来”。用错位置(比如在 static 中用、或在构造器非首行调用)会直接编译失败,所以务必注意语法约束。