继承的概念
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
生活中的继承, 儿子继承父亲的财产, 父亲的财产可以给儿子
程序中的继承: 子类 继承父类的属性和方法
类的继承格式
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
类的继承格式
class 子类 extends 父类 { }
继承的优缺点
继承的目的: 代码重用(多个类有大量相同的代码, 为了重复代码不重复写, 我们可以把这个类相同的代码抽取出来,创建父类存放.)
缺点: java是单继承, 一旦使用,这个类就不能再继承其他类(在 java 中只允许单继承,而不允许多重继承,也就是说一个子类只能有一 个父类,但是 java 中却允许多层继承.Java中有一个祖先类, 所有的类间接继承 java.lang.Object类)
java支持多层继承,父类暴增
(父类暴增)
继承代码实例
父类:
子类:
运行结果:
由上面的程序可以发现,在 Student 类中虽然并未定义 name 与 age 属性和eat();的构造方法,但在程 序外部却依然可以调用 name 或 age,这是因为 Student 类直接继承自Father类,也就 是说 Student 类直接继承了 Person 类中的属性和方法,所以 Student 类的对象才可以访问到父 类中的成员。
子类对象实例化
子类在是实例化对象时对父类构造方法的调用看下代码:
父类:
子类:
测试类及其输出结果:
从程序输出结果中可以发现,在测试程序中实例化的是子类的对象,但是程序却先去调用父类中的无参构造方法,之后再调用了子类本身的构造方法。所以由此可以得出结论,子类对象在实例化时会默认先去调用父类中的无参构造方法,之后再 调用本类中的相应构造方法。 (实际上在子类构造方法的第一行默认隐含了一个“super()” 语句)
继承条件下构造方法的调用规则如下:
- 如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”语句,效果是一样的。
- 如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法。
- 如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则。
- 特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
super关键字:
super: 表示的父类的对象:
super.方法名() 调用父类的方法
super.属性名 调用父类的属性 实际开发不会使用, 对属性进行私有化
super() 调用父类的构造方法 经常使用
使用super调用父类构造方法:
注意: 1. 必须在子类的构造方法写
2.必须位于子类构造方法的第一行代码
3. 不能与this() 并存
访问修饰符:
(访问修饰符 可以修饰属性,方法,构造方法)
常见: public , private 实际开发中使用最多
访问修饰符: 从范围的大到小:
1) public 公开的 所有
2) protected 受保护 同包,是子类
3) 默认/缺省 同包
4) private 私有 同类
注意:
protected修饰符的修饰的成员变量和方法也称为受保护的成员变量和方法, 受保护的成员变量和方法可以在本类或同一个包中的其它类(包括子类)中通过类的实例进行访问,也可以被同一个包中的类或不同包中的类继承,但是不能在不同包中的其它类(包括子类)中通过类的实例进行访问。
方法的重写:
法重载和方法重写的区别。
方法的重载是指在一个类中,出现多个方法名相同,但参数个数或参数类型不同的方法。方法覆盖体现了子类补充或者改变父类方法的能力,通过覆盖,可以使一个方法在不同的子类中表现出不同的行为。
方法的重写: 子类重写父类的方法,子类对父类的方法的方法体实现不满意,重新自己实现方法体。
方法重写的代码实例:
重写规则
在重写方法时,需要遵循以下的规则:
(一) 子类重写父类的方法
(二) 父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,
(三) 父类的返回类型必须与被子类重写的方法返回类型相同,
(四) Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。
总结:
- 子类拥有父类非private的属性,方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。