Bootstrap

Java面向对象继承

1.继承含义

继承:是将多个类相同属性和行为抽取到单独的类中、那么多个类无需再定义这些共性属性和行为,只要继承这个单独类即可继承这些属性和行为了。

设计类与类之间的关系

实际中,一般来说接口实现使用要比继承实用性更强一些。

继承特点:Java中单继承,为了规避多个父类造成的同名问题

简单来说:一个儿子只能有一个爹

单继承 + 接口实现    等价于  多继承(丰富其中的数据共性)

比如:铅笔类    橡皮接口

     带橡皮的铅笔——子类

父类——super  class 超类  基类

子类——派生类

2.格式

extends

public class 父类{
    
}
public class 子类名 extends 父类名{
    //子类特有的成员变量
    //子类特有的成员方法
}

子类是继承父类的所有成员,但是因为权限修饰不同,会造成子类中对于继承的成员可能会有不可见性。

3.继承的优势和劣势

优势:

1)提高代码的复用性

2)提高代码维护性,仅仅限制与父子类中,有时候也是一个弊端。

3)继承后续才会有多态

4)数据共享性(父子类之间)

劣势:

继承关系提高了类与类之间的联系,实际开发中,一般要求降低类与类之间的关联(低耦合性)

ps:耦合性只能降低,不能消除

/*
    学生类 : 姓名(name) , 课程名称(course) , 所在班级(className) , 查看课表
    (lookForm) , 填写反馈数据(write)
    老师类 : 姓名(name) , 课程名称(course) , 部门名称(department) , 查看课表
    (lookForm) , 发布试题(release)
    设计 : 把学生类 和 老师类的共性内容抽取到一个单独的类中(Person),存储共性内容
    父类 : 姓名(name) , 课程名称(course) , 查看课表(lookForm)
*/
public class ExtendsDemo1 {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("张三");
        s.setCourse("Java");
        s.setClassName("三年二班");
        s.lookForm();
        s.write();
    }
}
/*
    此类定义的是子类的共性成员
*/
public class Person {
    private String name;
    private String course;
    public String getName() {
    return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCourse() {
        return course;
    }
    public void setCourse(String course) {
        this.course = course;
    }
    public void lookForm(){
        System.out.println("查看课表");
    }
}
/*
    子类只需要定义自己特有的成员,共性的成员需要抽取到父类中
*/
public class Teacher extends Person {
    private String department;
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    public void release() {
        System.out.println("发布试题....");
    }
}

4.继承下的内存模型

子类对象

创建子类对象时,在子类内存空间中也会存在父类的数据存储空间

子类创建对象的时候,构造方法是如何调用的(子类构造和父类构造)

5.构造方法

1)子类所有的构造方法都会默认访问父类的无参的默认构造方法

原因:因为子类在初始化时,可能会用到父类的数据,所以通过访问父类的构造,先给父类进行初始化。

public Student() {
		super();//访问的是父类的无参构造方法(默认构造方法)
		// TODO Auto-generated constructor stub
	}


	public Student(String className) {
		super();
		this.className = className;
	}

2)如果进行初始化呢 ?

每个构造方法中默认第一条语句都会有一个super()

3)如果父类没有空参数构造 , 那么子类如果进行给父类初始化 ?

子类可以通过super(...)访问父类的有参数构造方法

子类通过this(..)访问子类的有参构造 , 在通过有参构造区访问父类的有参构造 , 不推荐

注意:super(...)和this(...)因为二者都需要放在构造方法的第一条可执行语句,所以二者不能共存。

6.继承下成员的访问规则
成员变量:

访问特点-就近原则(局部有访问则访问局部,局部没有访问的则访问本类成员,本类成员没有则访问父类非私有成员)

成员方法:

访问特点-就近原则:子类有调用子类的,子类没有则调用父类的

7.this和super关键字的区别

this : 代表的是本类的对象

super : 代表的是父类数据存储空间(可以看做成父类的对象)

使用 :

        调用变量 :

                this.变量名 : 访问本类的成员变量

                super.变量名 : 访问父类的成员变量

        调用方法 :

                this.方法名(...) : 访问本类的成员方法

                super.方法名(...): 访问父类的成员方法

        调用构造 :

                this.构造方法名(...) : 访问本类的构造方法

                super.构造方法名(....) : 访问父类的构造方法

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;