super关键字

来源:互联网 发布:java图形输出的编程题 编辑:程序博客网 时间:2024/04/30 22:00

1、this
调用本类的成员变量:this.属性
调用本类的成员方法:this.方法
调用本类的其他构造方法:this();或this(实参列表);//只能写在构造方法的第一行
☆当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量是成员

2、super:在子类中使用
调用父类的非私有的成员变量:super.属性
调用父类的非私有的成员方法:super.方法
调用父类的非私有的构造方法:super();或super(实参列表);//只能写在构造方法的第一行

注意:
☆当子父类出现同名成员(成员变量和成员方法)时,可以用super进行区分是父类的成员
super.属性和成员方法时的追溯不仅限于直接父类,也可以调用祖宗类的属性和方法,但是super()和super(实参)只能追溯到直接父类的构造器
super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
注意:一个构造方法中this()和super()不能同时出现,因为都要求写在第一行

3、总结
为了可读性,可以通过是否使用this.和super.明确区分使用的是局部变量、本类成员变量、父类成员变量
1、什么时候必须使用this
(1)当某个方法有局部变量和成员变量重名时,如果你想要表示是成员变量,那么就需要加this
(2)当在构造方法中,想要调用本类的另一个构造方法,需要使用this()或this(实参)

4、什么时候必须是super
(1)当子类有成员(变量或方法)与父类的成员重名时,如果你想要表示的是父类的成员,那么就需要加super
(2)在子类的构造方法中,如果想要通过父类的构造方法为属性初始化时,需要使用super(实参)
从父类继承的私有属性,可以通过调用父类的构造方法为它初始化

例如:
(1)当形参与本类成员变量重名时,如果在方法内部需要使用本类成员变量,必须添加this来表明该变量是本类成员

public Person(String name, int age) {        this.name = name;        this.age = age;    }

(2)当子父类出现同名成员(成员变量和成员方法)时,如果想要使用父类的成员时必须用super进行区分

//重写父类的say()方法    public String say(){        //此时出现了子类和父类重名的方法,如何区分是父类的方法呢?        //可以使用super关键        return super.say() + ",id="+id + ",score="+score;//如果不写super,就死循环    }

(3)当方法的形参、本类成员变量、父类成员变量都重名时,那么

public void print(String name){        System.out.println(name);//如果此时没加super和this,那么表示本类中的局部变量        System.out.println(super.getName());//现在只能通过这种方式来访问父类的name        System.out.println(this.name);//这个表示本类的成员变量    }

(4)如果没有重名问题,就可以省略this.和super.,写不写都指的是同一个

class A{    private String name;    private int num;    public A(String name){        this.name=name;//局部变量与成员变量重名,必须加this区分    }    public String getName(){        return name;//没重名问题,可以省略this    }    public int getNum(){        return num;//没重名问题,可以省略this    }}class SubClass extends A{    private String name;    public SubClass(String name){        super(name);//父类没无参构造,必须手动写super(实参)    }    public void test(){        System.out.println(name);        System.out.println(this.name);//没局部变量与成员变量重名,因此name和this.name此时都是代表本类的成员变量        System.out.println(super.getName());//但是和父类成员变量重名,需要使用super区分    }    public void print(String name){        System.out.println(name);//局部变量与成员变量重名,如果此时没加super和this,那么表示本类中的局部变量        System.out.println(super.getName());//现在只能通过这种方式来访问父类的name        System.out.println(this.name);//局部变量与成员变量重名,必须使用this表示本类的成员变量        System.out.println(this.getNum());//注意,这里因为本类中没getNum()方法,因此this.getNum和super.getNum()都是指的是同一个方法        System.out.println(super.getNum());//只不过使用super,是明确调用父类的,使用this表示从父类继承过来的        //但是如果此时子类重写了getNum()方法,那么就不一样了this.getNum()就表示子类重写过的,super.getNum()是父类原先的    }}

5、this与super区别

这里写图片描述

4、子类对象的实例化过程
这里写图片描述

0 0
原创粉丝点击