Java中this、super关键字的用法

2019-02-15  本文已影响0人  Harper324
1、this

当一个对象创建后,JVM就会给这个对象分配引用自己的指针,这个指针的名字就叫做this。也正因为如此,this只能用在非静态方法中。并且this只和特定的对象关联,而不和类关联(所以看到this就表示调用这个方法的对象)。

this的具体用法有四种:

1、调用类中的成员变量

在下面的Student类中,定义了同名的成员变量和局部变量name,在成员方法中this这个关键字其代表的就是调用对象中的成员变量或者方法。也就是说,如果在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者方法,所以在下面的代码中,this.name=name就是将局部变量的值传递给成员变量。

Public Class Student { 
   String name; //定义一个成员变量name
   private void SetName(String name) { //定义一个参数(局部变量)name
      this.name=name; //将局部变量的值传递给成员变量
 }
}

2、调用本类中的其他构造方法

构造方法是一个与类同名的没有返回值的方法,在Java类中必须存在一个构造方法。如果在代码中没有显式的体现构造方法的话,那么编译器在编译的时候会自动添加一个没有形式参数的构造方法。可以通过this调用本类中另一个构造方法,用法是this(参数列表),这个仅仅在类的构造方法中可以用,并且只能放在类的构造方法的方法体的第一句。在存在同名构造方法时,可通过方法重载来进行调用。

public class Student { //定义一个类,类的名字为student
  String name;
  String id;
   public Student() { //定义一个构造方法
       this(“Hello!”); //调用其他构造方法
 }
   public Student(String name) { //定义一个带形式参数的构造方法
   this.name=name;    
 }
}

3、代表自身对象

在一个类的内部,也可以使用this代表自身类的对象,或者换句话说,每个类内部都有一个隐含的成员变量,该成员变量的类型是该类的类型,该成员变量的名称是this

4、调用成员方法

在一个类的内部,成员方法之间的互相调用时也可以使用“this.方法名(参数)”来进行引用,只是所有这样的引用中this都可以省略

2、super

super与this类似,是指向父类的指针,也只能用于非静态方法中
1、调用父类的方法或成员变量

class Country {
    String name;
    void value() {
       name = "China";
    }
}
  
class City extends Country {
    String name;
    void value() {
    name = "Shanghai";
    super.value();      //调用父类的方法
    System.out.println(name); //Shanghai
    System.out.println(super.name); //China
    }
  
    public static void main(String[] args) {
       City c=new City();
       c.value(); //调用子类的方法
       }
}

运行结果:
Shanghai
China
在上面的例子中调用了父类的方法和成员变量

2、调用父类构造方法
必须写在方法体的第一行
用法如下:

class Person { 
    public static void prt(String s) { 
       System.out.println(s); 
    } 
   
    Person() { 
       prt("父类·无参数构造方法: "+"A Person."); 
    }//构造方法(1) 
    
    Person(String name) { 
       prt("父类·含一个参数的构造方法: "+"A person's name is " + name); 
    }//构造方法(2) 
} 
    
public class Chinese extends Person { 
    Chinese() { 
       super(); // 调用父类构造方法(1) 
       prt("子类·调用父类”无参数构造方法“: "+"A chinese coder."); 
    } 
    
    Chinese(String name) { 
       super(name);// 调用父类具有相同形参的构造方法(2) 
       prt("子类·调用父类”含一个参数的构造方法“: "+"his name is " + name); 
    } 
    
    Chinese(String name, int age) { 
       this(name);// 调用具有相同形参的构造方法(3) 
       prt("子类:调用子类具有相同形参的构造方法:his age is " + age); 
    } 
    
    public static void main(String[] args) { 
       Chinese cn = new Chinese(); 
       cn = new Chinese("codersai"); 
       cn = new Chinese("codersai", 18); 
    } 
}

运行结果:

父类·无参数构造方法: A Person.
子类·调用父类”无参数构造方法“: A chinese coder.
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
子类:调用子类具有相同形参的构造方法:his age is 18

从本例可以看到,可以用super和this分别调用父类的构造方法和本类中其他形式的构造方法。

上一篇下一篇

猜你喜欢

热点阅读