18-面向对象-super关键字
super关键字
super代表父类的引用,用于访问父类的属性、方法、构造器
基本语法
1) 访问父类的属性,但不能访问父类的private属性
super.属性名
2) 访问父类的方法,但不能访问父类的private方法
super方法名
3) 访问父类的构造器,注意只能放在构造器的第一句
super(参数列表)
public class Super01 { public static void main(String[] args) { B b = new B(); b.hi(); b.ok(); } } class A{ public int n1 = 100; protected int n2 = 200; int n3 = 300; private int n4 = 400; public A() { System.out.println("父类A的构造方法"); } public void test100(){ System.out.println("欢迎来到父类A的test100方法"); } protected void test200(){} void test300(){} private void test400(){} } class B extends A{ //访问父类的构造器,super(参数列表),注意只能放在构造器的第一句 public B(){ super(); System.out.println("子类B的构造方法"); } //访问父类的属性,但不能访问父类的private属性 public void hi(){ System.out.println("n1 = " + super.n1 + "\tn2 = " + super.n2 + "\tn3 = " + super.n3); //System.out.println("n4 = " + super.n4); 错误,n4可以在com.hspedu.super_.A中访问private } //访问父类的方法,但不能访问父类的private方法 public void ok(){ super.test100(); //super.test400(); 错误,test400()可以在com.hspedu.super_.A中访问private } }
super带来的好处 / 细节
1) 调用父类的构造器时,分工明确,父类属性由父类初始化,子类属性由子类初始化
2) 当子类中有和父类的属性和方法重名时,为了访问父类的属性和方法,必须要通过super关键字,如果没有重名,则使用super、this访问的效果时一样的。
3) super的访问不限于直接父类,如果爷爷类和本类中有同名的属性和方法,也可以使用super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的属性和方法,使用super则遵循就近原则,当然也需要遵守访问权限的相关规则。
public class Super02 { public static void main(String[] args) { Graduate graduate = new Graduate(); graduate.hi(); graduate.ok(); } } class Student{ public String name; public void show(){ System.out.println("欢迎来到父类Student的show方法"); } } class Graduate extends Student{ public int age;
//当子类中有和父类的属性和方法重名时,为了访问父类的属性和方法,必须要通过super关键字 //如果没有重名,则使用super、this访问的效果时一样的 public void hi(){ System.out.println("直接调用父类的属性:name = " + name); System.out.println("使用this调用父类的属性:name = " + this.name); System.out.println("使用super调用父类的属性:name = " + super.name); } public void ok(){ show(); this.show(); super.show(); } }
这里需要注意:在子类中调用show方法时,一般顺序是:
a) 先找本类中是否有show方法,如果有则调用
b) 如果没有,则在父类中查找是否有show方法(如果有,则进行调用)
c) 如果父类没有,则继续查找父类的父类,是否有show方法,以此类推直到Object类
提示:
如果在查找方法的过程中,找到了,但是不能访问,则报错
如果在查找方法的过程中,没有找到,则提示方法不存在
super() 和 this() 的比较
super() 是调用父类的构造器,this() 是调用本类的构造器,这两个都只能放在构造器的第一行,因此不能同时出现在一个构造器。