Java(10)this关键字与super关键字
this关键字
this代表当前类的引用对象(代表当前类的一个对象)
案例:
-
源文件Demo.java:(与下面文件在同一个包中)
public class Demo { private int age=23; public void SetAge(int age) { this.age=age; } public int GetAge() { return age;//其实这里隐藏了this } }
-
源文件Hello.java:
public class Hello { public static void main(String[] args) { Demo d=new Demo(); d.SetAge(34); int c=d.GetAge(); System.out.println(c);//输出了34 } }
super关键字
super关键字可用于访问父类中定义的属性、方法以及可用在子类构造器中调用父类的构造器。当子父类出现同名成员时,可以用this和super区分,super的追溯不仅限于直接父类。
访问父类中定义的属性
package test;
public class GrandFather { //GrandFather为Son类的父类中的父类
protected int age; //设为protected以便于子类对其的访问
}
package test;
public class Father extends GrandFather{ //Father为Son类的父类
public void test1(){ //test1()方法通过super关键字访问GrandFather类的age属性
System.out.println(super.age);
}
}
package test;
public class Son extends Father { //Son类
public void test2() { //test2()方法通过super关键字访问GrandFather类的age属性
System.out.println(super.age);
}
}
//用来运行的类:
class RunTool{
public static void main(String[] args) {
Father a =new Father();
a.test1();
Son b=new Son();
b.test2();
}
}
/*运行结果为:
0
0
*/
访问父类中的方法
package test;
public class GrandFather {
public void helloSuper(){
System.out.println("I love you");
}
}
package test;
public class Father extends GrandFather{
public void test1(){
super.helloSuper();
}
}
package test;
public class Son extends Father {
public void test2() {
super.helloSuper();
}
}
//运行的类:
class RunTool{
public static void main(String[] args) {
Father a =new Father();
a.test1();
Son b=new Son();
b.test2();
}
}
/*运行结果为:
I love you
I love you
*/
在子类构造方法中调用父类的构造方法
- 子类中所有的构造器默认都会访问父类中空参数的构造。
- 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行。
- 如果子类构造器中既无法显式调用父类或本类的构造器,且父类中没有无参的构造器,则编译会出错。
案例1
//子类中所有的构造器默认都会访问父类中空参数的构造。
package test;
public class Father{
public Father(){
System.out.println("这里是Father类的构造方法");
}
}
package test;
public class Son extends Father {
}
class RunTool{
public static void main(String[] args) {
Son b=new Son();
/*new生成对象的时候,实际上调用了该类自身的构造方法,如
Son b=new Son();其实是调用了public Son(){}构造方法,
而Son类自身的构造方法又会去调用父类的无参构造方法,因此运行了语句:
System.out.println("这里是Father类的构造方法");
*/
}
}
/*运行结果为:
这里是Father类的构造方法
*/
案例2
报错的:
/*
当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行。*/
package test;
public class Father{
public Father(String name,Boolean gender){
System.out.println(name+" : "+gender);
}
public Father(String name,int age){
System.out.println(name+" : "+age);
}
}
package test;
public class Son extends Father {
}//会显示错误: There is no default constructor available in 'test.Father'
不报错的:
package test;
public class Father{
public Father(String name,Boolean gender){
System.out.println(name+" : "+gender);
}
public Father(String name,int age){
System.out.println(name+" : "+age);
}
}
package test;
public class Son extends Father {
public Son(){
super("krystal",21);// 这一个语句必须放在构造器方法体的第一行
System.out.println("I love you");
}
}
//运行类:
class RunTool{
public static void main(String[] args) {
Son b=new Son();
}
}
/*运行结果为:
krystal : 21
I love you
*/