面向对象第二大特点:继承。在已有的基础上进行功能的扩充
1.继承问题的引出
消除结构上定义上的重复,引用继承,比如两个类,人和学生,学生具有人具有的所有属性,所以学生继承人就好,学生的范围比人更小更具体。
2.继承的实现
在java中继承使用extends关键字来进行实现,语法
class 子类 extends 父类
子类也称为派生类
父类也称为超类(Super class)
class Person{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public void getName() {
return this.name;
}
public void setAge(int age){
this.age = age;
}
public void getAge(){
return this.age;
}
}
class Student extends Person{
}
public class TestDemo{
public static void main(String args[]){
Student stu = new Student();
stu.setName("萌萌");
stu.setAge(6);
System.out.println(stu.getName());
System.out.println(stu.getAge());
}
}
通过上面代码可以发现,发生类继承关系后,子类可以直接执行父类的操作,可以实现代码的重用,并且子类最低也维持和父类相同的功能。
范例:子类进行功能的扩充
class Person{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public void getName() {
return this.name;
}
public void setAge(int age){
this.age = age;
}
public void getAge(){
return this.age;
}
}
class Student extends Person{
private String school;
public void setSchool(String school){
this.school = school;
}
public void getSchool(){
return this.school;
}
}
public class TestDemo{
public static void main(String args[]){
Student stu = new Student();
stu.setName("萌萌");
stu.setAge(6);
stu.setSchool("公安大学");
System.out.println(stu.getName());
System.out.println(stu.getAge());
System.out.println(stu.getSchool());
}
}
上述代码,子类实现了父类功能的扩充。
3.继承的限制
继承的子类可以对父类的操作进行共享,但继承操作也存在一些限制的。
(1)子类对象在进行实例化前,一定会首先实例化父类对象,默认调用父类的构造方法后,再调用子类的构造方法。
子类中没有任何一条语句会明确调用父类构造,在父类的构造函数还是被执行,证明实例化子类对象一定会实例化父类对象,实际上在子类的构造方法中相当于隐含了一个语句“super()”,此语句在无参时使用不使用都一样。
父类中没有提供无参构造,super必须指明父类的构造方法。
(2)java中只允许单继承,不允许多继承
一个子类只能继承一个父类,但是可以采用多层继承来模仿多继承。
(3)在进行继承时,子类会继承父类的所有结构,包括私有属性、构造方法、普通方法
所有的非私有属性是显示继承,可以直接调用。
私有属性是隐世继承,通过其他方法来调用。
子类能够使用的只有非private属性,private属性不能直接使用。
总结:
1.继承的语法和继承的目的。
2.子类对象的实例化流程,先实例化父类对象。
3.继承的限制,不允许多重继承