Java 学习随笔1
关键字this
1.调用类中的属性,也就是类中的成员变量----当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量。
public class Test{
int test;
public Test(int test) {
//当这里的参数与类实例变量不同,可以不使用this来指定。
this.test = test;
/*当实例变量与参数存在歧义,使用this来指定当前类的实例变量。*/
test = test;
//当取消注释与删掉上一行代码时,返回值为0。
//当引用实例变量时,当参数存在歧义时,不使用this,返回值为0,使用this才指定为实例变量。
}
2使用this调用本类中的其他方法
没有使用 static 修饰的成员变量和方法都必须使用对象来调用
public class Coder {
// 定义一个type()方法
public void type() {
System.out.println("这是type方法");
}
// 定义一个code()方法,code()方法需要借助type()方法
public void code() {
Coder d = new Coder();
d.type();
System.out.println("这是code方法");
}
}
不一定需要重新创建一个Coder对象。因为当程序调用type( ) 方法时,一定会提供一个Coder对象,这样就可以直接使用这个已经存在的Coder对象,而无须重新创建新的Coder对象了。因此需要在code() 方法中获得调用该方法的对象,通过 this 关键字就可以满足这个要求。
this 可以代表任何对象,当 this 出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的只能是当前类的实例。只有当这个方法被调用时,它所代表的对象才被确定下来,谁在调用这个方法,this 就代表谁。
将前面的Coder类的code( ) 方法改为如下形式会更加合适,code( ) 方法代码修改如下,其它代码不变。
// 定义一个code()方法,code()方法需要借助type()方法
public void code() {
this.type();
System.out.println("这是code方法");
}
从第一种 Coder类定义来看,在Coder对象的code( ) 方法内重新创建了一个新的Coder对象,并调用它的type( ) 方法,这意味着一个Coder对象的code( ) 方法需要依赖于另一个Coder对象的 type( ) 方法,这不符合逻辑。
第二种 Coder类定义是当一个 Coder对象调用code( ) 方法时,code( ) 方法需要依赖它自己的 type( ) 方法,与第一种定义类的方法相比,更符合实际情形。
在现实世界里,对象的一个方法依赖于另一个方法的情形很常见,例如,学习方法依赖于记忆方法,舞蹈方法依赖于跳跃方法。这种依赖都是同一个对象两个方法之间的依赖。因此,Java 允许对象的一个成员直接调用另一个成员,可以省略 this 前缀。也就是说,将上面的 code( ) 方法改为如下形式也完全正确。
public void code() {
type();
System.out.println("这是code方法");
}
大部分时候,一个方法访问该类中定义的其他方法、成员变量时加不加 this 前缀的效果是完全一样的。
注意:对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用。并且 Java 语法规定,静态成员不能直接访问非静态成员。
省略 this 前缀只是一种假象,虽然程序员省略了调用type() 方法之前的 this,但实际上这个 this 依然是存在的。
3.this( ) 用来访问本类的构造方法
注:在Java类中必须存在一个构造方法。如果在代码中没有显示的体现构造方法的话,那么编译器在编译的时候会自动添加一个没有形式参数的构造方法。构造方法一律是没有返回值的,而且也不用void关键字来说明这个构造方法没有返回值。在一个类中可以存在多个构造方法,这些构造方法都采用相同的名字,只是形式参数不同。Java语言就凭形式参数不同来判断调用那个构造方法。
this( )括号中可以有参数,如果有参数就是调用指定的有参构造方法。
public class Student {
String name;
// 无参构造方法(没有参数的构造方法)
public Student() {
this("Ross");
// this( )不能在普通方法中使用,只能写在构造方法中。
//在无参数构造方法中使用,且必须是第一条语句。
//在一个构造函数内只能调用一个构造函数
}
// 有参构造方法
public Student(String name) {
this.name = name;
}
public void print() {
System.out.println("姓名:" + name);
}
public static void main(String[] argv) {
Student stu = new Student();
stu.print();
}
}
4.this关键字除了可以引用变量或者成员方法之外,还有一个重大的作用就是返回类的引用。在代码中,可以使用return this,来返回某个类的引用。此时这个this关键字就代表类的名称。
5.当在匿名类或内部类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。
public class HelloB {
int i = 1;
public HelloB() {
Thread thread = new Thread() {
public void run() {
for (int j=0;j<20;j++) {
HelloB.this.run();//调用外部类的方法
try {
sleep(1000);
} catch (InterruptedException ie) {
}
}
}
}; // 注意这里有分号
thread.start();
}
public void run() {
System.out.println("i = " + i);
i++;
}
public static void main(String[] args) throws Exception {
new HelloB();
}
}
在上面这个例子中, thread 是一个匿名类对象,在它的定义中,它的 run 函数里用到了外部类的 run 函数。这时由于函数同名,直接调用就不行了。这时有两种办法,一种就是把外部的 run 函数换一个名字,但这种办法对于一个开发到中途的应用来说是不可取的。那么就可以用这个例子中的办法用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run。
注:this的第五种用法引自https://www.cnblogs.com/zhangkuilong/p/8635607.html