java关键字2—this和super
java关键字2—this和super
- this关键字
- 访问当前对象的成员变量
- 调用当前对象的成员方法
- 补充
- super关键字
- 调用父类的构造方法
- 访问父类的成员方法
- 访问父类的成员字段
this关键字
在 Java 中,this是一个特殊的引用关键字,它指向当前对象,即当前正在执行方法的对象或正在创建的对象,哪个对象调用 this 那么 this 就代表谁。其核心作用是在类的内部明确引用当前对象的成员字段、方法,解决命名冲突,并简化对象操作。
访问当前对象的成员变量
this.属性名
一个方法当中的局部变量和成员变量名称相同,直接使用变量名会默认引用局部变量,程序需要在这个方法当中访问成员变量就必须使用this关键字,用来区分成员变量和方法当中的参数
当成员变量与局部变量(如方法参数)同名时,用 this 明确指代成员变量
在 main() 方法中,创建了两个对象 demo 和 demo1,数据类型均是 Demo,也就是一个 Demo 类创建了两个对象。当使用 new 关键字创建对象时,构造方法会被自动调用。
这里我们补充一下构造函数,构造函数是一个特殊的方法,它的方法名需要和类名相同。其中在构造函数体中的等号后边 name、age、sex 是局部变量,它的主要目的是在创建对象时初始化该对象的状态(即为其成员变量赋初始值)。
接着我们分析该代码,想给当前内容赋值本质上来说就是 demo.name,但是这个地方会产生报错,是因为这里 demo 是类,类不能直接调用对象里的内容,这里需要换成对象,我们使用 this。这是其实是为了做一个区分,让当前对象名去调用 name、age、sex,调用到之后再给它赋值,是为了方便和局部变量的 name、age、sex 做区分。如果不使用this,上述代码中name = name会被解释为 “局部变量赋值给自身”,成员变量不会被正确初始化。
调用当前对象的成员方法
this.方法名
用于在类的内部 让类中的一个方法来访问类中的另一个方法或者实例变量
但这种形式会有报错
我们需要注意:this 和 static 是永远不能出现在一起的,static 关键字是对类而言的,而 this 关键字是指当前对象,因此 staic 修饰的方法中不能使用 this;this不能单独使用,this必须后跟成员变量(this.name)、方法(this.method())或构造方法(this(…))。
补充
this作为当前对象的引用传递,简单说就是:在类的方法中,用this代表当前对象自己,然后把它当作参数传给其他方法,让其他方法可以直接操作这个对象。
public class Car {private String color;public void showColor() {// 将当前Car对象传递给工具类的方法CarTool.printColor(this); }// getter方法public String getColor() {return color;}
}// 工具类
class CarTool {// 接收Car对象并打印颜色public static void printColor(Car car) {System.out.println("颜色:" + car.getColor());}
}
public class Test {public static void main(String[] args) {Car myCar = new Car();// 给myCar的color属性赋值myCar.color = "蓝色"; // 调用myCar的showColor()方法myCar.showColor(); }
}
这里涉及到的是 Java 值传递问题,传递是值,但对于对象来说传递的不是对象本身,而是对象的地址值。this 指代的是当前调用该方法的 Car 对象实例,传给 printColor 方法的 car 参数时,car 会得到和 this 相同的引用值,因此 car 和 this 指向内存中同一个对象。这就是为什么 printColor 方法能通过 car 参数访问到 myCar 的 color 属性,因为它们指向同一个对象。
super关键字
在 Java 中 super 关键字是一个特殊的引用,主要用于访问父类的成员和调用父类的构造方法。它的核心作用是在子类中明确指定对父类成员的引用,尤其是当子类与父类存在同名成员或需要显式初始化父类时。
调用父类的构造方法
super(参数列表)
子类在初始化时,需要先完成父类的初始化,因为子类依赖父类的基础结构,super()用于在子类构造方法中显式调用父类的构造方法,语法为 super(参数列表)
规则与注意事项:
- super() 必须放在子类构造方法的第一行,否则编译报错,因为父类初始化必须先于子类;
- 如果子类构造方法中没有显式调用 super(),编译器会自动添加 super(),即调用父类的无参构造方法;
- 如果父类没有无参构造方法比如只定义了有参构造,子类必须显式调用super(参数),否则编译报错。
// 父类
class Parent {private String name;// 父类有参构造public Parent(String name) {this.name = name;}
}
// 子类
class Child extends Parent {private int age;// 子类构造方法必须显式调用父类的有参构造public Child(String name, int age) {super(name); // 调用父类的构造方法,必须在第一行this.age = age;}
}
访问父类的成员方法
super.方法名(参数)
当子类重写了父类的方法时,子类中默认调用的是重写后的方法。如果需要在子类中调用父类被重写的原方法,可以用 super.方法名(参数)
class Parent {public void sayHello() {System.out.println("Parent: Hello");}
}class Child extends Parent {@Overridepublic void sayHello() {super.sayHello(); // 调用父类的sayHello()System.out.println("Child: Hello");}
}
public class Test {public static void main(String[] args) {Child child = new Child();child.sayHello(); }
}
输出为:
Parent: Hello
Child: Hello
访问父类的成员字段
super.字段名
当子类与父类存在同名的字段时,子类隐藏了父类的字段,子类中默认访问的是自己的字段,如果需要访问父类的同名字段,可用 super.字段名
class Parent {String name = "Parent";
}class Child extends Parent {String name = "Child"; // 隐藏父类的name字段public void printNames() {System.out.println("子类name: " + name); // 访问子类自己的nameSystem.out.println("父类name: " + super.name); // 访问父类的name}
}public class Test {public static void main(String[] args) {Child child = new Child();child.printNames();}
}
输出为:
子类name: Child
父类name: Parent