面向对象[基础] | 如何正确的使用this?

本文通过实例解析了Java中this关键字的三种常见用法:指代当前对象、作为参数传递以及在匿名类和内部类中的应用,并强调了this不能在静态上下文中使用的限制。同时,分析了给定的代码选择题,指出正确选项为(a)和(b),并解释了错误选项(c)和(d)的原因。
摘要由CSDN通过智能技术生成

如下哪些编程语句可以插入代码指定位置,且不会出现编译错误?

package com.java.test;
public class ThisUse {
  int plane;
  static int car;
  public void doSomething(){
    int i;
    //插入语句
  }  
  
}

选择正确的选项:


( a ) i=this.plane;
( b ) i=this.car;
( c ) this=new ThisUse();
( d ) this.car=plane;

解析:

Java中,this用法大致分为下面3种:

1.this指代当前对象,在一个类中要明确指出使用该类对象的变量或函数。

package com.java.test;
public class TestOne {
  String str = "hello";
  public void TestOne(String str){
    System.out.println("str=" + str);
    System.out.println("1.this.str=" + this.str);
    this.str = str;
    System.out.println("2.this.str=" + this.str);
  }
  
    public static void main(String [] args){
      TestOne t = new TestOne("hello world!");
    }  
  
}

运行结果:

str = helloworld ! 
1- > this . str= hello 
2- > this . str= helloworld !

构造函数TestOne中,参数str与类TestOne的变量str同名,如果直接对str进行操作,就会改变变量str。若要对类TestOne的变量str进行操作,就应该使用this进行引用。运行结果的第1行就是直接对参数str进行打印结果,后面两行分别是对对象TestOne的变量str进行操作前后的打印结果。

2.把this作为参数传递,当一个类要把自己作为参数传递给别的对象时,也可以用this。

package com.java.test;
public class TestOne {
  public TestOne(){
    new TestTwo(this).print();
  }
  public void print(){
    System.out.println("hello TestOne");
  }
  public class TestTwo {
    TestOne to;
  public TestTwo(TestOne to){
     this.to = to;
    }
  public void print(){
      to.print();
      System.out.println("hello TestTwo");
    }
  
  }
  
}

运行结果: 

hello TestOnehello TestTwo

在这个例子中,对象TestOne的构造函数中,用new TestTwo(this)把对象TestOne自己作为参数传递给了对象TestTwo的构造函数。

3.注意匿名类和内部类中的this,有时候,会用到一些匿名类和内部类。当在匿名类或内部类中用this时,这个this则指的的是匿名类或内部类本身。这时假如要使用外部类的方法和变量的话,则应该加上外部类的类名。

package com.java.test;
public class TestThree {
  int i = 1;
  public TestThree(){
   Thread t = new Thread(){
     public void run(){
       for(;;){
         TestThree.this.run();
         try{
           sleep(1000);
         }catch(InterruptedException e){
         }
       }
     }
   
   }
   thread.start();
  }  
  public void run(){
    System.out.println("i = " + i);
    i++;
  }
  public static void main(String [] args) throw Exception{
    new TestThree();
  }
}

 

在上面这个例子中, thread是一个匿名类对象,它的run()函数里用到了外部类的run()函数。这时由于函数同名,直接调用就不行了。这时有两种方法,第1种方法就是把外部的run函数换一个名字,但这种办法对于一个开发到中途的项目来说是不可取的。第2种方法就可以参考本例用外部类的类名加上this引用,来说明要调用的是外部类的方法run()方法。

注意:this引用不能用于静态上下文中,因为在任何对象的上下文中都不会执行静态代码。

该面试题中,非静态方法有一个隐含的this对象引用,但是该引用是不能被改变的所以(c)是错误的;(d)也是错误的,因为this是表示对象引用,不能指向局部变量。

参考答案:(a)、(b)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值