关于Java中this的理解(C语言对比理解)

        笔者最近在学习Java的途中遇到一个令笔者比较不解的知识——“Java中的this”,因为笔者之前一直写C语言,C语言是一门面向过程的语言,而Java是一门完全面向对象的语言,所以在这方面确实钻了很多牛角尖。然后翻阅了大量资料解释的都是this始终指向当前实例,就这一句还是让笔者十分懵懂。后来在反复的写代码过程中好像理解了,这里拿C语言做对比,方便以前只接触过面向过程语言的同学理解。

啥也不说了先上代码:

class Main{
	public static void main(String[] args){
		Person ming = new Person();
		ming.setName("xiao ming");
		ming.setAge(20);
        System.out.println(ming);
	}
}

class Person{
	private String name;
	private int age;

	public String getName(){
		return this.name;
	}

	public void setName(String name){
		this.name = name;
	}

	public int getAge(){
		return this.age;
	}

	public void setAge(int age){
		if(age < 0 || age > 100){
			throw new IllegalArgumentException("invalid age value");
		}
		this.age = age;
	}

    public String toString(){
        return "Person{name:" + name + ",age:" + age + "}";
    }
}

        上述代码中,我们创建了一个名为Person的类,此类中包含两个私有字段一个是String类型的name,一个是int类型的age,同时还包含了几个方法,因为Person类中的这两个字段都是私有的,因此外部类无法直接调用,只能使用公有方法进行调用。

        了解了这个类以及方法的作用那么下面我们来了解一下方法中提到的this,以及方法的用法解释。

public String getName(){
		return this.name;
	}

在这里我们定义了一个String类型的方法为getName()我们将利用这个方法来获取setName()方法中拿到的数据;那么在这个getName()方法中我们的this它代表的或者说指向的到底谁呢?实际上我在经过实验和分析以后发现这个this.name指向了我们Person类中的私有字段name:

 为什么指向它呢?其实我们分析代码可以发现由于我们的Person方法中没有可以打印输出的语句,那我们的主方法mian就可以通过调用getName()来实现输出指定的字段。

System.out.println(ming.getName());    //这里会输出实例化后的name值

 想必大家也看到了,我们的getName()方法是String类型的,这就是因为它所要返回的字段name是String类型,这与我们C语言函数的定义相似。

public void setName(String name){
		this.name = name;
	}

        上面这段代码是void类型,因为它不需要返回值,但是setName()方法中的参数,是String类型的,因为它所要获取或者说要将他获取到的这个数据处理成String类型。该方法中的参数,可以想象成C语言中函数的形参,只不过形参名与字段名相同,C语言中也可以这么用。该方法中的this.name所指向的也是我们Person类中的私有字段name,而this.name=name后面这个name指的是参数name,和C语言函数相似,C语言函数中形参也可以直接拿来在函数中使用,避免重新申请一个变量,开辟一个空间。

        同样的,我们在主方法main中调用这个公有方法setName()为它传递一个“实参”——“xiao ming”,那么这个方法获得了一个值——“xiao ming”,它将这个值赋给this.name,大家可能已经注意到了,setName中的this.name与getName中的this.name指向的都是私有字段name,那么这一个过程就是我们便称之为“对象的实例化”,而这里我们进行实例化所使用的构造方法我们没有人为去书写,那么这里使用的就是Java语言的默认构造方法。

        这一传参过程完成以后我们便创造了一个具体的实例(对象),其类型是Person,(可以理解为C语言中的结构体)它包含两个字段。我们可以通过打印getNam方法来输出这个实例指定的字段,也可以直接打印这个对象的名称,来打印这个实例的所有字段。

但注意:在没有对方法进行重写之前直接打印对象名我们将不会得到这个对象的所有字段,我们得到的只是这个对象的地址,这点与C语言不同。若想要打印这个对象的所有字段可以参考上述程序中的:

public String toString(){
        return "Person{name:" + name + ",age:" + age + "}";
    }

 使用toString来对方法进行重写。

        那么,看完了这么多的解释我们知道了怎么调用外部类里的私有方法,也知道了这些调用方法的作用,明白了如何重写方法,使之打印字段,弄清楚了this.name指向的是什么。那我们回到最初的话题,this到底什么?按照题目来说,我的回答是,这个这个this指的就是这里的ming。没错指的是实例(对象)的名称,而且是你当前正在操作的这个实例,如果你使用new再实例化一个对象hong呢?没错当你的this在操作ming的时候,它所指代的就是对象名——ming,当它在操作hong的时候,它所指代的就是对象名——hong。

好了,关于this的叙述就这么哆啦,希望可以帮助到你。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值