面向对象三大特性之继承(2)
1.什么是继承?
世间万物本就相互联系,java中的类也是如此,java中的类其实也就是对现实世界事物的抽象。而这些类之间也存在这各种关系,例如继承、依赖、关联、组合等。而其中的继承通俗理解就是子集的概念,即常说一个类继承于他的父类,也就是说他是他的父类的一个子集,学生是人类的子集,猫是动物的子集等。
在java编程中继承关系的表示就是用extends关键字。并且子类是可以继承父类所有的属性和方法,当然private修饰的除外。
2.继承的初始化顺序
当我们创建一个子类的对象时,执行顺序是如何的呢?
//父类
public class People {
public String name = "donreen";
public int age = 20;
public People(){
System.out.println(name+"是人, 今年"+age+"岁了。");
}
}
//子类
public class Student extends People{
public Student(){
System.out.println(name+"是一个学生,今年"+age+"岁了。");
}
}
//测试类
public class FirstDemo {
public static void main(String[] args){
Student stu = new Student();
}
}
通过输出结果可以看出来,先初始化父类,然后才是初始化子类。
这个执行顺序也可以通过super关键字来理解,也就是接下来要说的。
3.super关键字的使用
- 子类如果想使用父类的属性或方法,那么通过super.属性名 或 super.方法名来调用。
(如果子类中没有与父类中重名的属性或方法,也可以直接用属性名或方法名调用,不过不是很推荐,毕竟写着写着可能就混了) - 子类的构造方法中必须使用super()调用父类的构造方法,而且必须写在第一行,这也就是解释了前面的初始化顺序;
需要注意的是,如果父类中存在无参的构造方法,你会发现即使子类没有在构造方法中调用父类的构造方法,也不会报错,这是因为当父类中存在无参的构造方法时,程序会隐式的调用super()【隐式即存在这行代码,但是我们程序员看不见】;但是如果父类中没有无参的构造方法,就得我们自己去调用。
(顺便提一下,在一个类中,如果我们没写构造方法,程序会隐式地存在无参的构造方法,但是只要我们写了有参的构造方法,就不会再有无参的构造方法)