1、我们了解this作用之前,先了解this是什么?在内存方面是怎样的?
- 其实呢this是个变量,是个引用,保存当前对象的内存地址,指向自身。this代表的就是“当前对象”;它是存储在堆内存中当前对象的内部
- 一个对象一个this
在内存中的存在:
需要注意的是图中只画了类中的一个对象。我们再创建个对象,也是一样的,this还在对象内部,只不过这个对象的地址改变了而已,当然this所指的地址也会改变,假如这里我们创建了个对象为c2,那this所指的地址和c2也是一样的,这个对象地址是什么,this所指的地址就是什么。
2、this只能使用在实例方法中,谁调用这个实例方法,this就是谁,所以this代表的是:当前对象,这里我们定义了一个People类,并对属性进性封装,已经构造方法:
public class PeopleTest{
public static void main(String[] args){
People people = new People();
people.setName("李四");
System.out.println(people.getName);
}
}
class People {
private String name;
public People() {
}
public People(String name) {
this.name = name;
}
public String getName() {
return name;
}
/*public void setName(String c){
name = c;
}
public void setName(String name){
name = name;
}
*/
public void setName(String name) {
this.name = name;
}
}
我们只对get和set方法进行解释,构造方法中也是同样的;
<1>、我们可以看到两种set方法都可以传入参数,可对name进行修改,可是第一种传入String c明显的不合适,这个c到底是什么,我们很明确的知道,我们需要传入的name,这样传参肯定会造成误解
<2>、而第二种使用 name = name的方式,这样编译器会直接给警告,由于java语言的就近原则,这个局部变量name传入的就不是实例变量name,我们运行起来,可以发现并没有对实例变量name进行赋值;
<3>、接下来也是最平常的set方法,this.name = name;在第二种name = name的方式中并没对实例变量name进行赋值,主要是是没有对象的参与,setget方法都是实例方法,那我们就在需要赋值的实例变量前加this. 的方法,这样表示当前对象的name,我们再测试类中创建对象,调用set方法,就知道了当前的对象是people,形象的说this.name 就相对于people.name了,只要创建对象对实例变量name进行赋值,this都会指向当前对象,创建一个people对象那么这个name就是people对象的,创建一个animal对象那这个name就是animal对象的name
3、 有的时候this也是可以省略的,我们再来看一种情况,再上面的程序当中加入跑步的方法。
public void run(){
System.out.println(name+"在跑步");
}
这里的name里并没有this,按理来说应该有对象的参与,通过引用. 的方式来访问name,不过这里把this省略了而已,我们不省略this也是可以的
public void run(){
System.out.println(this.name+"在跑步");
}
这样也可正常运行,在我们创建对象调用run()方法,run()就已经知道默认调用它的是该对象,所以这里的this也就会被省略。
4、this代表当前对象,静态方法中不存在当前对象。
static关键字修饰的变量是静态变量,修饰的方法是静态方法,静态方法的调用不许要对象的创建,直接使用类名.方法名的方式访问,static关键字再之前的博客也进行了详细解释。我们再把之前的run()方法该文静态的方法,
这里name就出现错误提示了,因为静态方法中不需要对象的参与,我们这里的name对象参与的,应该是this.name的格式,只不过我们把this省略了,如果我们需要调用这个name,就需要创建对象来调用
如图
通过上述的几个例子当中国可以发现:在实例方法中,或者构造方法中,为了区分局部变量和实例变量,这种情况下this是不能省略;
6、this()
我们来看接下来的题目要求,就之前的日期类,有两个构造方法,无参和有参的,需要再无参的构造方法中进行初始化赋值,分别是1970年1月1日;我们来看代码片段:
这样写完全没没问题,接下来我们对代码进行优化:
通过this调用本类的构造方法,这样方便了很多
结论:
this除了使用在实例方法中,也可以使用在构造方法中;通过当前的构造方法去调用另一个本类的构造方法,
但是在调用无参构造方法是,只能调用本类的构造方法,并且this()只能出现在无参构造方法的第一行;