this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性。例如:

  1. public class Demo{
  2. public int x = 10;
  3. public int y = 15;
  4. public void sum(){
  5. // 通过 this 点取成员变量
  6. int z = this.x + this.y;
  7. System.out.println("x + y = " + z);
  8. }
  9. public static void main(String[] args) {
  10. Demo obj = new Demo();
  11. obj.sum();
  12. }
  13. }

运行结果:
x + y = 25

上面的程序中,obj 是 Demo 类的一个实例,this 与 obj 等价,执行 int z = this.x + this.y;,就相当于执行 int z = obj.x + obj.y;。

注意:this 只有在类实例化后才有意义。

使用this区分同名变量

成员变量与方法内部的变量重名时,希望在方法内部调用成员变量,怎么办呢?这时候只能使用this,例如:

  1. public class Demo{
  2. public String name;
  3. public int age;
  4. public Demo(String name, int age){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. public void say(){
  9. System.out.println("网站的名字是" + name + ",已经成立了" + age + "年");
  10. }
  11. public static void main(String[] args) {
  12. Demo obj = new Demo("微学苑", 3);
  13. obj.say();
  14. }
  15. }

运行结果:
网站的名字是微学苑,已经成立了3年

形参的作用域是整个方法体,是局部变量。在Demo()中,形参和成员变量重名,如果不使用this,访问到的就是局部变量name和age,而不是成员变量。在 say() 中,我们没有使用 this,因为成员变量的作用域是整个实例,当然也可以加上 this:

  1. public void say(){
  2. System.out.println("网站的名字是" + this.name + ",已经成立了" + this.age + "年");
  3. }

Java 默认将所有成员变量和成员方法与 this 关联在一起,因此使用 this 在某些情况下是多余的。

作为方法名来初始化对象

也就是相当于调用本类的其它构造方法,它必须作为构造方法的第一句。示例如下:

  1. public class Demo{
  2. public String name;
  3. public int age;
  4. public Demo(){
  5. this("微学苑", 3);
  6. }
  7. public Demo(String name, int age){
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public void say(){
  12. System.out.println("网站的名字是" + name + ",已经成立了" + age + "年");
  13. }
  14. public static void main(String[] args) {
  15. Demo obj = new Demo();
  16. obj.say();
  17. }
  18. }

运行结果:
网站的名字是微学苑,已经成立了3年

值得注意的是:

  • 在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
  • 不能在构造方法以外的任何方法内调用构造方法。
  • 在一个构造方法内只能调用一个构造方法。

上述代码涉及到方法重载,即Java允许出现多个同名方法,只要参数不同就可以。后续章节会讲解。

作为参数传递

需要在某些完全分离的类中调用一个方法,并将当前对象的一个引用作为参数传递时。例如:

  1. public class Demo{
  2. public static void main(String[] args){
  3. B b = new B(new A());
  4. }
  5. }
  6. class A{
  7. public A(){
  8. new B(this).print(); // 匿名对象
  9. }
  10. public void print(){
  11. System.out.println("Hello from A!");
  12. }
  13. }
  14. class B{
  15. A a;
  16. public B(A a){
  17. this.a = a;
  18. }
  19. public void print() {
  20. a.print();
  21. System.out.println("Hello from B!");
  22. }
  23. }

运行结果:
Hello from A!
Hello from B!

匿名对象就是没有名字的对象。如果对象只使用一次,就可以作为匿名对象,代码中 new B(this).print(); 等价于 ( new B(this) ).print();,先通过 new B(this) 创建一个没有名字的对象,再调用它的方法。

<上一节下一节>
分享到:
QQ空间
新浪微博
腾讯微博
豆瓣
人人网
被顶起来的评论
  • .源代码

    package thisfangfa;
    public class This {
    public static void main(String[] args){
    B b=new B(new A());//这里创建B类的对象b时,对B类的构造函数传入了
    //A类的对象的引用(指针),
    }
    }
    class A{
    public A()
    {
    System.out.println www.uuweb.cn ("step 1 ");
    new B(this).print();//程序第一步会执行A类的构造方法A(),因为创建B类
    //的对象b时,对B类的构造函数传入了A类的对象的引用(指针),所以程序先执行
    //new A() ,执行new A()的时候就运行了A类的构造方法。A类的构造方法里面
    //创建了B类的匿名对象,并且引用了B类匿名对象的print();方法。
    }
    public void print()
    {
    System.out.println("step 3");//由于第二步a.print();执行了A类的
    //print()方法。所以程序第三步会运行到这里。
    System.out.println("hello from A");//然后执行到这句
    //代码,所以打印输出了hello from A
    }
    }
    class B{
    A a;//这里先声明一个A类的对象a,这时还没有对a实例化,只是声明。
    public B(A a){//执行new A()完毕后,开始执行执行new B()了,这时会执行B类的
    //构造函数B(),
    this.a=a;//B b=new B(new A());//这里创建B类的对象b时,传入的A类对象
    //的引用(指针),赋予了之前声明的A类的对象a,这时a存储着创建B类的对象b时,传
    //入的A类对象的引用(指针)。
    }
    public void print()
    { System.out.println("step 2 ");//由于引用了B类匿名对象的print()方法。
    //所以程序第二步会执行到这个方法里面。
    a.print();//因为a存储着创建B类的对象b时,传入的A类对象的引用(指针)。
    //所以这里执行a对象的方法print(),就是执行的A这个类里面的
    //print()方法。所以程序第二步会运行到这里。这里执行了A类的print()方法。
    //
    //打印输出hello from A完毕后,a.print();执行完毕,
    System.out.println("step 4 ");//所以开始执行这句
    System.out.println("hello from B");//和执行这句
    //整个程序结束在这里。
    }
    }

    在Eclipse下程序输出结果是这样的:

    step 1 
    step 2 
    step 3
    hello from A
    step 4 
    hello from B

Java this关键字详解的更多相关文章

  1. 《Java基础——break与continue用法详解》

    Java基础--break与continue用法详解       1. break语句: 规则: 1. 仅用于循环语句和switch语句当中,用于跳出循环. 2. 当只有一层循环时,则直接跳出循环,不 ...

  2. JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  3. Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  4. [java基础] 002 - 位运算符的详解和妙用

    一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...

  5. Java基础知识之this关键字知识讲解

    this关键字这里对java中this关键字的基础知识进行讲解,希望对热爱java的小伙伴有帮助!! /* this关键字代表了所属函数的调用者对象. this关键字的作用: 1. 如果存在同名成员变 ...

  6. Java:final、static关键字 详解+两者结合使用

    一  final关键字 1) 关于final的重要知识点 final关键字可以用于成员变量.本地变量.方法以及类. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. ...

  7. [java基础知识]java安装步骤

    jre:  java运行环境.  jre =  java虚拟机 + 核心类库(辅助java虚拟机运行的文件).如果只是运行java程序,只需要安装jre.    jdk: java开发工具集   jd ...

  8. java基础知识——Java的定义,特点和技术平台

    (作者声明:对于Java编程语言,很多人只知道怎么用,却对其了解甚少.我也是其中一员.所以菜鸟的我,去查询了教科书以及大神的总结,主要参考了<Java核心技术>这本神作.现在分享给大家!) ...

  9. vue.js基础知识篇(6):组件详解

    第11章:组件详解 组件是Vue.js最推崇也最强大的功能之一,核心目标是可重用性. 我们把组件代码按照template.style.script的拆分方式,放置到对应的.vue文件中. 1.注册 V ...

  10. Java基础知识之常见关键字(1)

    static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 注意点: 静态方法只能访问静态方法 但是非静态成员可以直接访问静态成员 静态方法中不可以使用this , ...

随机推荐

  1. ES6常用片段

    promise: --在return里面: methods:{ getSellData(){ return axios.get('/api/seller').then((res=>{ retur ...

  2. Vue.js入门(一)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta htt ...

  3. Spring 对属性文件的加密与解密

    一般用于配置密码等敏感信息 解密/加密工具类 package com.baobaotao.placeholder; import sun.misc.BASE64Decoder; import sun. ...

  4. BZOJ4888 [Tjoi2017]异或和 【树状数组】

    题目链接 BZOJ4888 题解 要求所有连续异或和,转化为任意两个前缀和相减 要求最后的异或和,转化为求每一位\(1\)的出现次数 所以我们只需要对每一个\(i\)快速求出\(sum[i] - su ...

  5. 使用jdbc连接oracle数据库时遇到的一些问题

    第一个问题:驱动名称错误 错误截图如下: 从错误提示可以看出,oracle少写了一个'a',手误对程序员来说是经常发生的事,有时能够及时发现纠错,有时就容易忽略. 建议大家将写好的测试无误的保存起来, ...

  6. UIImage 获取url图片资源

    //UIImage 获取url图片资源 -(UIImage *) getImageFromURL:(NSString *)fileURL { UIImage * result; NSData * da ...

  7. canvas2D 基础知识 浅析

    1.canvas HTML5给出的一个可以展示绘图内容的标签 使用领域: (推荐网站:threejs.org) 1. 游戏   2. 可视化数据  3. Banner广告  4. 多媒体 (1)在 c ...

  8. js中字符串常规操作

    string对象属性: 1.length 获取字符串的长度,需要注意的是,js中中文每个汉字也只代表一个字符. var myName="xulinjun"; console.log ...

  9. KMP字符串匹配算法翔解❤

    看了Angel_Kitty学姐的博客,我豁然开朗,写下此文: 那么首先我们知道,kmp算法是一种字符串匹配算法,那么我们来看一个例子. 比方说,现在我有两段像这样子的字符串: 分别是T和P,很明显,P ...

  10. 【CF1017F】The Neutral Zone(Bitset,埃氏筛)

    题意: 思路:From https://blog.csdn.net/CSDNjiangshan/article/details/81536536 #include<cstdio> #inc ...