目录
继承的含义
所谓继承,是指子类可以获得在基类中定义的成员,并对其进行修改。
继承的目的
- 继承:
获得父类成员,
对父类成员进行修改 [1](重写/复写/覆盖)
- 扩展:
创建属于子类的成员
简而言之就是 继往开来。
继承的方式
(1)java中,非接口只支持单继承,即某类只能延续一个类
∵当多个父类定义了同名方法,而方法功能不同时,子类不知道该继承哪一个
但是用多实现可以 完成与多继承同样的功能
(2)接口支持多继承
可被继承的成员的权限
当前类内 | 当前类所在包中的所有类(子类和非子类) | 其他包中的子类 | 其他包中的其他类 | |
public | √ | √ | √ | √ |
protected | √ | √ | √ | x |
default | √ | √ | x | x |
private | √ | x | x | x |
根据上表,可以得出子类可以访问的成员的修饰符包括:
在同一包中:public protected,default
在不同包中:public,protected
子类调用父类成员
满足权限的属性+非构造方法
super指代父类的引用
super();//调用父类的构造方法,必须放在函数体中
super.父类函数名;//
子类调用父类的构造函数
子类调用父类构造函数
(1)父类必须有构造函数:
- 默认无参、函数体为空的构造函数
- 手动构造的无参、有函数体的构造函数,会覆盖默认构造函数
- 手动构造的有参构造函数
(2) 父类构造函数和子类构造函数之间的关系:
子类构造函数必须调用父类的构造函数
- 父类没有显式定义任何构造函数,子类构造函数中,没有显式调用父类构造函数/显式调用super(); √
- 父类有显式定义 无参构造函数,子类构造函数中,没有显式调用父类构造函数/显式调用super(); √
- 父类只显式定义 有参构造函数,子类构造函数中,没有显式调用父类构造函数/显式调用super(); × ——提示子类构造函数中找不到符号
- 父类有显式定义无参构造函数 和 有参构造函数,子类构造函数中,没有显式调用父类构造函数/显式调用super(); 显式调用super(参数); √
(3)示例代码
public class TestConstructor {
public static void main(String[] args) {
Child c = new Child();
}
}
class Father {
public Father() {
System.out.println("父类无参构造函数");
}
public Father(String name) {
System.out.println("父类有参构造函数");//1
}
}
class Child extends Father {
public Child() {
this("dd");
System.out.println("子类无参构造函数");//3
}
public Child(String name) {
super("dd");//1
System.out.println("子类有参构造函数");//2
}
}
(4)结论:
子类的构造函数体中必须调用(隐式调用or显式调用)父类的构造函数
同一个类中有多个参数列表不同的构造函数体现了函数重载,
class People
{//People是Student和Worker的共性的抽取
People()
{
System.out.println("LALALA");
}
String name;
int age;
void show()
{
System.out.println("I'm a man");
}
}
class Student extends People
{//Student是People的延续
void study()
{
System.out.println("studying");
}
void show()
{
super.show();
System.out.println("I'm a student");
}
}
class Worker extends People
{
void work()
{
System.out.println("working");
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Student s=new Student();
s.study();
s.show();
}
}
若去掉Student类中的show方法中的第一行super.show(),程序运行结果是
参考文献
《Thinking in java 第四版中文版》p143