继承概述:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类就行了。
通过extends关键字可以实现类与类的继承
class子类名 extends 父类名{}
有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。
父类也可以称为基类、超类
子类也可以称为派生类
继承的格式:class Fu {}
class zi extends Fu {}
通过继承可以提高代码的复用性,代码的维护性、让类与类之间产生了关系,是多态的前提。
类与类之间产生了关系体现了类的耦合性增强。
开发的原则:低耦合,高内聚
耦合:类与类的关系
内聚:就是自己完成某件事的能力
java中继承的特点:
java只支持单继承,不支持多继承(一个类只能有一个父 类,不可以有多个父类)
但是有些语言是支持多继承的,格式:extends 类1,类2……..
java支持多层继承(继承体系)class A{}
class B extends A{}
class C extends B{}
java中继承的注意事项:
子类只能继承父类所有非私有的成员(成员方法,成员变量) 这里也体现了继承的弊端:打破了封装性
子类不能继承父类的构造方法,但可以通过super()关键字去访问父类的构造方法
不要为了部分功能而去继承
class Father {
public int num=10;
}
class son extends Father {
public int num=20;
public void show() {
int num=30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
class Exx {
public static void main(String[] args) {
son s=new son();
s.show();
}
}
//打印的结果;
30
20
10
this和super的区别?
this代表本类对应的引用,super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)
**如何用?**
A:调用成员变量
this.成员变量 通用本类的成员变量
super.成员变量 通用父类的成员变量
B:调用构造方法
this(....) 调用本类的构造方法
super(...) 调用父类的构造方法
C:调用成员方法
this.成员方法 调用本类的成员方法
super.成员方法 调用父类的成员方法
class Father {
public Father() {
System.out.println("father无参数");
}
public Father(int a) {
System.out.println("father有参数");
}
}
class son extends Father {
public son () {
System.out.println("son无参数");
}
public son (int a) {
System.out.println("son有参数");
}
}
class exxx {
public static void main(String[] args) {
son s=new son();
System.out.println("---------");
son ss=new son(2);
}
}
//打印结果:
//father无参数
//son无参数
//---------
//father无参数
//son有参数
子类中所有的构造方法默认都会访问父类中空参数的构造方法。
因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定会先完成父类数据的初始化。
每一个构造方法的第一条语句默认都是:super()
继承中构造方法的关系
A:子类中所有的构造方法默认都会访问父类中空参数的构造方法。
如果父类没有无参构造方法,那么子类的构造方法会出现错误!!!!
解决方法:
A:在父类中加一个无参构造方法
B:通过使用super关键字去显示的调用父类的带参构造方法
C:子类通过this去调用本类的其他构造方法
子类中一定要有一个去访问父类的构造方法,否则父类的数据就没有初始化。
注意事项:this(…) 或者super(…)必须出现在第一条语句上。