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、子类对象的实例化过程
- super关键字
- 关键字super
- super 关键字
- super关键字
- super关键字
- 关键字super
- super关键字
- super关键字
- Super关键字
- 关键字super
- super关键字
- super 关键字
- super关键字
- super关键字
- super关键字
- Super关键字
- super关键字
- super关键字
- POJ 1830 开关问题
- React-Native ListView
- 补充的linux命令
- 图像处理算法之水面倒影特效
- 奇偶数组分割,原地进行
- super关键字
- springmvc+shiro
- 关于小白练级
- 【issue analysis】嵌入式系统软件书写卡顿问题
- Linux命令使用以及vim编辑器的使用
- 微服务(Microservice)那点事
- [CQOI2009] 循环赛 - 暴力出奇迹
- Android Studio常用快捷键
- Java中矩阵运算(math3的使用)