在Java这一面向对象语言的使用过程中,为了更快捷方便地开发项目功能,继承已有的类与接口进行调用是非常必要的。
继承
在Java中,类与接口都可以进行继承。
1.类之间的继承
类的继承基本逻辑为子类继承父类、普通类继承抽象类。
(1)对象成员
子类继承了父类的所有属性与方法。对于构造方法和构造代码块,子类在创建对象时也会调用父类的构造方法与代码。
(2)静态资源
子类以及父类名都可以调用同一份静态属性,且共用静态方法。
例如:创建一个学生类Student:
public class Student {
String name;
int number;
int grades;
public void Getinfo(){
System.out.println("姓名:"+name+" 学号:"+number+" 成绩:"+grades);
}
}
再创建一个大学生类UNStudent,去继承它:
public class UNStudent extends Student {
String college;
public void Exinfo(){
System.out.println("学院:"+college);
}
}
此时,由UNStudent类定义的变量可以同时调用Getinfo和Exinfo两个方法。
(3)访问权限修饰符:
访问权限修饰符只限制代码的调用方法,不限制是否继承。如果想要调用,可以使用公共的方法。
2.接口之间的继承
接口之间进行继承时,子接口不需要重写父接口的方法,而是继承父接口的所有抽象方法。
3.类实现接口
实现接口时,类可以共用接口的静态资源,必须重写接口中所有的抽象方法。
以Java中的接口MouseListener进行举例:
public class DrawListener implements MouseListener {
public void mouseClicked(MouseEvent e) {
System.out.println("点击");
@Override
public void mousePressed(MouseEvent e) {
System.out.println("按下");
x1 = e.getX();
y1 = e.getY();
System.out.println("x1: " + x1 + " y1:" + y1);
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("释放");
x2 = e.getX();
y2 = e.getY();
System.out.println("x2: " + x2 + " y2:" + y2);
}
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("进入");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("离开");
}
}
由于我们定义的类想要实现接口MouseListener,因此必须将接口中的这五个抽象方法进行重写。
(1)重写方法
在子类重写方法时,方法结构必须与父类一致,但方法体可以修改。即:
访问权限修饰符 返回值类型 方法名(参数列表){
方法体;
}
其中,权限修饰符可以扩大范围,返回值类型可以缩小范围(例如int->byte)。方法名与参数列表必须一致,方法体可以修改。
(2)调用特点
子类重写方法之后,子类中以及子类对象优先调用重写的方法。
例如:还是使用上面的两个类,但是改变子类中的方法名,使其与父类一致:
public class Student {
String name="张三";
int number=20000101;
int grades=88;
public void Getinfo(){
System.out.println("姓名:"+name+" 学号:"+number+" 成绩:"+grades);
}
}
public class UNStudent extends Student {
String college="软件学院";
public void Getinfo(){
System.out.println("学院:"+college);
}
}
对其进行测试:
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.Getinfo();
System.out.println("--------");
UNStudent us = new UNStudent();
us.Getinfo();
}
}
结果为:
姓名:张三 学号:20000101 成绩:88
--------
学院:软件学院
子类重写方法之后,若依然要求调用父类的方法,则可使用关键字
super进行调用。
(3)注意事项
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法访问权限不能更低(public>默认>私有)