为什么需要继承?
类具有属性和方法,是一类实体的集合。有时候要解决问题时需要用到一个类,但仅有这一类的属性和方法还不够,需要进行适当的扩展。为了提高代码的重用性,避免重复编写已有的类的属性和方法,这时就需要继承。
什么是继承?
JAVA语法
class 父类 {
}
class 子类 extends 父类 {
}
继承的JAVA语法如上所示,英文的extend意为扩展、延申,继承实际上就是子类对父类的(属性与方法)扩展、延申。通过继承,子类可以使用父类的属性与方法,还可以重新定义自己的属性与方法以便更好地适应需要。
举例说明
class Student{
String school;
int grade;
void study();
void finalexam();
}
class UNStudent extends Student{
String major;
void technicalexam();
}
UNStudent unst = new UNStudent();
unst.study();
unst.technicalexam();
学生都有学校和年级两个属性,也都有学习和期末考试两个方法,但大学生除了期末考试还会参加其他的技能考试,并且还多了专业这个属性,所以仅有学生类不能很好地满足大学生的需求,这个时候就需要大学生类继承学生类的属性与方法,并做出适当的扩展。
上面这段代码定义了一个Student类,UNStudent类继承了Student类,实例化的UNStudent类对象可以调用Student类的方法,也可以调用自己的方法。
自动转型与强制转型
自动转型
JAVA转型问题的核心是:父类引用指向子类对象。
由之前关于继承的说明中我们可以说一个大学生对象一定是一个学生对象,通过这句话我们可以发现,我们可以将一个大学生子类对象定义为学生父类。
Student stu = new UNStudent();
这种将子类对象类型定义为父类的方法叫做自动转型(向上转型)。自动转型后的对象不能再调用子类特有的方法。
强制转型
不是所有学生都是大学生,但有一些学生是大学生。有的时候还需要把父类对象转型为子类对象,这种方法叫做强制转型(向下转型)。
Student stu = new UNStudent();
UNStudent stu2 = (UNStudent) stu;
方法的重写
为什么需要方法重写?
子类虽然能从父类继承方法,但父类在定义方法时,不一定能很好地满足所有子类的需求,这时候就需要将父类中的方法进行补充说明,这就需要将父类的方法重写。
方法重写的规则
1.方法重写是对从父类继承方法体进行重写,不改变父类方法体的方法返回值类型(可以是父类的派生类)和传递的参数。
2.方法重写可以缩小父类方法的访问权限,但不能扩大。
3.声明为static,final的方法不能够重写。
4.构造方法不能重写。
5.子类与父类在同一个包,子类可以重写除private和final外所有父类方法。
6.子类与父类不在同一包中,子类可以重写父类的Public和Protected方法。
public class Student{
public void study(){
System.out.println("原来的学习");
}
}
public class UNStudent extends Student{
public void study(){
System.out.println("子类与父类的学习不同");
}
}
UNStudent st = new UNStudent;
st.study();
上面这段代码的UNStudent类继承了Student类,并重写了Student的study方法。创建的UNStudent对象调用study方法即调用的重写后的study方法。
super关键字
若要调用没有重写的父类的方法,可以使用super关键字。
public class UNStudent extends Student{
public void study(){
super.study();
System.out.println("子类与父类的学习不同");
}
}
例如在上面的UNStudent类中的study方法中,用了super关键字调用父类的study方法。
有了继承和重写机制,就可以实现JAVA面向对象的另一个特性——多态,在之后的学习中我会继续补充。