[面向对象]super关键字

mac2026-03-31  6

super 关键字

文章目录

super 关键字1.super关键字1.1**this & super 的比较**1.2super访问成员的格式1.3**super的特点**1.4**面试题**

1.super关键字

能帮助子类快速初始化从父类继承下来的成员变量

1.1this & super 的比较

关 键 字thisthis表示当前对象,是一个引用,意思是:“我的”,每次创建对象都会在堆区创建一个相应的this和引用指向同一个人堆区空间super父类存储空间的标识,可以理解为父类的对象(但不是对象) //super不是对象的证明 //思路:创建一个方法Method(参数列表) //如果是对象,代入方法的参数列表是不会报错的 class Son extends Father { public void show() { super.show(); method(this); //method(super); //报错:Syntax error on token "super", delete this token } public void method(Father f) { System.out.println("hello"); } }

1.2super访问成员的格式

//成员变量 super.成员变量; //成员方法 super.成员方法; //构造方法 super(参数列表) public Student(String name, int age, String school) { // 访问父类的带参构造方法,帮助子类初始化父类的成员,利用super super(name, age); this.school = school; }

1.3super的特点

在子类构造方法默认会有:super( );,所以在访问子类构造方法前会访问父类无参构造方法,并在此前加载所有静态成员和静态代码块访问子类构造方法时会访问父类构造方法,但不会创建父类对象,使用( this / super ) 方法构造方法相当于调用普通方法,新的对象使用new关键字任何一个构造方法第一句话都先会访问父类无参构造方法this/super必须出现在构造方法体内的第一句因为上述条件,所以this & super无法共存super可以访问父类的成员变量 成员方法和构造方法static上下文不能出现this super(static在方法区,在类加载的时候已经加载完毕,是不变的,this super在堆区,是在static之后才调用加载的。)

1.4面试题

//this super 的运用 class Father { int num = 30; public void show() { int num = 40; System.out.println(num); } } class Son extends Father { int num = 20; public void show() { int num = 10; System.out.println(num); //结果是 10 System.out.println(this.num); //结果是 20 System.out.println(super.num);//结果是 30 super.show(); //结果是 40 } } //以下程序的输出结果是: c //A. 10 B. 20 //C. 编译报错 D. 0 public class SuperDemo03 { public static void main(String[] args) { Zi zi = new Zi(); System.out.println(zi.num); } } class Fu { int num = 10; public Fu(int num) { this.num = num; } } class Zi extends Fu { int num = 20; } //父类因为创建了全餐构造方法,系统删除了默认编写的无参构造方法 //子类访问构造方法前,一定会访问父类的无参构造方法 //当父类没有无参构造方法就会报错 //父类和子类均有自己的静态代码块、构造方法的运行顺序 //结论: //子类使用get方法创建对象时: //父类静态代码块 —> 子类静态代码块 —> 父类无参构造 —> 子类有参构造 //子类使用构造方法创建对象时: //父类静态代码块 —> 子类静态代码块 —> 父类无参构造 —> 子类无参构造 //静态代码块只会执行一次 package classwork; public class ClassWork06 { public static void main(String[] args) { Son s = new Son("Tom", "男"); System.out.println(s.getGender()); Son s1 = new Son(); System.out.println(s.getGender()); } } class Father { protected String name; protected static int age; static { System.out.println("我是父类静态代码块"); age = 19; } public Father() { super(); System.out.println("我是父类无参构造方法"); } public Father(String name) { super(); this.name = name; System.out.println("我是父类全参构造方法"); } } class Son extends Father { private String gender; static { System.out.println("我是子类静态代码块"); } public Son() { super(); System.out.println("我是子类无参构造方法"); } public Son(String name,String gender) { super(name); this.gender = gender; System.out.println("我是子类全参构造方法"); } } //结果: //我是父类静态代码块 //我是子类静态代码块 //我是父类无参构造方法 //我是子类全参构造方法 //男 //我是父类无参构造方法 //我是子类无参构造方法 //男
最新回复(0)