java中this关键字

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()只能出现在无参构造方法的第一行;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值