文章目录
1. 继承概述
继承概述
•多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
•子类不能继承父类的私有方法 ,构造方法和静态方法
•通过extends关键字可以实现类与类的继承
•class 子类名 extends 父类名 {}
•单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
•有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。
2. 继承的好处
•提高了代码的复用性
多个类相同的成员可以放到同一个类中
•提高了代码的维护性
如果功能的代码需要修改,修改一处即可
•让类与类之间产生了关系,是多态的前提
其实这也是继承的一个弊端:类的耦合性
3. 继承的特点
Java只支持单继承,不支持多继承。
•一个类只能有一个父类,不可以有多个父类。
•class SubDemo extends Demo{} //ok
•class SubDemo extends Demo1,Demo2…//error
Java支持多层继承(继承体系)
•一个父亲可以有多个儿子
•class A{}
•class B extends A{}
•class C extends B{}
4. 继承的注意事项
•子类只能继承父类所有非私有的成员(成员方法和成员变量)
•其实这也体现了继承的另一个弊端:打破了封装性
•子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。
•不要为了部分功能而去继承
•我们到底在什么时候使用继承呢?
继承中类之间体现的是:”is a”的关系。
5. 继承中成员变量的关系
5.1 案例演示
/*
类的组成:
成员变量:
构造方法:
成员方法:
而现在我们又讲解了继承,所以,我们就应该来考虑一下,类的组成部分的各自关系。
继承中成员变量的关系:
A:子类中的成员变量和父类中的成员变量名称不一样,这个太简单。
B:子类中的成员变量和父类中的成员变量名称一样,这个怎么玩呢?
在子类方法中访问一个变量的查找顺序:
a:在子类方法的局部范围找,有就使用
b:在子类的成员范围找,有就使用
c:在父类的成员范围找,有就使用
d:如果还找不到,就报错。
*/
class Father {
public int num = 10;
public void method() {
int num = 50;
}
}
class Son extends Father {
public int num2 = 20;
public int num = 30;
public void show() {
int num = 40;
System.out.println(num);
System.out.println(num2);
// 找不到符号
System.out.println(num3);
}
}
class ExtendsDemo4 {
public static void main(String[] args){
//创建对象
Son s = new Son();
s.show();
}
}
•子父类中同名和不同名的成员变量
5.2 结论
•在子类方法中访问一个变量
•首先在子类局部范围找
•然后在子类成员范围找
•最后在父类成员范围找(肯定不能访问到父类局部范围)
•如果还是没有就报错。(不考虑父亲的父亲…)
6. super(超级的)关键词
super的用法和this很像
•this代表本类对应的引用。
•super代表父类存储空间的标识(可以理解为父类引用)
用法(this和super均可如下使用)
访问成员变量:
this.成员变量 super.成员变量
访问构造方法()
this(…) super(…)
访问成员方法()
this.成员方法() super.成员方法()
7. 继承找构造方法的关系
子类中所有的构造方法默认都会访问父类中空参数的构造方法
为什么呢?
•因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
•每一个构造方法的第一条语句默认都是:super()
如果父类中没有构造方法,该怎么办呢?
•子类通过super去显示调用父类其他的带参的构造方法
•子类通过this去调用本类的其他构造方法
•本类其他构造也必须首先访问了父类构造
一定要注意:
•super(…)或者this(….)必须出现在第一条语句上
•否则,就会有父类数据的多次初始化
方法的重写(overload)
方法重写概述
-
子类中出现了和父类中一模一样的方法声明
-
子类不能重写父类的静态方法和构造方法
-
子类不能引出比父类更大的异常
-
子类的访问权限要大于或等于父类
-
也被称为方法覆盖,方法复写。
-
如果还想使用父类方法的功能可以加一个super()引用父类
使用特点:
•如果方法名不同,就调用对应的方法
•如果方法名相同,最终使用的是子类自己的
方法重写的应用:
•当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
8. 方法的重载(override)
在一个类中,方法的名称相同,参数的个数 顺序 数据类型至少有一个不同就构成了方法的重载!方法的重载与返回值和修饰符无关
9. overload和overrie的区别
- 重载要求在同一个类中,重写发生在继承关系的两个或多个类并且要求是非静态非私有的方法(类)
- 重载要求参数的顺序,个数,数据类型至少有一个不同与返回值无关 。重写是参数列表返回值类型必须一致
- 方法的重载与访问修饰符无关。重写要求子类的访问权限不能小于父类
顺序 数据类型至少有一个不同就构成了方法的重载!方法的重载与返回值和修饰符无关
9. overload和overrie的区别
- 重载要求在同一个类中,重写发生在继承关系的两个或多个类并且要求是非静态非私有的方法(类)
- 重载要求参数的顺序,个数,数据类型至少有一个不同与返回值无关 。重写是参数列表返回值类型必须一致
- 方法的重载与访问修饰符无关。重写要求子类的访问权限不能小于父类
- 重载中与异常无关。重写要求子类不能抛出比父类更多的异常