概述
Java的this用法
1.普通的直接引用
这种就不用讲了,this相当于是指向当前对象本身。
2,当局部(或者形参)变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分。
class Demo{
String str = "这是成员变量";
void fun(String str){
System.out.println(str); //形参(局部)变量
System.out.println(this.str);//成员变量
this.str = str;
System.out.println(this.str);
}
}
public class This{
public static void main(String args[]){
Demo demo = new Demo();
demo.fun("这是局部变量");
}
}
分析:上面的类Demo中有一个成员变量str和一个局部变量str(类方法中的形式参数),很显然局部变量和成员变量重名,这个时候一般在方法中直接使用str实际上是使用局部变量str,对成员变量str没有任何影响,此时如果需要对成员变量做点什么,就必须使用this关键字。在一个方法中如果没有局部变量和成员变量同名,那么在这个方法中使用成员变量也不必使用this
3、this关键字把当前对象传递给其他方法
class Person{
public void eat(Apple apple){
Apple peeled = apple.getPeeled();
System.out.println("Yummy");
}
}
class Peeler{
static Apple peel(Apple apple){
//....remove peel
return apple;
}
}
class Apple{
Apple getPeeled(){
return Peeler.peel(this);
}
}
public class This{
public static void main(String args[]){
new Person().eat(new Apple());
}
}
为了将其自身传递给外部方法,必须使用this关键字。
4,当需要返回当前对象的引用时,就常常在方法写return this
这种做法的好处是:当你使用一个对象调用该方法,该方法返回的是经过修改后的对象,且又能使用该对象做其他的操作。因此很容易对一个对象进行多次操作。
public class This{
int i = 0;
This increment(){
i += 2;
return this;
}
void print(){
System.out.println("i = " + i);
}
public static void main(String args[]){
This x = new This();
x.increment().increment().print();
}
}结果为:4
5、传递多个参数(与第三条类似)
6,在构造器中调用构造器需要使用this
一个类有许多构造函数,有时候想在一个构造函数中调用其他构造函数,以避免代码重复,可以使用this关键字。在java编程思想中有这样一段话:通常写this的时候,都是指“这个对象”或者“当前对象”,而且它本身表示对当前对象的引用。在构造器中,如果为this添加了参数列表,那么就有不同的含义。这将产生对符合此参数列表的某个构造器的明确调用;这样调用其他构造函数就有了直接的途径。
仔细分析:从主函数开始,new Flower()会在内存分配空间,初始化对象,初始化对象是调用构造函数,这里没有写任何参数,当然是调用默认构造函数,就是那个无参的构函数。这个无参的构造函数的第一行代码就是this("hi",122);这里的意思是该无参构造函数又去调用带两个参数的构造函数,来到带两个参数的构造函数,第一行代码是this(s);这行代码自动匹配带一个参数的构造函数,发现Flower(String ss)这个比较匹配,都是String类型的参数。然后调用了带有一个String类型参数的构造函数,打印:只有String类型的参数的构造函数 s = hi;然后回到上一级调用函数,就是带有两个参数的构造函数,打印输出:有String和int类型的参数的构造函数;再回到上一级,就是无参构造函数,打印:默认构造函数。此时构造函数已经初始化完成新建的对象,最后在主函数的最后一行代码中打印:petalCount=122 s=hi。
画个图看得更明白
7、提到this的构造函数用法,就不得不提super的用法
super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
super也有三种用法:
(1)普通的直接引用
与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。
(2)子类中的成员变量或方法与父类中的成员变量或方法同名
可以看到,这里既调用了父类的方法,也调用了父类的变量。若不调用父类方法value(),只调用父类变量name的话,则父类name值为默认值null。
(3)引用构造函数
super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
从本例可以看到,可以用super和this分别调用父类的构造方法和本类中其他形式的构造方法。
例子中Chinese类第三种构造方法调用的是本类中第二种构造方法,而第二种构造方法是调用父类的,因此也要先调用父类的构造方法,再调用本类中第二种,最后是重写第三种构造方法。
super和this的异同:
- super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
- this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句),在构造函数之外的方法内不能使用this调用构造函数
- super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
- this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
- 调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
- super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
- super()和this()均需放在构造方法内第一行。
- 尽管可以用this调用一个构造器,但却不能调用两个。
- this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
- this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
- 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
参考以下两篇文章:
https://www.cnblogs.com/hasse/p/5023392.html
https://www.cnblogs.com/yefengyu/p/4821582.html
最后
以上就是矮小夕阳为你收集整理的Java中this的用法总结Java的this用法的全部内容,希望文章能够帮你解决Java中this的用法总结Java的this用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复