Java学习笔记三:This用法

一般情况下,当我们在外部引用其他类的时候,需要声明这个类型引用,比如

ThisDemo td = new ThisDemo();

 

在”Java编程思想”中有这一段例子:

Banana a = new Banana();
Banana b = new Banana();
a.peel(1);
b.peel(2);

我们在声明对象引用的时候,通常用上述的方法,但是在编译器做了一些操作,实际操作结果为:

它暗自把“所操作对象的引用”作为第一个参数传递。

Banana.peel(a, 1);
Banana.peel(b, 2);

但是如果我们要在当前类的内部使用当前类的引用,这个时候就会用到this关键字。

 

This使用方法:

this关键字表示:对“调用方法的那个对象”的引用,其实就是对当前类的对象的引用。

1.区分数据成员变量与传参变量,通常使用在get和set方法中。

class ThisDemo
{
    private String name;
    private int age;

    /**
     * @return the name
     */
    public String getName()
    {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name)
    {
        this.name = name;
    }

    /**
     * @return the age
     */
    public int getAge()
    {
        return age;
    }

    /**
     * @param age the age to set
     */
    public void setAge(int age)
    {
        this.age = age;
    }
}

 

2.返回当前对象的引用

满足在一条语句中对同一个对象执行多次操作。

这里使用“Java编程思想”的一个例子:

class Leaf
{
    int i = 0;

    public Leaf increment()
    {
        i++;
        return this; // 返回当前对象Leaf的引用
    }

    public void print()
    {
        System.out.println(i);
    }

    public static void main(String[] args)
    {
        Leaf leaf = new Leaf();
        leaf.increment().increment().increment().increment().print();
    }
}

输出结果为:4。这里能够递增的原因是:在 Leaf leaf = new Leaf();  初始化的时候 i = 0,在调用方法 increment() 返回 Leaf 引用的时候 i 没有再次被初始化,而是使用 i++后的值。

3.将当前对象的引用传递给其他方法。

例子还是使用“Java编程思想”的,这里先大概说明下场景:

(1)用户想吃苹果,并且提供出了一个完整的苹果给其他人(这里的“其他人”我们可以理解为加工厂,更深层的可以理解为第三方jar包,工具类等等);

(2)用户不关心处理方法,只要能返回给一个已经削好皮的苹果,至于“其他人”中什么方法、工具,用户不关心。

/**
 * 用户类
 */
class Person
{
    public void eat(Apple apple)
    {
       // 用户只关心得到削皮的苹果
        // Apple apple 是完整的苹果,没有削皮
        Apple peeled = apple.getPeel();
    }
}

/**
 * 苹果类
 */
class Apple
{
    public Apple getPeel()
    {
        // 将苹果传给给Peeler
        return Peeler.peel(this);
    }
}

/**
 * 削皮操作
 * 这里只用static放,一般是工具类
 */
class Peeler
{
    public static Apple peel(Apple apple)
    {
        // TODO 削皮操作,返回一个已经削皮的苹果
        return apple;
    }
}

1).对于 Person 来说,Peeler 是不可见的,并且 Peeler 做什么操作我们也是不可见的。同时,用户也关心。

2).在传递给Peeler 的使用,在 peel 方法中使用了 this 。

 

例子二:

场景:我们需要组装某个设备(如手机),需要用到不同的组件,如果是多个产品线同时工作,怎么知道没有重复的组件装在同一设备上(一台手机装上两个电池?)

/**
 * 手机
 */
class Phone
{
    private Screen screen;
    private Battery battery;

    /**
     * 组装屏幕
     */
    public void addScreen()
    {
        screen = new Screen(this);
    }

    /**
     * 组装电池
     */
    public void addBattery()
    {
        battery = new Battery(this);
    }
}

/**
 * 屏幕
 */
class Screen
{
    private Phone p;
    public Screen(Phone phone)
    {
        // TODO 组装屏幕
        p = phone;
    }
}

/**
 * 电池
 */
class Battery
{
    private Phone p;
    public Battery(Phone phone)
    {
        // TODO 组装屏幕
        p = phone;
    }
}

使用 this 将当前的 Phone 设置到需要安装的组件上,把 Phone 的引用传递给其他组件。

PS:现实场景,方便理解:到海鲜市场买海鲜,然后到附近的酒楼进行加工,传递给酒楼的海鲜就是 this。

 

