Java自学第八课之this的使用——自学笔记
this关键字主要有三个应用:
(1)this调用本类中的属性,也就是类中的成员变量;
(2)this调用本类中的其他方法;
(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。
第一个怎么理解呢?
举个例子,当我们要给对象的某些属性赋值的时候
public class ThisDemo {
public static void main(String[] args) {
Student s=new Student("小明明",20);
System.out.println(s);
}
}
class Student{
String name;
int age;
public Student(String name, int age) {
//注:没有加this
name = name;
age = age;
}
@Override
public String toString() {
return "Student [ name=" + name + ", age=" + age +"]";
}
}
---------------------
作者:proveyourself
来源:CSDN
原文:https://blog.csdn.net/sugesi/article/details/78726547?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
打印结果:Student [ name=null, age=0],赋值没有成功,这是为什么呢。因为在方法中使用的name都是方法内部自己定义的形参,这时候外部定义的参数被暂时的覆盖了。name=name这句话是把形参name的值又赋给形参name,因为值传递,所以这个值对实参的值没有影响,所以不会改变实参的值。
说明:name(局部变量)=name(局部变量);
而不是name(成员变量)=name(局部变量);
如果形参和实参的名字不一样,就不用加this,不然就要加this,这里用this表示当前对象的值,this.实参,表示调用这个构造方法的对象的属性。this.实参=形参;
成员变量和局部变量的区别
成员变量:
1、成员变量定义在类中,在整个类中都可以被访问。
2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
3、成员变量有默认初始化值。
局部变量:
1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
3、局部变量没有默认初始化值
在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找。(和c语言一样,在函数内部定义和外部变量名字一样名字的变量的时候,外部变量暂时被覆盖)
作者:proveyourself
来源:CSDN
原文:https://blog.csdn.net/sugesi/article/details/78726547?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
第二个
调用类的普通方法
这个比较简单,直接上代码:
public class ThisTest2 {
public static void main(String[] args) {
ThisDemo2 thisDemo = new ThisDemo2("李四", "杭州");
System.out.println(thisDemo.get2());
}
}
class ThisDemo2 {
private String name;
private String address;
public ThisDemo2(String name, String address) {
this.name = name;
this.address = address;
}
public String get() {
return "名字:" + name + ", 地址:" + address;
}
public String get2() {
return this.get();
}
}
输出结果为:
名字:李四, 地址:杭州
可以看到get2()方法中使用了this.get()调用本类的普通方法
作者:Cappuccinooo
来源:CSDN
原文:https://blog.csdn.net/kuangay/article/details/81535701?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
第三个
调用类的构造方法
举例: 假如一个类中有三个构造方法(无参、一个参数、两个参数),代码如下:
public class ThisTest3 {
public static void main(String[] args) {
ThisDemo3 thisDemo = new ThisDemo3("李四", "杭州人间天堂");
System.out.println(thisDemo.get());
}
}
class ThisDemo3 {
private String name;
private String address;
public ThisDemo3() {
System.out.println("创建了一个新的ThisDemo3实例......");
}
public ThisDemo3(String name) {
this.name = name;
System.out.println("创建了一个新的ThisDemo3实例......");
}
public ThisDemo3(String name, String address) {
this.name = name;
this.address = address;
System.out.println("创建了一个新的ThisDemo3实例......");
}
public String get() {
return "名字:" + name + ", 地址:" + address;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
输出结果为:
创建了一个新的ThisDemo3实例…
名字:李四, 地址:杭州人间天堂
1
2
可以看到上面的代码有大量重复情况,那么我们这时候就可以使用this调用构造方法来简化我们的代码,让代码看起来清爽简洁。
public class ThisTest4 {
public static void main(String[] args) {
ThisDemo4 thisDemo = new ThisDemo4(“李四”, “杭州人间天堂”);
System.out.println(thisDemo.get());
}
}
class ThisDemo4 {
private String name;
private String address;
public ThisDemo4() {
System.out.println("创建了一个新的ThisDemo4实例......");
}
public ThisDemo4(String name) {
this();
this.name = name;
}
public ThisDemo4(String name, String address) {
this(name);
this.address = address;
}
public String get() {
return "名字:" + name + ", 地址:" + address;
}
}
输出结果为:
创建了一个新的ThisDemo4实例…
名字:李四, 地址:杭州人间天堂
上面就是使用this调用构造方法的优化后的代码,没有重复代码,看起来简洁多了。
作者:Cappuccinooo
来源:CSDN
原文:https://blog.csdn.net/kuangay/article/details/81535701?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
在构造器中调用另一个构造器在我看来并没有简洁多少,可能是我没有遇到真正好的例子。