继承的概念
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类(也称作超类、基类等),子类(派生类)会自动拥有父类所有可继承的属性和方法。
继承的使用
地位:继承是面向对象最显著的一个特性。
定义:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
语法:
class 父类 { } class 子类 extends 父类 { } |
【示例】使用extend实现继承
// 父类:Person类 class Person { // 成员变量 private String name; // set和get方法 public String getName() { return name; } public void setName(String name) { this.name = name; } // 成员方法 public void eat() { System.out.println("eat..."); } } // 子类,Teacher类 public class Teacher extends Person { // 成员变量 private String title; // 职称 // set和get方法 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } // 成员方法 public void teaching() { System.out.println("授课..."); } } // 测试类 public class InheritanceDemo { public static void main(String[] args) { Teacher t = new Teacher(); t.setName("周老师"); // 父类属性 t.setTitle("JavaSE阶段讲师"); // 子类属性 t.eat(); // 父类方法 t.teaching(); // 子类方法 System.out.println("name:"+t.getName()+" age:"+t.getAge()); } } |
从运行结果不难看出,子类虽然没有定义name属性和eat()方法,但是子类却能访问。
结论:
1)子类在继承父类的时候,会自动拥有父类的属性和方法
2)子类还可以拥有自己的属性和方法,即子类可以对父类进行扩展!
继承的使用要点
使用继承的好处
1)提高了代码的复用性,提高软件开发效率。
2)让类与类之间产生了关系,提供了多态的前提。
继承的注意点
1)java只支持单继承,不允许多继承,也就是说一个类只能有一个直接父类。
2)java支持多层(重)继承,即一个类的父类可以再去继承另外的父类(继承体系)。
3)如果定义一个类时,没有使用extends,则它的父类默认是:java.lang.Object。
方法的重写(override)
什么时候需要重写?
答:当父类的方法不能满足子类的需求时,我们可以在子类中重写父类的方法。
方法重写需要符合以下三个要点:
==,要求重写方法的“方法名”和“形参列表(个数和类型)”必须一模一样!
>=(强调权限关系),要求子类重写方法的修饰符权限必须大于等于父类被重写方法的修饰符权限。
public > protected > default > private
注意:
1)父类中被private修饰的方法不能被子类重写!
2)父类被static修饰的方法不能被子类重写!
<=,返回值类型和异常类型,子类小于等于父类,“<=”强调的是辈分关系
如果返回值类型为“基本数据类型”、“字符串类型”和“void”,那么要求子类重写方法的返回值类型必须和父类被重写方法的返回值类型保持一致!
如果返回值类型为“引用数据类型”(不包含“字符串”),要么子类重写方法的返回值类型和父类被重写方法的返回值类型保持一致。要么子类重写方法的返回值类型为父类被重写方法的返回值类型的子类。
【示例】方法重写案例
// 父类 class Parent { public void show(){ System.out.println("父类中的 show方法执行"); } } // 子类 class Child extends Parent { // 子类重写父类的show方法 public void show(){ System.out.println("子类中的 show方法执行"); } } public class ExtendsMethodDemo { public static void main(String[] args) { Child p = new Child(); p.show(); // 执行的是子类的show方法 } } |
如果子类方法需要使用父类方法的功能,可使用super关键字来调用父类方法,该关键字引用了当前对象的父类对象。这样,即沿袭了父类的功能,又定义了子类特有的功能 (super关键字的使用和this非常相似)。
方法重写与重载的应用:
区别点 | 方法重载 | 方法重写 |
英文名 | overload | override |
范围 | 发生在同一个类中 | 发生在继承关系中 |
定义 | 方法名相同、形参列表相同 | 方法名相同、形参列表相同 |
对访问权限没有要求 | 访问权限,子类大于等于父类 | |
对返回值类型和异常类型没有要求 | 返回值类型和异常类型,子类小于等于父类 |