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 
*/

在子类构造方法中调用父类的构造方法

  1. 子类中所有的构造器默认都会访问父类中空参数的构造。
  2. 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,且必须放在构造器的第一行。
  3. 如果子类构造器中既无法显式调用父类或本类的构造器,且父类中没有无参的构造器,则编译会出错。
案例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
*/
posted @ 2020-08-29 07:06  Whatever_It_Takes  阅读(151)  评论(0编辑  收藏  举报