❶ java中this关键字用法
1. 当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量。(this是当前对象自己)如:public class Hello {String s = "Hello";public Hello(String s) {System.out.println("s = " + s);System.out.println("1 -> this.s = " + this.s);this.s = s;//把参数值赋给成员变量,成员变量的值改变System.out.println("2 -> this.s = " + this.s);}public static void main(String[] args) {Hello x = new Hello("HelloWorld!");System.out.println("s=" + x.s);//验证成员变量值的改变}} 结果为:s = HelloWorld!1 -> this.s = Hello2 -> this.s = HelloWorld!s=HelloWorld!在这个例子中,构造函数Hello中,参数s与类Hello的成员变量s同名,这时如果直接对s进行操作则是对参数s进行操作。若要对类Hello的成员变量s进行操作就应该用this进行引用。运行结果的第一行就是直接对构造函数中传递过来的参数s进行打印结果; 第二行是对成员变量s的打印;第三行是先对成员变量s赋传过来的参数s值后再打印,所以结果是HelloWorld!而第四行是主函数中直接打印类中的成员变量的值,也可以验证成员变量值的改变。
2.把自己当作参数传递时,也可以用this.(this作当前参数进行传递)class A {public A() {new B(this).print();// 调用B的方法}public void print() {System.out.println("HelloAA from A!");}}class B {A a;public B(A a) {this.a = a;}public void print() {a.print();//调用A的方法System.out.println("HelloAB from B!");}}public class HelloA {public static void main(String[] args) {A aaa = new A();aaa.print();B bbb = new B(aaa);bbb.print();}}结果为:HelloAA from A!HelloAB from B!HelloAA from A!HelloAA from A!HelloAB from B! 在这个例子中,对象A的构造函数中,用new B(this)把对象A自己作为参数传递给了对象B的构造函数。
3. 有时候,我们会用到一些内部类和匿名类,如事件处理。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。如:public class HelloB {int i = 1;public HelloB() {Thread thread = new Thread() {public void run() {for (int j=0;j<20;j++) {HelloB.this.run();//调用外部类的方法try {sleep(1000);} catch (InterruptedException ie) {}}}}; // 注意这里有分号thread.start();}public void run() {System.out.println("i = " + i); i++;}public static void main(String[] args) throws Exception {new HelloB();}} 在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。
4. 在构造函数中,通过this可以调用同一类中别的构造函数。如:public class ThisTest {ThisTest(String str) {System.out.println(str);}ThisTest() {this("this测试成功!");}public static void main(String[] args) {ThisTest thistest = new ThisTest();}} 为了更确切的说明this用法,另外一个例子为:public class ThisTest {private int age;private String str;ThisTest(String str) {this.str=str;System.out.println(str);}ThisTest(String str,int age) {this(str);this.age=age;System.out.println(age);}public static void main(String[] args) {ThisTest thistest = new ThisTest("this测试成功",25);}} 结果为:this测试成功25值得注意的是:
(1):在构造调用另一个构造函数,调用动作必须置于最起始的位置。
(2):不能在构造函数以外的任何函数内调用构造函数。
(3):在一个构造函数内只能调用一个构造函数。
5.this同时传递多个参数。public class TestClass {int x;int y;static void showtest(TestClass tc) {//实例化对象System.out.println(tc.x + " " + tc.y);}void seeit() {showtest(this);}public static void main(String[] args) {TestClass p = new TestClass();p.x = 9;p.y = 10;p.seeit();}} 结果为:9 10 代码中的showtest(this),这里的this就是把当前实例化的p传给了showtest()方法,从而就运行了。
❷ java 中this的用法
用this可以调用本类的属性,方法,构造方法,
this(x,y,0)是用来调用public
Point3D(int
x,
int
y,
int
z)这个构造方法的,这个时候本类回的3个属性就都有值答了:x,y是外来传入的值,z的值直接就是0了!
为什么要用this.x=x
,this.y=y
,
this.z=z,是为了区分外来的值名与本类下属性名的重名,this.x就是调用的属性!
还可以调用方法,如:this.方法名(),这样就调用本类下的这个方法!
❸ java中this的用法
一、指自己所在的对象。
比如在一个方法中,调用其他对象的变量或方法时,可以使用那个对象的对象名,比如aa.abc();
而调用自己所在对象的方法或变量时,不知道别人给起了什么名,所以直接用this.abc()就可以了。
二、看一个小例子中“this”的用法!
/**
* @author feng-neusoft
*
* 本示例为了说明this的三种用法!
*/
package test;
public class ThisTest {
private int i=0;
//第一个构造器:有一个int型形参
ThisTest(int i){
this.i=i+1;//此时this表示引用成员变量i,而非函数参数i
System.out.println("Int constructor i——this.i: "+i+"——"+this.i);
System.out.println("i-1:"+(i-1)+"this.i+1:"+(this.i+1));
//从两个输出结果充分证明了i和this.i是不一样的!
}
// 第二个构造器:有一个String型形参
ThisTest(String s){
System.out.println("String constructor: "+s);
}
// 第三个构造器:有一个int型形参和一个String型形参
ThisTest(int i,String s){
this(s);//this调用第二个构造器
//this(i);
/*此处不能用,因为其他任何方法都不能调用构造器,只有构造方法能调用他。
但是必须注意:就算是构造方法调用构造器,也必须为于其第一行,构造方法也只能调
用一个且仅一次构造器!*/
this.i=i++;//this以引用该类的成员变量
System.out.println("Int constructor: "+i+"/n"+"String constructor: "+s);
}
public ThisTest increment(){
this.i++;
return this;//返回的是当前的对象,该对象属于(ThisTest)
}
public static void main(String[] args){
ThisTest tt0=new ThisTest(10);
ThisTest tt1=new ThisTest("ok");
ThisTest tt2=new ThisTest(20,"ok again!");
System.out.println(tt0.increment().increment().increment().i);
//tt0.increment()返回一个在tt0基础上i++的ThisTest对象,
//接着又返回在上面返回的对象基础上i++的ThisTest对象!
}
}
运行结果:
Int constructor i——this.i: 10——11
String constructor: ok
String constructor: ok again!
Int constructor: 21
String constructor: ok again!
14
细节问题注释已经写的比较清楚了,总结一下,其实this主要要三种用法:
1、表示对当前对象的引用!
2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。
3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
还有就是注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!虽然夸张,但是却充分说明this不能在static方法中使用!
❹ java中this的作用及用法是什么
使用this调用本类中的属性
现在观察以下代码,看会有那些问题:
public void setName(String name){
name = name ;
}
这里面的两个name都是setName方法中的name参数。
此时,特别希望可以通过一个指定的标识明确的表示要把传入的name参数的值给类中的属性,所以此时就需要使用this关键字,使用this.name就表示类中的属性。
class Person{
private String name ;
private int age ;
public Person(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年龄:"+this.age) ;
}
};
public class Demo35{
public static void main(String args[]){
Person p1 = new Person("张三",30) ;
p1.print() ;
}
};
使用this还可以从一个构造方法中调用其他构造方法。
例如:有以下一个要求,一个类中存在了三个构造方法,但是要求,不管怎么调用,最终都要求可以在对象实例化的时候打印一个“新的对象产生了”的提示。
class Person{
private String name ;
private int age ;
public Person(){
System.out.println("新的对象产生了。。。") ;
}
public Person(String name){
System.out.println("新的对象产生了。。。") ;
this.setName(name) ;
}
public Person(String name,int age){
System.out.println("新的对象产生了。。。") ;
this.setName(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年龄:"+this.age) ;
}
};
以上代码虽然可以实现功能,但是同样的代码出现了三次,而且后面的两次出现纯属多余吧。用this()的形式可以调用类中的无参构造方法。
class Person{
private String name ;
private int age ;
public Person(){
System.out.println("新的对象产生了。。。") ;
}
public Person(String name){
// 最终都是调用无参构造方法
this() ;
this.setName(name) ;
}
public Person(String name,int age){
this(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年龄:"+this.age) ;
}
};
public class Demo36{
public static void main(String args[]){
Person p1 = new Person("张三",30) ;
p1.print() ;
}
};
注意点1:
如果使用了this调用其他构造方法,则此语句,必须写在构造方法的首行。
public void fun(){
// 发现在调用fun方法的时候,必须先设置name的值
this("zhangsan") ;
}
public Person(String name,int age){
this.setAge(age) ;
this(name) ; //--> 必须放在首行
}
注意点2:
使用this可以调用本类中的其他构造方法,但是至少留一个构造方法,作为程序的出口。
public Person(){
this("a",10) ;
System.out.println("新的对象产生了。。。") ;
}
public Person(String name){
// 最终都是调用无参构造方法
this() ;
this.setName(name) ;
}
public Person(String name,int age){
this(name) ; //--> 必须放在首行
this.setAge(age) ;
}
this最重要的特性 —— 表示当前对象
当前对象在程序中用以下形式体现:
· 当前操作此方法的对象,就称为当前对象。
class Demo{
public void print(){
System.out.println(this) ;
}
};
public class Demo38{
public static void main(String args[]){
Demo d1 = new Demo() ;
System.out.println(d1) ;
d1.print() ;
System.out.println("---------------------") ;
Demo d2 = new Demo() ;
System.out.println(d2) ;
d2.print() ;
}
};
回顾:
之前讲解的两个对象比较的程序。
// 在类的内部增加一个比较的方法
public boolean compare(Person p){
Person p1 = this ;
Person p2 = p ;
if(p1.name.equals(p2.name)&&p1.age==p2.age){
return true ;
}else{
return false ;
}
}
分析程序的运行过程:
class A{
private B b = null ;
public A(){
this.b = new B(this) ;
this.b.fun() ;
}
public void hello(){
System.out.println("Hello World!!!") ;
}
};
class B{
private A a = null ;
public B(A a){
this.a = a ;
}
public void fun(){
this.a.hello() ;
}
};
public class OODemo40{
public static void main(String args[]){
A aa = new A() ;
}
};
❺ Java中this的作用和用法以及含义!
this指直译是“这个”,在java中指“当前的”。不管在哪里,只要用到this,指的一定就是当前的这个对象。最常见的用法是在写java bean中。比如下面的代码
publicclassStudent{
privateStringname;
privateintage;
publicStudent(){}
publicStudent(Stringname,intage){
this();
this.setName(name);
this.age=age;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnthis.age;
}
}
上面的代码是一个java bean。所谓的java bean就是一个类,这个类有一些属性,方法只有这些属性的Getter 或者Setter (从Object类继承的方法不算在此列)。
这个bean有两个属性,在构造器中为属性赋值的时候写的this.setName(name).意思是调用当前你创建的这个对象的Setter给这个对象的属性赋值。而setName里面的this.name = name;这一句,等号之前的this.name表示当前对象的name,也就是在类里面定义的private String name这个变量,而等号之后的name表示从外界调用这个方法时候传进来的参数。所以这句话的意思就是将外界传来的字符串变量的值赋给当前对象的name属性。
那么构造器第一行的this()是做什么的呢?这句话是调用当前这个对象的无参构造,就是调用上面的public Student(){}这个构造器。在这段代码里this()体现不出来什么作用。但是我们知道构造器的作用是在构造对象的时候给属性赋值的。如果上面个无参构造里面写一些赋值语句的话那么这里就可以避免代码的重复了。但是请注意,调用this()的时候一定要写在该方法的第一行,否则会报错。
另外,this关键字不能使用在有static关键字修饰的方法和代码块里面。因为static是这个类的所有对象共用的,而this指的只是当前这个对象的“私人”的一些东西,在属性上面就冲突了。
说到this就得顺带提一下super关键字了。super关键字的用法同this差不多,同样不能与static一起使用。同样有super()的写法,且需要写在方法第一行。但是super所指示的东西可不一样,一般指的是当前这个类的直接父类。如果在子类中需要使用父类的构造器或者属性的时候可以使用super关键字。比如下面的代码:
{
publicStudent(){
super();
}
@Override
publicbooleanequals(Objectobj){
returnsuper.equals(obj);
}
}
上面这段代码就是在实现equals方法的时候调用其直接父类的Object类的equals方法。而在构造这个类的对象的时候也调用了其父类的构造方法。
注:上面代码中的extends Object其实完全不必写,因为所有的类都直接或者间接是Object类的子类(除了Object类本身)。如果不写extends的话默认继承Object类。这里为了需要所以这样写