面向对象编程的有三大特性,分别是继承,封装,多态。这里就详细介绍下什么是继承,以及和继承相关的概念。
继承
继承是面向对象三大特性之一,使用关键字extends实现,写在类名的后面。作用是提高代码的复用率,方便我们建立模型,有利于对现有的类进行扩展。
举例:建立一个Person类,student类继承Person类
class Person{
int age;
String name;
}
class student extends Person{
}
在继承中,继承的一方称作子类,被继承的一方称作父类。子类在继承父类后可以获得父类的所有属性和方法。
注:
- Java中只存在单继承,因此不用考虑菱形继承之类的问题。至于多继承这方面则交给了接口(interface)去实现。
- 子类无法继承父类的构造方法以及父类中被private修饰的属性和方法
- 一个类如果没有写继承,则默认继承Object类
重写(Override)
子类继承父类的方法后不想按照父类的方法执行时,就可以用Override去重写父类的方法
举例(以上面代码来扩展):
class Person{
int age;
String name;]
void takeRest{
System.out.println("晚上要睡觉");
}
}
class student extends Person{
@Override
void takeRest{
System.out.println("通宵一时爽,一直通宵一直爽");
}
}
从上面代码不难看出,方法的重写就是在子类中写一个和父类一样的方法(包括方法名和参数),至于要实现什么就自己写。
注:
- @Override可以省略不写。
- 子类重新的方法访问权限必须大于等于父类,参数类型,声明异常的类型必须小于等于父类。
- static方法不能被重写。
super关键字
super可以看做是一个指针,用来指向父类对象,通过super来父类中的属性,方法。
举例(同上):
class Person{
int age;
String name;]
void takeRest{
System.out.println("晚上要睡觉");
}
}
class student extends Person{
@Override
void takeRest{
System.out.println("通宵一时爽,一直通宵一直爽");
}
public student(int age,String name){
super();
this.age = age;
this.name = name;
}
}
子类通过super来调用父类中的普通方法,没有位置限制,随意调用。
在子类的构造方法中,第一行默认为super(),若是没有写(可以不写),Java也会默认调用super(),用来调用父类的无参构造方法。
继承树顺序
前面说过,每个类都存在继承关系(没写extends的默认继承Object),同时也存在多重继承(举例:你继承你的父母,你的父母又继承你的爷爷奶奶,依次向上)。因此,理清继承的顺序十分重要。
属性,方法继承顺序:
- 先从最底层的子类开始寻找。
- 找不到再依次向上找,直至Object,还没有则报错。
- 在这个过程中只要找到就结束寻找。
构造方法继承顺序:
- 和上面相反,从Object开始寻找
- 再依次向下寻找,直至子类。
题外话:
继承的主要作用就是提高代码的复用率,减少代码量。而在Java中除了继承之外还有一中方法能够实现继承的作用,这个方法就是组合。
组合
组合的核心思想是把父类对象做为子类的属性,子类通过调用这个属性来调用父类中的属性以及方法。
同样使用上面的代码来作为示例:
class Person{
int age;
String name;
void Rest(){
System.out.println("晚上要睡觉");
}
public Person(int age, String name){
super();
this.age = age;
this.name = name;
}
}
class Teacher{
Person p = new Person();
public Teacher(Person p){
super();
this.p = p;
}
}
class Student{
Person p1 = new Person();
public Student(int age,String name){
super();
this.p1.name =name;
this.p1.age = age;
}
}
public class Test{
public static void main(String args[]){
Teacher tea = new Teacher();
tea.p.Rest();
Student stu = new Student(20,"zzl");
stu.p1.Rest;
}
}
对代码进行对比就能比较直观的了解继承和组合的区别。组合是在子类中创建一个父类对象,等需要调用父类方法和属性时通过这个对象去调用。
对于使用组合的类创建构造方法有两种方式:
- 直接使用父类的属性,this指针直接指向父类属性。(上面Student类)
- 构造父类对象,this指针指向对象。这种需要在父类中创建好构造方法。(上面Teacher类)
虽说组合用起来比继承更加的灵活,但是对于初学者来说,一旦遇到较为复杂的项目是,对于组合中逻辑不易理解,而继承则更为直观,逻辑也更加明朗。
面向对象其余两篇的链接:
面向对象(二):封装
面向对象(三):多态