本文共 3414 字,大约阅读时间需要 11 分钟。
this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
this 的用法在 java 中大体可以分为 3 种:
这种就不用讲了,this 相当于是指向当前对象本身。
形参与成员名字重名,用 this 来区分:
引用构造函数
这个和 super 放在一起讲,见下面。
super 可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
super 也有三种用法:
与 this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。
class Country { String name; void value() { name = "China"; }} class City extends Country { String name; void value() { name = "Shanghai"; super.value(); //调用父类的方法 System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); }}
运行结果:
Shanghai
Chinasuper(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。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 分别调用父类的构造方法和本类中其他形式的构造方法。
例子中 Chinese 类第三种构造方法调用的是本类中第二种构造方法,而第二种构造方法是调用父类的,因此也要先调用父类的构造方法,再调用本类中第二种,最后是重写第三种构造方法。
1.super()函数是在所有子类构造器第一行都存在的(隐式或显示的调用)。这是代表调用基类的无参构造器
2.当类不存在构造器的时候,java虚拟机是默认给类添加一个无参构造器的,但是当只存在有参构造器,不存在无参构造器的时候,虚拟机不会隐式构造无参构造器,这个时候,子类如果还隐式调用super(),就会编译出错。所以需要显示加上super(形参);形参内容根据子类决定class Parent { Parent(String name) { System.out.println("有参构造器+"+name); }}public class Child extends Parent { Child() { // super("xsj"); // 没有这个语句,就会报错 System.out.println("子类无参构造器"); } public static void main(String[] args) { Child c = new Child(); }}
转载地址:http://hslvn.baihongyu.com/