为什么要用继承
代码复用
_当我们在创建多个类似的类时,经常会用到相同的属性或者方法,比如我们创建了一个医生类,医生的常用属性有哪些:姓名、性别、年龄、科室等等,然后我们再创建一个教师类,教师的属性有:姓名,性别,年龄,科目等等。那么问题来了,这样写的话我们发现医生和教师都有姓名、性别、年龄,写一个两个类还好,如果有其他职业,要写十个类,二十个类,不停的重复定义姓名、性别、年龄,那就太麻烦了,所以我们把姓名、性别、年龄这些每个职业都有的属性拿出来放到一起写一个类,让医生教师类去共同使用,特殊的属性比如科室,科目分别在医生教师类中定义,这样就方便了很多。医生教师调用职业这个类就叫做extends(继承,或者说是扩展),职业这个公共类我们就叫他superclass(超类,或者父类);医生教师就叫做subclass(子类)。这样子类就可以复用父类的代码,从而让代码更简洁紧凑。
_
class SuperPerson {
String name;
int age;
}
class Doctor extends SuperPerson{
//这里没有定义姓名年龄属性
String keshi="神经科";
}
class Teacher extends SuperPerson{
//这里没有定义姓名年龄属性
String kemu="语文";
}
public static void main(String[] args) {
Doctor doctor=new Doctor();
doctor.name="张医生";
doctor.age=28;
Teacher teacher=new Teacher();
teacher.name="李老师";
teacher.age=25;
System.out.println(doctor.keshi+doctor.age+"的"+doctor.name+"在给"+teacher.age+"教"+teacher.kemu+"的"+teacher.name+"看病");
}
方法也同样被继承过来了
class SuperPerson {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public static void main(String[] args) {
Doctor doctor=new Doctor();
doctor.setName("张医生");
doctor.setAge(28);
Teacher teacher=new Teacher();
teacher.setName("李老师");
teacher.setAge(25);
System.out.println(doctor.keshi+doctor.getAge()+"的"+doctor.getName()+"在 给"+teacher.getAge()+"教"+teacher.kemu+"的"+teacher.getName()+"看病");
}
注意,如果父类的属性和方法被private访问权限修辞符修辞了,那么私有属性和方法可以被子类继承,但无法访问
子类不会继承父类构造方法,但可以通过super关键字显示或隐式调用构造方法,当调用父类的无参构造方法时,隐式调用,并且会优先调用父类的构造方法:
class SuperPerson{
String name;
int age;
public SuperPerson() {
System.out.println("老父亲的构造方法");
}
}
class Doctor extends SuperPerson{
public Doctor() {
System.out.println("儿子的构造方法 ");
}
}
public static void main(String[] args) {
Doctor doctor=new Doctor();
}
如果父类中有带参数的构造方法,那么子类继承的时候,需要在子类中显示调用:
class SuperPerson {
public SuperPerson(String name) {
System.out.println("老父亲"+name+"的有参构造方法");
}
}
class Teacher extends SuperPerson{
public Teacher(String name){
super(name);
}
}
public static void main(String[] args) {
Doctor doctor=new Doctor("jack");
}
子类中的调用有参构造方法的super语句要优先放在构造方法体的第一行