如下哪些编程语句可以插入代码指定位置,且不会出现编译错误?
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 TestOne
hello 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)。