继承
1.为什么需要继承
现在存在两个类如下
显然由图中我们可以看出,存在多行代码的重复现象,这里为了实现代码的复用引入继承
2.什么是继承
通过一个已有类来创建新类的机制,由继承而得到的类称为子类(或派生类),被继承的类称为父类(或超类)。
语法:
class <子类> extends <父类>
3.父类成员变量覆盖
根据访问权限修饰符的不同,子类可以继承父类中某些成员变量和方法,提高了代码的重用性,子类也可以添加新的成员变量和方法
子类(Student类):
public class Student extends Person{
String id;
int name=1;
{
System.out.println(name);
}
public static void main(String[] args) {
new Student();
}
}
②
父类(Person类):
public class Person {
String name="Tom";
String mobile;
String address;
}
③
运行后输出:
④得出结论:
这时使用子类的实例化对象去调用name,使用的是子类中的(类比与全局变量和局部变量的适用范围)
当子类里面的变量和父类里面的变量名字重复(忽略数据类型),则父类中变量被覆盖
4.继承的特点
①在javaz中类只有单继承
②Object类是所有类的直接或间接父类
③如果父类中的属性或方法是私有的,则子类不能继承
④子类可以有自己新的成员变量
5.final
一个类加了final以后就不能再被继承
6.父类对子类构造方法的影响
①当父类中有无参构造方法时,子类中的super()调用父类中该无参构造方法
②使用前提子类中调用父类无参构造方法的构造方法没有调用本来中其他构造方法(因为调用子类其他代码的方法this()和调用父类无参构造方法的super()都必须放在有效代码行的第一行)
Student中
public class Student extends Person{
Student(){
super();//必须放在有效代码的第一行,不写也默认有,调用父类无参构造方法
}
Student(int age){
this();//调用上面的构造方法,必须放在有效代码的第一行
}
public static void main(String[] args) {
new Student();
}
}
Person中
public class Person {
}
③如果父类没有无参构造方法,则子类必须直接或间接指定调用父类哪一种构造方法且放在有效代码行第一行
6.为什么父类只存在有参构造方法,子类会报错
Student中默认有一个无参构造方法,该无参构造方法默认有一个super()去调用父类中的无参构造方法,而此时父类中定义了一个有参构造方法则没有默认的无参构造方法,故出错