Java继承详解


面向对象有三大特征:封装、继承、多态
而继承就是多态的基础,可见继承在java中有着举足轻重的作用

1.什么是继承

继承,见名知义,是父亲和儿子的关系,也就是,父亲有的特性,儿子也有,但是儿子在拥有父亲的特性之外,也有自己的特性,说白了继承实际上是一种共性抽取,下面举个例子理解:
下面我们有两个实体:
在这里插入图片描述
可以看到,讲师的属性有:姓名、工号,还有一个讲课的方法,而助教的属性有:姓名、工号,还有一个辅导的方法,他们两个实体有同样的两个属性:姓名、工号,于是我们可以把这两个共同的属性抽取出来称为一个新的实体员工:
在这里插入图片描述
这个就是共性抽取,于是在java中他们之间就产生了一种关系

员工:父类、基类、超类
讲课和助教:子类、派生类

子类拥有父类的所有特性,并且子类还可以有自己的特性

2.继承的格式

父类:
普通类定义一样

public class 类名{
	属性;
	方法
}

子类:

public class 子类名 extends 父类名{

}

下面用继承实现上述案例;

员工类(父类):

public class 员工 {
    String name;
    int Id;

    public 员工(String name, int id) {//构造方法
        this.name = name;
        Id = id;
    }
}

讲师类(子类):

package demo02;

public class 讲师 extends 员工{//继承员工类
    public 讲师(String name, int id) {//构造方法
        super(name, id);//调用父类构造方法
    }
    public void 讲课(){//自己独有讲课的特性
        System.out.println("我在讲课");
    }
}

助教类(子类):

public class 助教 extends 员工{//继承员工类
    public 助教(String name, int id) {//构造方法
        super(name, id);//调用父类构造方法
    }
    public void 辅导(){//自己独有辅导的特性
        System.out.println("我在辅导");
    }
}

测试类:

public class demo04 {
    public static void main(String[] args) {
        讲师 js = new 讲师("刘德华",666456);
        助教 zj = new 助教("蔡依林",457496);
        js.讲课();
        zj.辅导();
    }
}

结果:
在这里插入图片描述
到这里应该明白继承的好处了,可以大大简化代码,将共同的特性抽取封装起来,并且结构更加清晰
问题1:直接访问成员变量时,父类和子类成员变量重名怎么办?
回答:创建对象时,等号左边是谁就优先用谁,没有则向上找
示例:

public class 父类 {
    String s = "我是父类";
}
public class 子类 extends 父类{
    String s = "我是子类";
}

测试类:

public class Demo5 {
    public static void main(String[] args) {
        父类 fl = new 父类();
        子类 zl = new 子类();
        System.out.println(fl.s);
        System.out.println(zl.s);
    }
}

运行结果:
在这里插入图片描述
下面删除子类属性,保留父类属性,测试子类对象会不会向上找:

public class 父类 {
    String s = "我是父类";
}
public class 子类 extends 父类{
 
}

测试类;

public class Demo5 {
    public static void main(String[] args) {
        子类 zl = new 子类();
        System.out.println(zl.s);
    }
}

运行结果:
在这里插入图片描述
问题2:间接通过成员方法访问成员变量时,成员变量重名怎么办
回答:方法属于谁,就调用谁的变量,没有向上找
问题3:方法重名
回答:创建对象是谁就优先用谁,没有就往上找
注意:只会向上找父类,不会向下找子类

3.重写

概念:在继承关系当中,方法的名称一样,参数列表也一样
重写:方法的名称一样,参数列表【也一样】。覆盖,覆写
重载:方法的名称一样,参数列表【不一样】

方法的覆盖重写特点:创建的是子类对象,则优先用子类方法
注意事项
1.必须保证父子类之间方法名称相同,参数列表也相同
@override:写在方法前面,用来检测是不是有效的正确覆盖重写。(可选)
2.子类方法的放回值必须小于父类的返回返回范围
小扩展提示:java.lang.object类是所有类的公共最高类(祖宗类),java.lang.String就是object的子类
3.子类方法的权限必须【大于等于】父类方法的权限修饰符
小扩展提示:public > pratected > (defuult) > private
备注:(default)不是关键字default,而是什么都不写,留空

4.继承中构造方法访问特点

1.子类构造方法中有一个默认“super()”调用,所以一定先调用的父类构造,后执行的子类构造
2.可以通过super关键字来子类构造调用父类重载构造
3.super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调 用多次super构造
总结:子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用

5.JAVA继承的特点

java语言是单继承的:一个类的直接父类只能有一个
Java语言可以多级继承
Java语言父类可以有多个子类

6.super关键字的三种用法

1.在子类的成员方法中访问父类的成员变量 super.父类成员变量
2.在子类的成员方法中访问父类的成员方法 super.父类成员方法
3.在子类的构造方法中访问父类的构造方法 super();

7.this关键字的三种用法

1.在本类成员中,访问本类的成员变量 this.成员变量
2.在本类的成员方法中,访问本类的另一个成员方法 this.成员方法名
3.在本类的构造方法中访问另一个构造方法 this(num) 调用本类的有参构造方法
在第三种用法中要注意:
A.this(…)调用也必须是构造方法的第一个语句,唯一一个
B.Super和this两种构造调用,不能同时使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章