Java学习(一)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值