Java this 关键字的使用方法详解

Java this 关键字的使用方法详解

构造方法中的this关键字

构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用。但如果一个类有多个构造方法,可以在一个构造方法中通过this(paras…)来调用其他的构造方法。
使用this来调用其他构造方法有如下几个约束。

1) 只能在构造方法中通过this来调用其他构造方法,普通方法中不能使用。
2) 不能通过this递归调用构造方法,即不能在一个构造方法中通过this直接或间接调用该构造方法本身。

例如:

class test {
  test() {
    this(1);
  }
  test(int a){
    this();
  }
  test(int a, int b) {
    this(1, 2);
  }
}

test()方法中调用了test(int)构造方法,而test(int)构造方法又调用了test()构造方法,构成递归调用。test(int, int)中调用了自身,也构成了递归调用。都是不允许的。

3) 通过this调用其他构造方法必须放在构造方法的第一行中执行。由于super调用父类的构造函数也必须放在构造方法的第一行中执行,因此,通过this和super调用构造方法不能同时出现一个构造方法中。也不能在一个构造方法中多次调用不同的构造方法。
在构造方法中也可以使用this关键字来访问本类中的成员变量和成员函数。其用法和非构造方法中的this关键字相同。

非构造方法中的this关键字

在Java中可以通过通过this关键字来调用类中的成员变量和方法。其用法是。

1) this.xxx; 访问类中的成员变量xxx
2) this.yyy(paras…); 访问类中的成员方法yyy
3) this; 当前类对象的引用

this关键字访问类的成员变量和成员函数时不受访问权限的控制,可以访问本类中所有的成员变量和方法,包括private的成员变量和方法。也可以通过this访问本类的static成员,不过由于static成员可以通过类名直接访问,如果通过this来访问会有“The static field ××× should be accessed in a static way”的警告信息。不能在类的static成员或static块中使用this。

继承关系下的this关键字

在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法。this关键字的四种用法如前文所述,列举如下。

1) this(paras…); 访问其他的构造方法
2) this.xxx; 访问类中的成员变量xxx
3) this.yyy(paras…); 访问类中的成员方法yyy
4) this; 当前类对象的引用

对第一种,无论子类是否有相同参数的构造方法,this(paras…);访问的始终是父类中的构造方法。
对第二种,无论子类是否有覆盖了该成员变量,this.xxx;访问的始终是父类中的成员变量。
对第三种,如果子类重写了该成员方法,则this.yyy(paras…);访问的是子类的成员方法,如果子类没有重写该成员方法,则this.yyy(paras…);访问的是父类的成员方法。
对第四种,this始终代表的是子类的对象。

例如:

public class ClassTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.show();
  }
}

class Parent {
  public String str;
  Parent(){
    this(1);
  }
  Parent(int a) {
    this.str = "Parent";
    this.show();
  }
  public void show() {
    System.out.println(this.str);
  }
}

class Child extends Parent {
  public String str;
  Child() {
  }
  Child(int a) {
    str = "Child";
  }
  public void show() {
    System.out.println(str);
    super.show();
  }
}

main()函数中有两条语句,new Child()和child.show()。

第一条语句new Child()时要执行Child类的构造方法,但是Child类是Parent类的子类,因此会先执行Parent类的构造方法。Child类的无参构造函数中没有使用super和this来调用父类或本类中的其他的构造方法,因此会调用父类的无参构造函数。在父类的无参构造函数Parent()中调用了执行了this(1),此调用表示执行父类中有一个整数参数的构造方法,虽然子类中也有一个有一个整数参数的构造方法,但是并不会被执行。父类中有一个整数参数的构造方法执行this.str=”Parent”,这里的this.str代表的是父类中的成员变量str,虽然子类中也有一个成员变量str,但是并不会被赋值。将父类中的成员变量str赋值为”Parent”后,接着执行了this.show(),虽然父类中有一个show()方法,但由于子类重写了show()方法,所以this.show()执行的子类的show()方法。子类的show()方法首先执行了打印str的操作,此时打印的显然是子类中的str,子类的str没有被赋值,因为打印null。接着子类的show()方法执行了super.show(),即调用了父类的show()方法,在父类的show()方法中执行了打印this.str的操作,this.str同样代表父类中的成员变量str,因此打印”Parent”。

第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(null),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, null, Parent。

如果将第一条语句改为new Child(1),则执行的是子类的有一个整数参数的构造方法,仍然是先执行父类的无参构造方法,初始化父类的str为”Parent”,然后执行子类的show(),子类的show()打印子类的str值(null),然后执行父类的show(),父类show()打印父类的str值(”Parent”),然后执行子类的构造方法将子类的str初始化为”Child”。 第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(”Child”),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, Child, Parent。

super和this的异同

super在一个类中用来引用其父类的成员,它是在子类中访问父类成员的一个桥梁,并不是任何一个对象的引用,而this则表示当前类对象的引用。在代码中Object o = super;是错误的,Object o = this;则是允许的。
super关键字的作用在于当子类中覆盖了父类的某个成员变量,或者重写了父类的某个成员方法时还能够访问到父类的成员变量和成员方法。如果子类中没有重写父类的成员变量和成员方法,则子类会继承父类的所有非private的成员变量和成员方法。这时在子类中无论通过this来访问成员和通过super来访问成员,结果都是一样的。

