java中this关键字的使用

参考链接:https://www.cnblogs.com/zheting/p/7751752.html

一个对象创建后会有一个this指针指向它。所以this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。

一、  使用this来区分当前对象。
Java中为解决变量的命名冲突和不确定性问题,引入关键字this代表其所在方法的当前对象的引用:
1)  构造方法中指该构造器所创建的新对象;
2)  方法中指调用该方法的对象;
3)  在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。
     this只能用在构造器或者方法中,用于获得调用当前的构造器方法的对象引用。可以和任何的对象引用一样来处理这个this对象。

说明:
(1)当实例变量和局部变量重名,JAVA平台会按照先局部变量、后实例变量的顺序寻找。即,方法中使用到的变量的寻找规律是先找局部变量,再找实例变量。如果没用找到,将会有一个编译错误而无法通过编译。
(2)如果使用this.a,则不会在方法(局部变量)中寻找变量a,而是直接去实例变量中去寻找,如果寻找不到,则会有一个编译错误。
(3)在一个方法内,如果没有出现局部变量和实例变量重名的情况下,是否使用this关键字是没有区别的。
(4)在同一个类中,Java普通方法的互相调用可以省略this+点号,而直接使用方法名+参数。因为Java编译器会帮我们加上。

public class dududu {
    /*
因为xx是一个动态的内部类,创建这样的对象必须有实例与之对应,程序是在静态方法中直接调用动态内部类会报这样错误。   
这样的错误好比类中的静态方法不能直接调用动态方法。可以把该内部类声明为static。或者不要在静态方法中调用。
     */
    public static class desktop{
        public int h=10,w=10;
        public desktop(int h,int w) {
            System.out.println("这是对象的h属性:"+this.h);
            System.out.println("这是对象的w属性:"+this.w);
            System.out.println("这是参数h的值:"+h);
            System.out.println("这是参数w的值:"+w);
            this.h=h;
            this.w=w;
        }
        public void show() {
            int h=33,w=44;
            System.out.println("我的高为:"+this.h+",宽为:"+this.w);
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        desktop a = new desktop(1,2);
        desktop b = new desktop(10,20);
        a.show();
        b.show();
    }

}

二、构造函数中使用this调用其他构造函数

在构造器中可以通过this()方式来调用其他的构造器。但在一个构造器中最多只能调用一个其他的构造器。并且,对其他构造器的调用动作必须放在构造器的起始处(也就是构造器的首行),否则编译的时候将会出现错误,另外不能在构造器以外的地方以这种方式调用构造器。

public class dududu {
    /*
因为xx是一个动态的内部类,创建这样的对象必须有实例与之对应,程序是在静态方法中直接调用动态内部类会报这样错误。   
这样的错误好比类中的静态方法不能直接调用动态方法。可以把该内部类声明为static。或者不要在静态方法中调用。
     */
    public static class desktop{
        public int h=10,w=10;
        public desktop() {
            this(1,2);
            System.out.println("无参构造函数");
        }
        public desktop(int h,int w) {
            //this(); 如果把这个注释打开,那么构造函数互相调用就会死循环,所以会报错
            System.out.println("有参构造函数");
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        desktop a = new desktop(1,2);
        desktop b = new desktop();
    }

}

三、返回一个类的引用

public class A{

public A(){
    new B(this).print();
}

public void print(){
      System.out.println("From A!");
 }

public static void main(String[] args) {
      new A();
   }
}
 
public class B{
   A a;
   public B(A a){
      this.a = a;
   }
 
   public void print(){
      a.print();
      System.out.println("From B!");
   }
}

注意:java中为什么在static中不能使用this关键字
Static方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成。而this指代的是当前的对象
在方法中定义使用的this关键字,它的值是当前对象的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.
而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,
则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this.

原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13685735.html