继承
继承的基本概念
定义:继承是软件可重用性的重要表现,新类可以在不增加自身代码的情况下,通过现有的类 中继承其属性和方法,来充实身的内容,,此时新类称为子类,现有的类为父类。
作用:继承最基本的作用就是使得代码可重用性,增加软件的可扩充性
java中只支持单继承,即每个类只能有一个直接父类。
语法格式:
【访问修饰符】class extends{
}
注意:在Java中,子类可以从父类中继承以下内容:
1.可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包里
2.可以继承默认访问修饰符修饰的属性和方法
3.无法继承父类的构造方法
例子;使用继承,将8个部门类中相同的代码抽取成一个部门类
//父类为Department
public class Department {
private int ID;
private String name;
private int amount;
private String responsibiblity;
private String manager;
public Department(){ }
public Department(String name,String manager,String responsibiblity){
this.name=name;
this.manager=manager;
this.responsibiblity=responsibiblity;
}
public int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public String getResponsibiblity() {
return responsibiblity;
}
public void setResponsibiblity(String responsibiblity) {
this.responsibiblity = responsibiblity;
}
public String getManager() {
return manager;
}
public void setManager(String manager) {
this.manager = manager;
}
public void print(){
System.out.println("部门:"+this.name+"\n经理:"+this.manager
+"\n部门职责:" +this.responsibiblity+"\n**************" );
}
}
使用继承实现部门类和子类
人事部继承Department
public class PD extends Department {
private int count;//本月计划招生人数
public PD(String name, String manager, String responsibility, int count) {
super(name, manager, responsibility);
this.count = count;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public static void main(String[] args) {
PD pd = new PD("人事", "tom", "负责公司人事",
10);
pd.print();
}
}
研发部继承Department
public class RD extends Department {
private String speciality;
public RD(String name,String manager,String responsibility,String speciality){
super(name,manager,responsibility);
this.speciality=speciality;
}
public RD(String speciality){
super();//默认调用父类无参构造方法
this.speciality=speciality;
}
public String getSpeciality() {
return speciality;
}
public void setSpeciality(String speciality) {
this.speciality = speciality;
}
}
super关键字
super关键字和this关键字作用类似,都是将被屏蔽的成员变量,,成员属性变得可见
//从父类继承的方法不能满足子类的需求,差个输出人数,因此可在
//子类中对父类的同名方法进行重写,以符合需求
public void print(){
super.print();
System.out.println("本月计划招生人数:"+this.count);
}
通过super关键字访问父类成员的语法格式:
访问父类构造方法:super(参数)
访问父类属性/方法:super.
注意:super只能出现在子类(子类的方法和构造方法中);
super用于访问父类的成员,如属性、方法、构造方法;
具有访问权限的限制,如无法通过super访问父类的private成员。
//使用super调用父类构造方法
public PD(String name, String manager, String responsibility, int count) {
super(name, manager, responsibility);
this.count = count;
}
实例化子类对象
在java中,一个类的构造方法在如下两种情况下总会被执行
①创建该类的对象(实例化)
②创建该类的子类对象(子类的实例化)
子类在实例化时,总会先执行其父类的构造方法,然后才执行子类的构造方法,子类继承父类时构造方法的调用规则如下:
①子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法,此时,是否写“super()”语句,效果都一样
②子类的构造方法中通过super显式调用父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类无参构造方法
③子类的构造方法中通过this显式的调用了自身的其他构造方法,在相应构造方法中遵循以上两条规则
④如果存在多级继承,在创建一个子类对象时,以上规则会多次向更高一级父类传递,一直执行到顶级父类Object类的无参构造方法为止。
举例
package cn.kgc.review;
/**
* @Author $(USER)
* @Date $(DATE)
* @Description 人类为父类
*/
public class Person {
String name;
//无参构造
public Person(){
System.out.println("execute Person()");
}
//有参构造
public Person(String name){
this.name=name;
System.out.println("execute Person(name)");
}
}
package cn.kgc.review;
/**
* @Author $(USER)
* @Date $(DATE)
* @Description 学生为人类的子类
*/
public class Student extends Person{
//学生类作为Person的子类
String school;
public Student(){
System.out.println("execute Student()");
}
public Student(String name,String school){
super(name);//显示调用父类有参构造方法,将不执行父类无参构造方法
this.school=school;
System.out.println("execute Student(name,school)");
}
}
package cn.kgc.review;
/**
* @Author $(USER)
* @Date $(DATE)
* @Description pg为学生的子类
*/
public class PG extends Student {
String guide;
public PG(){
System.out.println("execute PG()");
}
public PG (String name,String school,String guide){
super(name, school);
this.guide=guide;
System.out.println("execute PG(name,school,guide)");
}
}
class Tset{
public static void main(String[] args) {
PG pg=new PG();//调用PG的无参构造
System.out.println();
pg=new PG("王致和" ,"哈工大","刘老师l");//调用PG的有参构造
System.out.println(pg.name+pg.school+pg.guide);
}
}
Object类
方法重写
方法重写
如果从父类继承的方法不能满足子类的要求,可以在子类中对父类的同名方法进行重写。
//从父类继承的方法不能满足子类的需求,差个输出人数,因此可在
//子类中对父类的同名方法进行重写,以符合需求
public void print(){
super.print();
System.out.println("本月计划招生人数:"+this.count);
}
注意:
①重写方法和被重写方法有相同的方法名,相同的参数列表,相同的返回值类型或是后者的子类
②重写方法不能缩小被重写方法的访问权限