2.1继承
假如,现在我们开发一个学校的管理系统,其中有学生,老师等等不同的类,那在创建不同的对象时,就要定义不同的类,但如果是另外的系统,可能会涉到更多不同的类,如果一个个的去创建,那将会很费时间,使代码也显得更复杂,冗余。而我们可以发现这些表面是分散的类其实是有一些共性的,比如老师和学生都会有年龄,性别,姓名,学号,等其他的共性,那如果我们把这些共性提取出来,再让他们去用公共的特性,那将会变得很简单,理解起来也会很容易接受,由此引出了类的继承。
在继承中,我们用关键字extends来实现类与类之间的继承,比如定义了下面的类Person,再来继承一个类Worker;
package duan.java.test;
public class Person {
public int age=10;
private String name;
public String sex;
public int weight;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String showName(){
return name;
}
// public Person(int weight){
// this.weight=weight;
// System.out.println("构造器初始weight:"+weight);
// }
public Person(){
System.out.println("父类无参构造方法");
}//end constroctor person
}//end class person
定义Worker类 继承person类:
package duan.java.test;
public class Worker extends Person {//extends关键字实现继承
public String showName(){//子类的特有方法
return super.showName()+"工人";
}
public void work(){//子类的特有方法
System.out.println("I am a worker");
}
public Worker(){//子类的构造器
//System.out.println("父类构造器");
super(6);//super方法要写在第一行
//System.out.println("子类构造方法");
}
}
使用继承之后,有什么变化呢?当使用继承之后,子类就会拥有父类的所有属性,包括方法和构造器,这样,当创建了一个新的对象时,这个对象就可以直接使用父类的属性和方法了,而子类也可以继续定义自己的特有属性和方法。
Super关键字
在从子类继承父类的过程中,可能需要在子类中调用父类的成员,如属性,方法,构造器,这个时候,可以使用super关键字来完成,
调用父类中的方法,属性
Super.属性;
Super.方法();
注意:在这个时候,父类的属性或者方法必须是那些protected,或者是public等可以让子类访问的属性或方法。
Super用于调用父类中的方法主要用于在子类中定义了和父类中同名的属性,或进行了方法的覆盖,而又要在子类中访问父类中的同名属性或覆盖前的方法的时候。
调用构造器
Super(参数);
当我们在调用类中的构造器去初始化一个对象时,它(子类中的构造器)将会调用父类中的构造器来完成这个任务。
当子类中的构造方法没有参数时,这时可以不用super来调用父类的构造器,(因为此时编译器已经默认自己创建一个super了,等于多此一举—),下面分类来讨论各个情况:
1.子类调用时是super(),父类中没有无参构造器(父类构造器在父类中被重写),则编译错误。
2.子类调用时为super(参数),父类构造器没被重写,编译错误(找不到匹配的构造器)。
3.子类调用时为super(参数),父类构造器被重写,且父类中的构造器参数能与super中的参数一致,则能正确运行。
构造器使用super去调用超类中的构造器。而且这行代码必须放在第一行,否则编译将出错。