文章目录
- 面向对象的继承性.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属性赋值
接着,F5进入Manager的work方法,并执行
再进入m1方法
这里F5进入父类的方法,执行父类的work方法
父类方法执行完成后,调回继续执行,最终执行完。
有些人会注意到上面这部分代码怎么不执行,其实答案就在下面这段代码中。
语法规则:一个构造方法的第一行如果没有this(…);也没有显示super(…),系统会默认的调用super();
在第二行代码中,我们调用了super(…),这时系统将不会在调用默认构造器
假设我们将第一行代码放出来或是将第二行代码注释,其运行后的结果都将是下面第三张图。
但是当把两个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();,若有了将不会调用默认构造器。
返回顶部