继承
引入
前提:
一个类中包含了若干成员属性和成员方法;在不同的类中,成员属性和成员方法是不相同的。
疑问:
已有类A,想创建类B;当两个类的内容基本相同的属性、行为基本相同,如何里实现代码的重用?
解答:
Java提供继承来实现代码的重用率,提高编程效率。
继承
概念
继承:就是从已有类的基础上产生一个新的类。
已有类 | 新的类 |
---|---|
父类 | 子类 |
超类 | 派生类 |
基类 |
解释:
如果一个类B继承自另一个类A
- 把B称为A的派生类
- 把A称为B的父类
关系
- 派生类通过继承自动拥有基类的属性和方法
- 派生类是基类的特化,而基类是派生类的泛化
- 基类和派生类是相对的
Java
中的单重继承机制:一个类只能有一个直接基类Object
类是所有Java类的顶级基类final
修饰的类不能有派生类(String
是典型特例)
语法
//class 子类名 extends 父类名{
// //扩充的属性和方法
//}
//父类
//猫
public class Cat{
//属性
private String color;
private String beard
//方法
public void catchMouse(){
System.out.println("捉老鼠");
}
}
//子类
//缅因猫
public class MaineCoon extends Cat{
//补充的属性
private String shape;
//补充的方法
public void spoiled(){
System.out.println("撒娇");
}
}
过程
- 吸收基类成员
- 派生类将基类的全部成员属性、方法吸收
- 增加派生类成员
- 在派生类上对基类功能、属性进行扩展
- 定义派生类的构造方法,构造方法不可继承
- 调整基类成员
- 隐藏同名的基类成员。
继承的访问
访问权限修饰符 | 本类内 | 子类内 | 本类和子类外 |
---|---|---|---|
public |
|||
private |
|||
protected |
同包不同包 |
修饰符
protected
基类中的某个方法或者属性,只允许派生类或者同包中的类访问.
在类外不能访问
派生类内部访问基类的成员
- 派生类内部只能访问基类的非
private
类型的成员。 - 基类公有的,继承到派生类也是公有的。
- 基类私有属性,派生类无法直接访问。
- 基类私有属性,可通过公有接口访问。
//父类
public class Cat{
//子类可直接访问
public int id;
project String name;
//无法直接访问
private Color color;
//通过公有接口访问
public void setColor(Color color){
this.color = color;
}
public Color getColor(){
return color;
}
}
继承的构造方法
派生类继承自基类,当实例化派生类对象时,必须调用基类的构造方法,再调用派生类的构造方法。
JVM默认调用基类的无参构造方法,若基类没有无参构造方法,则报错
- 在基类定义无参构造方法
- 在派生类中显式调用基类中定义的构造方法
派生类构造方法中没有显式调用基类构造方法,则默认调用基类的无参构造方法。
在派生类中显式调用基类的构造方法,需要使用super
关键字
super
引用
用于引用基类中的属性或方法
使用
- 调用基类属性
- 只能访问基类非
private
属性 - super位置不固定
- 只能访问基类非
- 调用基类方法
- 调用构造方法
super()
super(参数)
super.方法名(参数)
调用基类非private
方法,位置不固定
- 调用构造方法
//父类
//猫
public class Cat{
//属性
public int id;
private String color;
private String beard
//构造方法
public Cat(){
this.color = "橘色";
this.beard = "长的";
}
//方法
public void catchMouse(){
System.out.println("捉老鼠");
}
}
//子类
//缅因猫
public class MaineCoon extends Cat{
//补充的属性
private String shape;
public MaineCoon(){
super();//第一行
//调用属性
//只能调用非private
super.id = 1;
//方法
super.catchMouse();
}
//补充的方法
public void spoiled(){
System.out.println("撒娇");
}
}
注意
super()
只能放在派生类构造方法的第一行super
只能访问基类中非private
的属性和方法
方法重写
派生类继承基类的属性和方法,除了可以新增成员外,还可以对基类的方法做修改。
概念
方法重写: 派生类对基类中定义的方法进行重新实现。
作用:就是在不改变原来代码的基础上可以对其中任意模块进行改造。
规则
- 重写方法返回值类型 是基类方法返回值类型的子类或相同
- 重写方法具有相同方法名
- 参数列表相同
- 不能重写被
final
修饰的基类方法 - 重写方法不能缩小访问权限
- 不能重写 基类私有的方法
注意
- 基类的引用可以指向派生类的对象;向上转型。
- 用基类的引用来操纵派生类对象,但是在实际运行中对象将调用派生类重写的方法。实现多态
- 指向派生类对象的基类类型的引用可以调用基类中定义的属性和方法。
- 指向派生类对象的基类类型的引用无法调用派生类中定义而基类中没有的方法。
- 从基类继承来的抽象方法,要么在派生类用重写的方式设计该方法,要么把派生类也标识为抽象的。抽象方法可以说是必须要被重写。
第 5 涉及到抽象方法以及抽象类
具体的抽象知识内容可以详细查看
抽象
包
学习完继承后,已经能用代码实现一些小项目
对于一个合格的项目来说,包是至关重要的
通过包对类进行分类,可以极大简化整理项目代码
Java语言的其他特性
继承作为Java语言三大特性,地位非常重要。
了解完继承后,不如再看看同样重要的其他特性
封装和多态,期待你的批评指导
以上是关于Java基础——类的继承的主要内容,如果未能解决你的问题,请参考以下文章