1、继承的含义和作用
(1)继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类) ;得到继承信息的类被称为子类(派生类)。 继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
语法格式:
class Subclass extends SuperClass{ }
(2)作用:
- 继承的出现减少了代码冗余,提高了代码的复用性。
- 继承的出现,更有利于功能的扩展。
- 继承的出现让类与类之间产生了关系,提供了多态的前提。
注意:不要仅为了获取其他类中某个功能而去继承。
(3)举例
- 为描述和处理个人信息,定义类Person:
class Person {
public String name;
public int age;
public Date birthDate;
public String getInfo() { //... }
}
- 为描述和处理学生信息,定义类Student:
class Student {
public String name;
public int age;
public Date birthDate;
public String school;
public String getInfo() { // ... }
}
- 通过继承,简化Student类的定义:
class Person {
public String name;
public int age;
public Date birthDate;
public String getInfo() { // ... }
}
class Student extends Person {
public String school;
}
Student类继承了父类Person的所有属性和方法,并增加了一个属性school。Person中的属性和方法,Student都可以使用。
2、继承的特性
- 子类继承了父类,就继承了父类的方法和属性。
- 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
- 在Java中,继承的关键字用的是“extends”,即子类不是父类的子集, 而是对父类的“扩展”。
- 子类不能直接访问父类中私有的(private)的成员变量和方法。
- Java只支持单继承和多层继承,不允许多重继承,即一个子类只能有一个父类 ,而一个父类可以派生出多个子类。
class SubDemo extends Demo{ } //ok
class SubDemo extends Demo1,Demo2...{ }//error
3、关键字:super
在Java类中使用super来调用父类中的指定操作:
- super可用于访问父类中定义的属性。
- super可用于调用父类中定义的成员方法。
- super可用于在子类构造器中调用父类的构造器。
注意:
- 当子类和父类出现同名成员时,可以用super表明调用的是父类中的成员。
- super的追溯不仅限于直接父类。
- super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识,所以super和this不能出现在同一构造器。
super和this的区别:
举例(调用父类的构造器):
父类:
public class Person {
private String name;
private int age;
private Date birthday;
public Person(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthday = d;
}
public Person(String name, int age) {
this(name, age, null);
}
public Person(String name, Date d) {
this(name, 30, d);
}
public Person(String name) {
this(name, 30);
}
}
子类:
public class Student extends Person {
private String school;
public Student(String name, int age, String s) {
super(name, age);
school = s;
}
public Student(String name, String s) {
super(name);
school = s;
}
public Student(String s) {
school = s;
}// 编译出错: no super(),系统将调用父类的无参构造器。
}
4、方法的重写 (override/overwrite)
(1)在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
(2)要求:
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
子类不能重写父类中声明为private权限的方法 - 子类方法抛出的异常不能大于父类被重写方法的异常
注意:子类与父类中同名同参数的方法必须同时声明为非static(此时为重写),或者同时声明为static(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
(3)举例
例子1:
父类:
public class Person {
public String name;
public int age;
public String getInfo() {
return "Name: "+ name + "\n" +"age: "+ age;
}
}
子类:
public class Student extends Person {
public String school;
//重写方法
public String getInfo() {
return "Name: "+ name + "\nage: "+ age + "\nschool: "+ school;
}
public static void main(String args[]){
Student s1=new Student();
s1.name="Bob";
s1.age=20;
s1.school="school2";
System.out.println(s1.getInfo()); //Name:Bob age:20 school:school2
}
}
这是一种“多态性”:同名的方法,用不同的对象来区分调用的是哪一个方法。
例子2:
父类:
class Parent {
public void method1() {}
}
子类:
class Child extends Parent {
private void method1() {}
//非法,子类中的method1()的访问权限private比被覆盖方法的访问权限public小
}