本文共 3408 字,大约阅读时间需要 11 分钟。
"this"作为一个特殊的关键字,它的规则如下:
1.可以表示构造函数传递。this(a,b)表示调用另外一个构造函数。这里面的this就是一个特殊语法,不是变量,没有什么类型。
2.可以在一个类的非static成员内部使用,表示当前这个对象。此时,this就是一个final的普通变量,它有静态类型,就是这个类本身;它有动态类型,就是当前这个对象的类型。你可以对它调用成员函数,把它传递给别的函数等。"super"和"this"类似,但是也有不同的地方:
1.表示调用父类的构造函数。也是一个特殊语法,不是变量,没有什么类型。2.可以在一个类的非static成员内部使用。比如super.method()。
但是,注意,这个super.method()只是长得跟some_var.method()一样,一个语法糖而已。实质上,"super"根本不是一个变量。使用中有一些需要注意:
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Base { Base() { System.out.println( "Base" ); } } public class Checket extends Base { Checket() { super (); //调用父类的构造方法,一定要放在方法的首个语句 System.out.println( "Checket" ); } public static void main(String argv[]) { Checket c = new Checket(); } } |
如果想用super继承父类构造的方法,但是没有放在第一行的话,那么在super之前的语句,肯定是为了满足自己想要完成某些行为的语句,但是又用了super继承父类的构造方法。那么以前所做的修改就都回到以前了,就是说又成了父类的构造方法了。
2.在Java中,有时还会遇到子类中的成员变量或方法与父类中的成员变量或方法同名。因为子类中的成员变量或方法名优先级高,所以子类中的同名成员变量或方法就隐藏了父类的成员变量或方法,但是我们如果想要使用父类中的这个成员变量或方法,就需要用到super。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Country { String name; void value() { name = "China" ; } } class City extends Country { String name; void value() { name = "Hefei" ; super .value(); //不调用此方法时,super.name返回的是父类的成员变量的值null System.out.println(name); System.out.println( super .name); } public static void main(String[] args) { City c= new City(); c.value(); } } |
为了在子类中引用父类中的成员变量name和方法value(),在代码中使用了super、super.name和super.value(),若不调用super.value()时,super.name返回父类成员变量默认值null,调用此方法时,super.value()方法把成员变量name赋值为China,再利用super.name调用父类的成员变量的值。
3.用super直接传递参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class Person { public static void prt(String s) { System.out.println(s); } Person() { prt( "A Person." ); } Person(String name) { prt( "A person name is:" + name); } } public class Chinese extends Person { Chinese() { super (); // 调用父类构造函数(1) prt( "A chinese." ); // (4) } 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( "kevin" ); cn = new Chinese( "kevin" , 22 ); } } |
结果为:
A Person.
A chinese.
A person name is:kevin
his name is:kevin
A person name is:kevin
his name is:kevin
his age is:22
在这段程序中,this和super不再是像以前那样用“.”连接一个方法或成员,而是直接在其后跟上适当的参数,因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同形式的构造函数,如1和2处。this后加参数则调用的是当前具有相同参数的构造函数,如3处。当然,在Chinese的各个重载构造函数中,this和super在一般方法中的各种用法也仍可使用,比如4处,你可以将它替换为“this.prt”(因为它继承了父类中的那个方法)或者是“super.prt”(因为它是父类中的方法且可被子类访问),它照样可以正确运行。
4.super和this的异同:
本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/4360243.html,如需转载请自行联系原作者