4.在构造函数中调用其他构造函数

如果一个类中有多个构造函数,某个构造函数有想调用当前类的其他构造函数,可以使用this。

注意:

1.一个构造函数中不能嗲用两个其他的构造函数;

2.构造函数必须放在其实位置。

//----------------方法4--------------
class ThisSstructure
{
    public ThisSstructure(int i)
    {
        System.out.println(i);
    }

    public ThisSstructure(String string)
    {
        System.out.println(string);
    }

    public ThisSstructure(int i, String string)
    {
        this(i); // 调用第一个构造函数,必须放那个在最开始
        // this(Stirng); // 编译报错,不能同时使用两个
    }

    public static void main(String[] args)
    {
        ThisSstructure ts = new ThisSstructure(1, "test");
    }
}

 

总结:

this 表示对当前对象的引用,只要记住这个特性,在使用时多加注意即可。

时间: 2024-08-01 11:09:12

Java学习笔记三:This用法的相关文章

JAVA学习笔记(三十二)- 字符流 FileReader & FileWriter

标题 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream;

JAVA学习笔记(三十五)- 随机读写文件 RandomAccessFile

RandomAccessFile类 /* * RandomAccessFile类,随机读写文件 * * 数据分段要有规律,每段大小相等,可以将每段数据设置为较大的值,足以存在每一个段的数据 * */ public class Test04 { public static void main(String[] args) throws IOException { //writeFile(); readFile(); } // 写入数据 public static void writeFile()

JAVA学习笔记(三十四)- 字节打印流 PrintStream

PrintStream字节打印流 import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.Reader; /* * Pri

黑马程序员——JAVA学习笔记三(面向对象)

1,    面向对象设计程序(oriented object pragraming)  ,其程序是有对象组成,只要对象能满足要求,就不需要关心其功能的具体实现.面向对象的特征:封装(encapsulation)继承(inherence)多态(polymorphism). 2,    类是对事物的属性和行为的描述,构造对象的模板和蓝图.对象是类的实例,它具有三个特征:行为(behavior)状态(state) 对象标示(identity如何辨别具有相同状态和行为的对象).成员函数默认有一个隐含参数

Java学习笔记三---unable to launch

环境配置好后,在eclipse下编写HelloWorld程序: ①创建新工程 ②创建.java文件,命名为HelloWorld ③在源文件中添加main方法,代码如下: public void main(String[] args){ String.out.println("HelloWorld!"); } ④点击运行按钮,弹出如下的信息: The selection cannot be launched,and there are no recent launnches. ⑤检查代码

JAVA学习笔记(三十三)- 字节流转换为字符流

将字节流转换为字符流 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; /* * InputStreamRead

Java学习笔记三(对象的基本思想一)

1 面向对象编程(OOP)的基本思想 面向对象就是描述对象和对象之间的相互作用:和面向过程编程的区别:面向过程编程时首先确定算法,再确定数据结构:OOP是先确定数据结构,在确定运算. 对象有两个特征:状态和行为:把相似的对象规化为一类,在软件中类就是一个模板,它定义了通用于一个特定种类的所有对象的所有状态和方法: 类是创建对象的模板,对象的类的实例: 2 类的入口函数和构造函数 (1)类的入口函数定义为 public static void main(Sting [] args) 当一个类中有m

Java学习笔记三——数据类型

前言 Java是强类型(strongly typed)语言,强类型包含两方面的含义: 所有的变量必须先声明后使用: 指定类型的变量只能接受预支匹配的值. 这意味着每一个变量和表达式都有一个在编译时就确定的类型. Java数据类型分为两大类:基本类型和引用类型. 基本数据类型 Java的基本数据类型包括:boolean.字符型和数值类型. 数值类型包括:整型和浮点类型 boolean 大小:Java规范并没有强制指定boolean类型的变量所占内存大小 范围:true或false 例子:boole

JAVA学习笔记(三十九)- 线程优先级

线程优先级 /* * 线程优先级,范围[1,10] * 不同优先级的线程获取执行的机会不同,优先级越高,执行机会越大 * * 对比不同优先级的线程被执行的机率 */ public class Test05 { public static void main(String[] args) { System.out.println("最大优先级:" + Thread.MAX_PRIORITY); System.out.println("最小优先级:" + Thread.