Java 面向对象:super关键字的理解
一、Super关键字:
1. super调用父类的构造方法,必须在构造方法的第一个
2. super只能出现在子类的方法或构造方法中!
3. super和this不能同时调用构造方法!
二、this与super的区别:
1. 代表的对象不同:
this:本身调用者的这个对象,保存着调用对象的内存地址
super:代表父类的对象
2. 前提:
this:没有继承也可以使用
super:只能符合继承 条件才能使用
3.构造方法:
this() 表示本类的构造器
super() 表示父类的构造器
范例:
Person类只有有参构造
public class Person {
public Person ( String name) {
System. out. println ( "Person无参执行了" ) ;
}
protected String name = "Person" ;
public void print ( ) {
System. out. println ( "Person" ) ;
}
}
子类:Student类则需显示调用父类的构造方法
public class Student extends Person {
public String name = "Student" ;
public Student ( ) {
super ( "name" ) ;
System. out. println ( "Student无参执行了" ) ;
}
public void print ( ) {
System. out. println ( "Student" ) ;
}
public void test ( ) {
print ( ) ;
this . print ( ) ;
super . print ( ) ;
}
}
三、何时用super关键字?
1.如果父类和子类有同名属性,子类要访问父类的同名属性,需要加super关键字!
示例一,子类Vip没有父类的name属性,子类去访问父类的name:
package Day0206. Demo02;
public class Customer {
String name;
public Customer ( ) {
}
public Customer ( String name) {
this . name = name;
}
public static void main ( String[ ] args) {
Vip vip = new Vip ( "张三" ) ;
vip. shopping ( ) ;
}
}
class Vip extends Customer {
public Vip ( ) {
}
public Vip ( String name) {
super ( name) ;
}
public void shopping ( ) {
System. out. println ( this . name+ "正在购物" ) ;
System. out. println ( super . name+ "正在购物" ) ;
System. out. println ( name+ "正在购物" ) ;
}
}
结果:当子类Vip没有父类的name属性,子类可以直接通过name去访问父类的name
示例二,子类Vip有父类的name属性,子类则需要通过super.name去访问父类的name:
package Day0206. Demo02;
public class Customer {
String name;
public Customer ( ) {
}
public Customer ( String name) {
this . name = name;
}
public static void main ( String[ ] args) {
Vip vip = new Vip ( "张三" ) ;
vip. shopping ( ) ;
}
}
class Vip extends Customer {
String name;
public Vip ( ) {
}
public Vip ( String name) {
super ( name) ;
}
public void shopping ( ) {
System. out. println ( this . name+ "正在购物" ) ;
System. out. println ( super . name+ "正在购物" ) ;
System. out. println ( name+ "正在购物" ) ;
}
}
结果:当子类Vip有父类的name属性,子类则需要通过super.name去访问父类的name,此时的name即this.name值为null。
粗略的内存图如下:
2.子类访问父类的相同方法,与上面的访问同名属性类似
super.父类方法(),在父与子中有相同方法,如果在子类中想访问父类中的方法,必须使用“super.”进行区分!
四、Super关键字总结:
super表示父类的内存地址 super.属性名,访问父类的属性 super.方法名,访问父类的方法 super(实参),调用父类构造方法 super不能用在静态方法 super()只能出现在子类构造方法体的第一行!目的是创建子类对象时,初始化父类型特征 在父与子中有同名属性或者相同方法,如果在子类中想访问父类中的数据,必须使用“super.”进行区分!