无法访问的语句java_Java语言中this关键字实际运用

79b62bbe49b7be7382d9208cd7539d16.png

158aaf86d0f729bc0af3c0e386c5bf48.png

this关键字

在上一节案例中使用变量表示年龄时,构造方法中使用的参数是a,成员变量使用的是age,虽然在语法上没有任何问题,但这样的程序可读性很差。这时可以将Person类中表示年龄的变量进行统一命名,例如都声明为age,但是这样做又会导致成员变量和局部变量的名称冲突,在方法中将无法访问成员变量age。

为了解决这个问题,Java中提供了一个关键字this来指代当前对象,用于在方法中访问对象的其他成员。接下来将为读者详细地讲解this关键字在程序中的三种常见用法,具体如下:

1.通过this关键字调用成员变量,解决与局部变量名称冲突问题。具体示例代码如下:

class Person {
int age; // 成员变量age
public Person(int age) { // 局部变量age
this.age = age; // 将局部变量age的值赋给成员变量age
}
}

在上面的代码中,构造方法的参数被定义为age,它是一个局部变量,在类中还定义了一个成员变量,名称也是age。在构造方法中如果使用“age”,则是访问局部变量,但如果使用“this.age”则是访问成员变量。

2.通过this关键字调用成员方法,具体示例代码如下:

class Person {
public void openMouth() {
...
}
public void speak() {
this.openMouth();
}
}

在上面的speak()方法中,使用this关键字调用了openMouth()方法。需要注意的是,此处的this关键字可以省略不写,也就是说上面的代码中,写成“this.openMouth()”和“openMouth()”效果是完全一样的。

3.通过this关键字调用构造方法。构造方法是在实例化对象时被Java虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法,但可以在一个构造方法中使用“this([参数1,参数2…])”的形式来调用其他的构造方法。

接下来通过一个案例来演示这种形式构造方法的调用,如文件1所示。

文件1 Example11.java

1 class Person {
2 public Person() {
3 System.out.println("无参的构造方法被调用了...");
4 }
5 public Person(int age) {
6 this(); // 调用无参的构造方法
7 System.out.println("有参的构造方法被调用了...");
8 }
9 }
10 public class Example11 {
11 public static void main(String[] args) {
12 Person p = new Person(18); // 实例化 Person 对象
13 }
14 }

运行结果如图1所示。

d84840695ef1f690ee8ef850ef5bd095.png

图1 运行结果

在文件1中,第12行代码在实例化Person对象时,调用了有参的构造方法,在有参构造方法中又通过this()调用了无参的构造方法,因此运行结果中显示两个构造方法都被调用了。

在使用this调用类的构造方法时,应注意以下几点:

①只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用。

②在构造方法中,使用this调用构造方法的语句必须是该方法的第一条执行语句,且只能出现一次。

下面的写法是错误的:

public Person(int age) {
System.out.println("有参的构造方法被调用了...");
this(); // 调用无参的构造方法。
}

在上述代码中,由于调用语句this()不是构造方法的第一条执行语句,所以Eclipse在编译时会报出“Constructor call must be the first statement in a constructor(调用构造函数必须是构造函数中的第一条语句)”的错误提示信息。

③不能在一个类的两个构造方法中使用this互相调用。下面的写法是错误的:

class Person {
public Person() {
this(18); // 调用有参的构造方法
System.out.println("无参的构造方法被调用了...");
}
public Person(int age) {
this(); // 调用无参的构造方法
System.out.println("有参的构造方法被调用了...")
}
}

在上述代码中,无参构造方法和有参构造方法分别使用了this关键字对方法进行了相互调用,此时在编译时,将会报出“Recursive constructor invocation Person()(递归调用构造函数Person())”的错误提示信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值