0
点赞
收藏
分享

微信扫一扫

【Java】面向对象.继承性.super关键字



文章目录

  • ​​面向对象的继承性.super关键字​​
  • ​​一、super关键字概念​​
  • ​​二、断点测试​​

​​返回顶部​​

面向对象的继承性.super关键字

一、super关键字概念

1.super不是引用类型,super中存储的不是内存地址

2.super指向的不是父类对象

3.super代表的是当前子类中的父类特征

4.super的使用:

  • 子类和父类中都有某个数据,例如:均有name属性
  • 若在子类中访问父类中的name属性 super.name
  • 方法也是如此

5.适用范围:

  • 成员方法
  • 构造方法
  • 不能用在静态方法中

6.super关键字用在构造方法中

  • 语法:super(实参);
  • 作用:通过子类的构造方法去调用父类的构造方法
  • 语法规则:一个构造方法的第一行如果没有this(…);也没有显示super(…),系统会默认的调用super();

7.super();​this();​不能共存,只能放在构造方法的第一行

8. super(...); 不会创建新的对象,只是用来给当前子类对象中的父类特征赋值或是调用父类特征。

  • 构造方法执行,不一定创建对象!

9.父类的造方法不会被继承,但是可以通过super关键字去调用

10.单例模式的缺点:(private)

  • 单例模式的的类型无法被继承

package Super关键字;
public class Employee {
String name = "张三";
//无参构造方法
public Employee() {
System.out.println("父类构造方法");
}
//含参构造方法
public Employee(String name) {
super();
this.name = name;
System.out.println(name);
}
//成员方法
public void work(){
System.out.println("员工工作了!");
}
}

public class Manager extends Employee {
String name = "李四";
//构造方法
public Manager() {
// super();
super("lisi");
}
public void work(){
System.out.println("经理工作了!");
}
// 成员方法
public void m1() {
super.work();
System.out.println(this.name);
System.out.println(name);
System.out.println(super.name);
}
}

public class 进阶076 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Manager m = new Manager();
m.work();
m.m1();
}
}

​​返回顶部​​

二、断点测试

语法规则:一个构造方法的第一行如果没有this(…);也没有显示super(…),系统会默认的调用super();

首先 F5 进入 Manager构造方法对父类的name属性赋值

【Java】面向对象.继承性.super关键字_super关键字

【Java】面向对象.继承性.super关键字_super关键字_02

【Java】面向对象.继承性.super关键字_java_03

接着,F5进入Manager的work方法,并执行

【Java】面向对象.继承性.super关键字_构造方法_04

【Java】面向对象.继承性.super关键字_super关键字_05

再进入m1方法

【Java】面向对象.继承性.super关键字_super关键字_06

这里F5进入父类的方法,执行父类的work方法

【Java】面向对象.继承性.super关键字_super关键字_07

【Java】面向对象.继承性.super关键字_super关键字_08

父类方法执行完成后,调回继续执行,最终执行完。

【Java】面向对象.继承性.super关键字_java_09


【Java】面向对象.继承性.super关键字_构造方法_10


【Java】面向对象.继承性.super关键字_java_11


有些人会注意到上面这部分代码怎么不执行,其实答案就在下面这段代码中。

【Java】面向对象.继承性.super关键字_java_12


语法规则:一个构造方法的第一行如果没有this(…);也没有显示super(…),系统会默认的调用super();

在第二行代码中,我们调用了super(…),这时系统将不会在调用默认构造器

假设我们将第一行代码放出来或是将第二行代码注释,其运行后的结果都将是下面第三张图。

【Java】面向对象.继承性.super关键字_父类_13

【Java】面向对象.继承性.super关键字_super关键字_14

【Java】面向对象.继承性.super关键字_super关键字_15


但是当把两个super都放出来时,系统会报错:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Constructor call must be the first statement in a constructor

at Super关键字.Manager.<init>(Manager.java:9)
at Super关键字.进阶076.main(进阶076.java:37)

因为super()或this()只能放在构造器的首行,当有两个构造器需要被调用时,到底那个在首行就会产生歧义,所以才会规定:当一个构造方法的第一行如果没有this(…);也没有显示super(…),系统会默认的调用super();,若有了将不会调用默认构造器。

​​返回顶部​​


举报

相关推荐

0 条评论