Java面向对象三大特性之一-----继承

1.继承的定义与使用

继承:在已有的基础上继续扩充功能

定义两个类(人和学生)

package Testextends;

/**
 * Author:weiwei
 * description:继承
 * Creat:2019/3/27
 **/

class Person{
    private String name;
    private int age;

    public String getName(){
        return name;
    }

    public void setName(){
        this.name = name;
    }

    public int getAge(){
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
class Student{
    private String name;
    private int age;
    private String school;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }
}

观察代码,人和学生其实是存在共有属性,所以可以共享属性,如上,把两个类共有的属性依次重复实现,代码重复性高,灵活性低,这种情况下我们就可以用Java的第二大特性继承的优势,学生类可以继承人这个类重复的属性,减少代码的重复性,简化代码,灵活扩充功能 

2.继承的实现

继承用关键字:extends实现

语法:class 子类 extends 父类

观察继承的实现

package Testextends;

/**
 * Author:weiwei
 * description:继承
 * Creat:2019/3/27
 **/

class Person{
    private String name;
    private int age;

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

    public int getAge(){
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
class Student extends Person{

}

public class Testextends1 {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("Steven");
        student.setAge(26);
        System.out.println("姓名:"+student.getName()+",年龄:"+student.getAge());
    }
}

上述代码就是继承的过程,子类直接继承父类,实现了代码的重用,子类最低也维持与父类相同的功能,子类还可以进行扩充(扩充属性和方法)

观察子类进行功能的扩充

package Testextends;

/**
 * Author:weiwei
 * description:子类功能扩充
 * Creat:2019/3/27
 **/
class Person{
    private String name;
    private int age;

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

    public int getAge(){
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
class Student extends Person{//定义一个子类
    private String school;//扩充新的属性

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }
}

public class Testextends2 {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("Merry");
        student.setAge(18);
        student.setSchool("第一中学");
        System.out.println("姓名:"+student.getName()+",年龄:"+student.getAge()+",学校:"
                +student.getSchool());
    }
}

继承的主要作用是对类进行扩充以及代码的重用 

3.继承的限制

子类对象在进行实例化前一定会首先实例化父类对象。默认调用父类的构造方法后再调用子类构造方法
进行子类对象初始化。
观察子类对象创建

package Testextends;

/**
 * Author:weiwei
 * description:继承--子类对象创建
 * Creat:201/3/27
 **/

class Person{
    public Person(){
        System.out.println("Person类对象产生");
    }
}
class Student extends Person{
    public Student(){
        super();//此语句在无参时写与不写一样
        System.out.println("Student类对象产生");
    }
}
public class Testextends3 {
    public static void main(String[] args) {
        new Student();
    }
}

 通过以上代码我们发现,没有任何一条语句调用父类构造方法。因此,子类对象实例化之前一定先实例化父类对象
注意:实际上在子类的构造方法之中,相当于隐含了一个语句 super();
同时需要注意的是,如果父类里没有提供无参构造,那么这个时候就必须使用super()明确指明你要调用的父类构造
方法。
Java只允许单继承,不允许多继承。
一个子类只能继承一个父类。

观察错误的多继承

class A {}
class B {}
class C extends A,B{}

Java 不允许多继承,但允许多层继承,但层数不要太多,建议最多三层

class A {}
class B extends A{}
class C extends B{}

在进行继承的时候,子类会继承父类所有结构,包括(属性,构造方法,普通方法),但是需要注意的是,所有非私有操作属于显式继承(可以直接调用),所有私有操作属于隐式继承(通过其他形式调用,比如setter,getter方法)

观察显式继承和隐式继承

package Testextends;

/**
 * Author:weiwei
 * description显式继承与隐式继承
 * Creat:2019/3/27
 **/

class Person{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
class Student extends Person{
    public void fun(){
        System.out.println(getName());
    }
}
public class Testextends4 {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("Steven");
        System.out.println(student.getName());
        student.fun();
    }
}

此时父类中的属性的确被子类所继承了,但是发现子类能够使用的是所有非private操作,而所有的private操作无
法被直接使用,所以称为隐式继承。

总结:

  1. 继承的语法以及继承的目的(扩充已有类的功能,使得代码重用)
  2. 子类对象的实例化流程:不管如何操作,一定要先实例化父类对象
  3. 不允许多重继承,只允许多层继承

猜你喜欢

转载自blog.csdn.net/weixin_43224539/article/details/88845610
今日推荐