super.getClass()和this.getClass()

getClass()是Object类定义的一个final方法,所有Java类的getClass()都继承自Object类。如前文所述,如果子类没有重写父类的某个成员方法,那么通过super来访问还是还是通过this来访问结果都是一样的。因此,super.getClass()和this.getClass()结果是一样的。Object类的getClass()方法返回的是该对象的运行时类,一个对象的运行时类是该对象通过new创建时指定的类。因此,super.getClass()和this.getClass()返回的都是new对象时指定的类。

例如:

public class ClassConstructorTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.show();
  }
}

class Parent {
  private Parent mSelf;
  Parent(){
    mSelf = this;
  }
  public void show() {
    System.out.println(this.getClass().getName());
    System.out.println(super.getClass().getName());
    System.out.println(mSelf.getClass().getName());
  }
}

class Child extends Parent {
  public void show() {
    System.out.println(this.getClass().getName());
    System.out.println(super.getClass().getName());
    super.show();
  }
}

打印的类名都是Child。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 深入理解java中this关键字的使用

    一,表示类中属性 1,没有使用this的情况 class Person{ // 定义Person类 private String name ; // 姓名 private int age ; // 年龄 public Person(String name,int age){ // 通过构造方法赋值 name = name ; age = age ; } public String getInfo(){ // 取得信息的方法 return "姓名:" + name + ",年龄

  • 彻底理解Java中this 关键字

    this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因 this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄. 怎么理解这段话呢? thinking in java里面有这么一个例子 有两个同一个类型的对象,分别叫做a和b,那我们怎样区别在调用方法f()的时候,是谁再调用这个方法呢? 例如: class Banana { void f(int i){ /***方法主体*****/ } } Banana a = new Banana();//生成Banana

  • Java关键字this(动力节点Java学院整理)

    我们通常在用Java中的this关键字的时候,都知道this是代表正在调用这个类的方法的当前实例.通常情况下理解this关键字还是很容易的,但是在我初学的时候,有一个疑问却一直不能很清晰的理解,现在慢慢的理解了,就想把它记下来,也许有人和我有相同的疑问,说不定可以帮助到别人.我们还是先简单的看看通常情况下this的作用吧.比如下面的代码: public class Leaf { private int i = 0; Leaf increment() { i++; return this; } v

  • Java this、final等关键字总结

    this 关键字this引用对象自身.它也可以在构造方法内部用于调用同一个类的其他构造方法. 隐藏的静态变量可以通过"类.静态变量"来引用,而隐藏的实例变量就需要使用"this.实例变量"来引用. 调用一个重载的构造方法this引用是必须的. this是个隐式参数,代表当前对象 publie class Student{ private String name; public void setName(String name){ this.name=name; //

  • Java 中This用法的实例详解

     Java 中This用法的实例详解 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,Java提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法.先来个简单的例子: public class ThisDemo { String name="Mick"; public void print(String name){ System.out.pr

  • Java this()和super()的使用注意

    Java this()和super()的使用注意 使用super和this应该注意这些: 1)调用super()必须写在子类构造方法的第一行,否则编译不通过.每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错. 2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法. 3)super()和this()均需放在构造方法内第一行. 4)尽管可以用this调用一个构造器,但

  • 浅谈java面向对象(类,封装,this,构造方法)

    无论面向对象还是面向过程, 这俩都是解决问题的思路而已, 只是角度不同. 面向过程: 强调解决问题的每一个步骤都亲力亲为,每一个细节都自己手动实现. 面向对象: 使用特定功能对象去解决特定的问题, 每一个细节不需要关注,只需要创建对应的对象即可. 面向对象是基于面向过程的 类和对象及他们的关系 类: 具有相同特征和行为(功能)的事物的统称 , 是一个抽象概念 对象: 这类事物中某个确定的个体 类和对象的关系 一个类可以创建多个对象 , 类是对象的抽象, 对象是类的实例. 描述一个事物---->

  • java中this与super关键字的使用方法

    java中this与super关键字的使用方法 这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this相当于是指向当前对象本身. 2.形参与成员名字重名,用this来区分: class Person { private int age = 10; public Perso

  • Java super和this的对比及使用

    Java super和this的对比及使用 super和this的异同 1)super(参数列表):调用父类中的某一个构造函数(应该为构造函数中的第一条语句) this(参数列表):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) 2)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名   super.成员函数据名(实参) this:它代表当前对象名(在程序中易产生二义性之处,应使用t

  • java this 用法详解及简单实例

    java this 用法详解 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,JAVA提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法.先来个简单的例子: public class ThisDemo { String name="Mick"; public void print(String name){ System.out.printl

  • 详解Java使用super和this来重载构造方法

    详解Java使用super和this来重载构造方法 实例代码: //父类 class anotherPerson{ String name = ""; String age = ""; public String getAge() { return age; } public void setAge(String age) { this.age = age; } public void setName(String name){ this.name = name;

随机推荐