目录
一、为什么要用继承?继承是什么?
二、继承的语法格式
三、继承下的方法重写
四、继承关系下构造方法的访问特点:
五、this和super的用法
一、为什么要用继承?继承是什么?
我们要用继承那就要先知道用继承有什么好处。继承可以共性抽取多个类中 相同的代码,从而提高代码的复用性。
继承就是子类可以继承父类中非private修饰的成员信息。
二、继承的语法格式
以下代码段是子类继承父类的语法格式:
public class 子类 extends 父类{
//子类继承了父类,则可以使用父类中的非private修饰的成员信息
}
三、继承下的方法重写
子类可以覆盖重写父类中的成员方法,要求有如下四点:
1.方法名相同
2.参数项相同
3.修饰符相同(不能严格与父类)
4.返回值相同(可以是父类返回值的子类)
以下两段代码为子类覆盖重写父类方法的例子(子类覆盖重写了父类中的work方法):
public class Person {
protected String name;
protected char gender;
protected int age;
protected String nationality;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public Person(String name, char gender, int age, String nationality) {
this.name = name;
this.gender = gender;
this.age = age;
this.nationality = nationality;
}
public Person() {
}
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
public void work() {
System.out.println("工作");
}
}
public class Student extends Person{
private String school;
private String stuNumber;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getStuNumber() {
return stuNumber;
}
public void setStuNumber(String stuNumber) {
this.stuNumber = stuNumber;
}
public void work() {
System.out.println("我是学生,我要学习");
}
}
四、继承关系下构造方法的访问特点:
1.在子类的构造方法中,如果没有写super(参数),则会赠送一个super();
2.如果写了一个super(参数),则不赠送
3.super(参数),必须是第一个语句(必须在第一个;前)
4. 在创建子类对象的时候,一定会调用父类的某个构造方法。
如以下两个代码段所示:
public class Employee extends Person{
protected String name;
protected String id;
protected double salary;
public Employee() {
super();
}
public Employee(String name, String id, double salary) {
super();
this.name = name;
this.id = id;
this.salary = salary;
}
}
public class Employee extends Person{
protected String name;
protected String id;
protected double salary;
public Employee() {
}
public Employee(String name, String id, double salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
}
第一个代码段和第二个代码段执行的内容并没有区别,因为第二个代码段中的有参、无参构造方法因为没有写super()所以会默认赠送一个super()
五、this和super的用法
super关键字三种用法:
super.父类的成员变量
super.父类的成员方法
super(参数); //调用父类的构造方法,只能在子类的构造方法调用。
this关键字的三种用法:
this.本类成员变量
this.本类成员方法
this(参数); //表示调用本类的其他构造方法
1.必须写在构造方法中
2.必须是第一个语句
3.this(参数)和super(参数)不能同时存在
(1)写了this(参数),之后不再赠送super()
(2)构造方法不能递归
public class Teacher extends Person{
public Teacher() {
this("张老师",25,"Java");
}
public Teacher(String name, int age, String subject) {
this();
this.subject = subject;
}
}
上述代码为构造方法递归示例,无参构造函数调用有参构造函数,有参构造函数又调用无参构造函数,如此会陷入死循环,在编译时就会报错