Java中super的几种使用方法并与this的差别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java中super的⼏种使⽤⽅法并与this的差别
1. ⼦类的构造函数假设要引⽤super的话,必须把super放在函数的⾸位.
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.
class Country {
String name;
void value() {
name = "China";
}
}
class City extends Country {
String name;
void value() {
name = "Hefei";
super.value();//不调⽤此⽅法时,返回的是⽗类的成员变量的值null
System.out.println(name);
System.out.println();
}
public static void main(String[] args) {
City c=new City();
c.value();
}
}
为了在⼦类中引⽤⽗类中的成员变量name和⽅法value()。
在代码中使⽤了super、和super.value(),若不调
⽤super.value()时。
返回⽗类成员变量默认值null,调⽤此⽅法时,super.value()⽅法把成员变量name赋值为China,再利⽤调⽤⽗类的成员变量的值。
另外,要注意的是调⽤的是成员变量的值,
class Country {
String name="xianfan";
String value(String name) {
name = "China";
return name;
}
}
class City extends Country {
String name;
String value(String name) {
name = "Hefei";
super.value("失败");//不调⽤此⽅法时,返回的是⽗类的成员变量的值null
System.out.println(name);
System.out.println();
return name;
}
public static void main(String[] args) {
City c=new City();
c.value("成功");
}
}
结果为:Hefei
xianfan
此时。
返回的值是⽗类成员变量的值xianfan,⽽此时的super.value()⽅法是不起作⽤的。
3.⽤super直接传递參数:
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的异同:
1)super(參数):调⽤基类中的某⼀个构造函数(应该为构造函数中的第⼀条语句)
2)this(參数):调⽤本类中还有⼀种形成的构造函数(应该为构造函数中的第⼀条语句)
3)super: 它引⽤当前对象的直接⽗类中的成员(⽤来訪问直接⽗类中被隐藏的⽗类中成员数据或函数,基类与派⽣类中有同样成员定义时如:super.变量名 super.成员函数据名(实參)
4)this:它代表当前对象名(在程序中易产⽣⼆义性之处,应使⽤this来指明当前对象;假设函数的形參与类中的成员数据同名,这时需⽤this来指明成员变量名)
5)调⽤super()必须写在⼦类构造⽅法的第⼀⾏,否则编译不通过。
每⼀个⼦类构造⽅法的第⼀条语句,都是隐含地调⽤super(),假设⽗类没有这样的形式的构造函数。
那么在编译的时候就会报错。
6)super()和this()类似,差别是,super()从⼦类中调⽤⽗类的构造⽅法,this()在同⼀类内调⽤其他⽅法。
7)super()和this()均需放在构造⽅法内第⼀⾏。
8)虽然能够⽤this调⽤⼀个构造器,但却不能调⽤两个。
9)this和super不能同⼀时候出如今⼀个构造函数⾥⾯,由于this必定会调⽤其他的构造函数。
其他的构造函数必定也会有super语句的存在,所以在同⼀个构造函数⾥⾯有同样的语句。
就失去了语句的意义,编译器也不会通过。
10)this()和super()都指的是对象,所以,均不能够在static环境中使⽤。
包含:static变量,static⽅法,static语句块。
11)从本质上讲,this是⼀个指向本对象的指针, 然⽽super是⼀个Javakeyword。
转⾃。