题目
java中this的作用及用法?在什么情况下需要用this
提问时间:2020-12-17
答案
使用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() ;
}
};
现在观察以下代码,看会有那些问题:
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() ;
}
};
举一反三
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
奥巴马演讲不用看稿子.为什么中国领导演讲要看?
想找英语初三上学期的首字母填空练习……
英语翻译
1,人们染上烟瘾,最终因吸烟使自己丧命.
最新试题
- 1用追根求源.司空见惯.无独有偶.见微知著.锲而不舍造句.
- 2The butteries were in the garden just now.改成一般疑问句
- 3苍蝇复眼每个眼睛可以看物体的几分之几
- 4客车与货车同时从a、b两地相对开出,4.5小时后相遇.相遇时客车比货车多行27千米,客车的速度是货车的1.25倍.a、b两地相距多少千米?
- 5烧瓶中的水已经停止沸腾,但浇上冷水后为什么又会重新沸腾?
- 64,9,16,25,【 】,49.找规律填数
- 7excel中的电子工作表具有 A一维结构 B 二维结构 C三维结构 D 数结构
- 8In front of our school gate ____ two stone lions
- 9Please give the flower ____ ____ him
- 10已知 如图 在平行四边形ABCD中,∠BCD的平分线交AB于E,交DA的延长线于F,求证AE=AF
热门考点
- 1儿子 读后感
- 2lim(x趋近于1)sin(1-x)/根号X-1 我要具体过程
- 3找一篇we help oourselves by helping others 的英语作文
- 42已知梯形ABCD中,AB//CD,AB=CD+CB,角A=51度,求角B的度数?
- 5小明坐电梯从地下2层升到地上8层,请问电梯一共上升了多少层?
- 6有关正弦定理的一个小问题,急
- 7粗糙的水平面上放置一质量为m=1.2kg的小物块(可视为质点),对它施加F=3N的水平作用力,使物块沿水平面向右匀加速运动.已知物块通过A点时的速度为vA=1m/s,到达B点所用时间t1=2s,此后再
- 8一包糖,无论分给6个人,还是10个人,都剩下5块,这包糖至少有多少块?
- 9圆的半经加1cm,面积加21πcm²,圆的半径多少
- 10【求助】急需一篇商业计划书英文范文.