面向对象的特点:
(1)封装性
(2)继承性
(3)多态性
-
继承性的作用
能够避免类的重复编写,在已有的基础上继续进行功能的扩充。 -
继承性的实现——extends关键字
语法:class 子类(又称为“派生类”) extends 父类(又称为“超类”){}
(人类可以走、跑、吃等动作,教师、学生和工人除此之外还可以具有其他的技能,比如能够教授学生等,同时本科生、研究生和博士生除了具有学生的属性和方法外,还具有更加额外的能力。)
注:子类可以继承父类的所有属性和方法,并且还可以对父类进行修改拥有自己的属性和方法(举一个简单的例子:研究生学习导师的方向,可以“继承”导师已有的方法和技巧,同时也可以修改或者拓展导师的技巧,拥有属于自己的技巧,发表论文,(祝我)顺利毕业!!!)。因为子类可以继承父类的属性和方法,所以实现了代码重用。
- 继承的使用限制
(1)只允许单继承,不允许多继承,但是可以多层继承(层数也不宜过多)。
(2)子类对象在进行实例化前,一定是先要实例化父类对象的,所以一般是默认先调用父类的构造方法(对父类对象进行实例化)之后,再调用子类的构造方法,对子类的对象进行实例化。(其中用到了关键字super,对改关键字的解释见(https://blog.csdn.net/weixin_41550144/article/details/86469234))
代码示例
class Person{
public Person(String name,int age) {//有参构造
System.out.println("**Person父类**");
}
}
class Student extends Person{
public Student(String name,int age,String school){
super(name,age);//调用父类的构造方法(应该输出:**Person父类**)
System.out.println("**Student子类**");
}
}
//主方法
public class TestDemo{
public static void main(String[] args){
new Student("张三",20,"北大");
}
}
运行结果:
**Person父类**
**Student子类**
注意
- 在实例化子类对象时先实例化父类对象的原因,就是子类中会默认调用了父类的无参构造方法;
- 当父类中不存在无参构造方法,只有有参构造时,如上例所示,就必须明确的写出语句<super(name,age);>来调用父类的构造方法,并且要放在首行;
(3)在继承时,子类继承父类非私有操作属于显示继承,是可以直接调用的;但是父类用private修饰的私有操作属于隐式继承,需要通过该私有操作对外留出的调用接口进行操作,例如setter、getter方法。
代码示例:
class Person{
private String name;//私有属性
public void setName(String name) {
this.name=name;
}
public String getName() {
return this.name;
}
}
class Student extends Person{
public void print() {
System.out.println(getName());//私有属性需要通过留有的getter接口进行调用
}
}
//主方法
public class TestDemo{
public static void main(String[] args){
Student student=new Student();//对象实例化
student.setName("张三");
student.print();
System.out.println(student.getName());
}
}
运行结果:
张三
张三
总结三点:
- 继承的目的是为了扩展父类功能,并且避免代码的重复;
- 实例化时均是先实例化的父类对象,而后实例化子类对象;
- 只能单继承,不可以多重继承,但是可以多层继承(B继承A,C继承B)。
——————————————————这是一条分割线—————————————————————
覆写(override)
既然说到了继承性,就要解释下覆写操作,比较容易理解。
当子类定义了和父类相同的属性和方法时,就是覆写。
- 方法覆写(重点,经常用到)
子类定义了和父类方法名称、参数类型和个数完全相同的方法,就是覆写。
注:
- 当调用一个方法时,若该方法被子类覆写了,那么调用的方法就是覆写过的方法。
- 被覆写的方法修饰符不能够比父类拥有更为严格的访问控制权限。
以后编写类时,属性就用private,方法就用public
访问控制权限列表:
public 允许来自任何类的访问;
default 允许来自同一个包中的类的访问;
private 只允许来自该类内部的方法访问,不允许任何来自该类外部的访问。
protected 允许来自同一包中的任何类以及该类的任何地方的任何子类的方法访问;
- 对比重载和覆写的区别:
No | 区别 | 重载 | 覆写 |
---|---|---|---|
1 | 表达方式 | OverLoading | Override |
2 | 概念 | 方法名称相同,但是参数类型或个数不同 | 方法名称、返回值类型、参数类型和个数完全相同 |
3 | 范围 | 发生在同一个类中 | 发生在继承关系中 |
4 | 限制 | 没有权限要求 | 被覆写的方法不能有比父类更为严格的访问控制权限 |
- 属性覆写
子类定义了与父类完全一样的属性,一般不提倡这种做法。 - super关键字
使用super.方法()、super.属性就可以明确调用父类中的方法和属性。
(相关super关键字以及super和this关键字的区别请见https://blog.csdn.net/weixin_41550144/article/details/86469234)