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访问的效果时一样的。
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类
提示:
如果在查找方法的过程中,找到了,但是不能访问,则报错
如果在查找方法的过程中,没有找到,则提示方法不存在
标签:访问,18,void,面向对象,父类,super,public,属性 From: https://www.cnblogs.com/REN-Murphy/p/17639933.html