-
继承概述: 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
-
继承格式 通过extends关键字可以实现类与类的继承
-
*class 子类名 extends 父类名 {}*
-
单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
-
继承可以大大增强代码的复用性和维护性。当很多类都有相同的属性或方法时,我们可以将这些共有的属性方法提取出来,放入父类中,这样,子类在用的时候直接调用就行了。以前我们需要写好几遍的代码,现在只需在父类中写一遍,复用性大大增强。当所有类有个共有属性需要改变时,我们只需改变父类中的属性值即可,子类中的自然就变了。后期易于维护整个程序。最重要的是,继承让类与类直接产生关系,不再是分裂的个体,这是多态的前提之一。
-
当然,继承也有缺陷。继承使类与类直接的联系增强了,改一个共有属性,所有类的该属性值都会同样改变,这是开发程序的大忌,即耦合性增加。我们希望,在程序当中,不同的程序有不同的功能,最好一个程序能自主完成一个功能(内聚性),但继承恰好违背了这一点。
-
Java支持单继承,不支持多继承。就是说,一个子类只能有一个父类,但一个父类可以有多个子类。同时,Java也支持多层继承,如父亲-自己-儿子。
继承的注意事项:
(1)子类只能继承父类所有非私有的成员(成员方法和成员变量);
(2)子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法;
(3)不要为了部分功能而去继承。
继承的使用情况:简单地说,当一种事物的大部分属性包含于另外一个事物时,我们可以考虑使用继承。
成员变量之间的关系:
(1)当子类中的变量名和父类中的变量名均不相同时,以实际调用的名字为主,这种情况易于理解,这里不做赘述;
(2)当子类中的变量名和父类中的变量名相同时,我们先在子类的局部范围中找,找不到的话在子类的成员范围中找,最后在父类的成员变量中找,要是还找不到,系统就回报错。
关键字:this,super
- 如果子类和父类中有同名的变量,我们要使用父类中的变量,需要怎么做呢?
this:代表的是本类对象的引用。就是说,谁调用该方法,this指代的就是谁。 this的一般使用格式:
this.成员变量名: 调用该成员的变量 this.方法名: 调用该成员的方法 this(参数): 调用本类的构造方法
super:是父类对象的标识。可以通过关键字,访问父类中的变量和方法。 super.成员变量名: 调用父类成员的变量
super.方法名: 调用父类成员的方法 super(参数): 调用父类的构造方法
public class MyTest {
public static void main(String[] args) {
Zi zi = new Zi();
zi.ziTest();
}
}
class Fu {
int num = 20;
int f = 500;
}
class Zi extends Fu {
int num = 2000;
int a = 15;
public void ziTest() {
int num = 50;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
运行结果:
50
2000
20
空参构造方法:
子类中所有的构造方法默认都会访问父类中空参数的构造方法。因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。其实:每一个构造方法的第一条语句默认都是:super()。简单提一句,Object类。否则有人就会针对父类的构造方法有疑问。Object在没有父类了。
父类没有无参构造方法,子类怎么办? a:在父类中添加一个无参的构造方法 b:子类通过super去显示调用父类其他的带参的构造方法
c:子类通过this去调用本类的其他构造方法 本类其他构造也必须首先访问了父类构造
注:super(…)或者this(….)必须出现在第一条语句上
class Fu{
public Fu() {
System.out.println("父类空参构造方法默认执行");
}
}
class Zi extends Fu {
public Zi() {
System.out.println("子类空参构造方法默认执行");
}
}
public class MyTest{
public static void main(String[] args) {
new Zi();
}
}
运行结果:
父类空参构造方法默认执行
子类空参构造方法默认执行
方法重写
子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),也被称为方法覆盖,方法复写。
方法重写的应用:
(1)当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
(2)这样,即沿袭了父类的功能,又定义了子类特有的内容。
方法重写注意事项
(1)父类中私有方法不能被重写
因为父类私有方法子类根本就无法继承
(2)子类重写父类方法时,访问权限不能更低
最好就一致,或者比父类方法的权限修饰符高
(3)父类静态方法,不参与重写
(4)子类重写父类方法的时候,最好声明一模一样。
final
- 由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法.这对这种情况java就给我们提供了一个关键字: final
- final关键字是最终的意思,可以修饰类,变量,成员方法。
被修饰类不能被继承;被修饰的方法不能被重写;被修饰的变量不能被重新赋值,因为这个量其实是一个常量。