一、 继承
1.1背景
1、目的:就是为了让代码能够很好的被重复利用
2、概念:父类(基类、超类),子类(派生类)
3、关键字:extends(扩展)
1.2语法规则
1、使用格式:
class 子类 extends 父类{
}
1)使用extends指定父类
2)Java是单继承,一个类只能继承一个父类(而C++/Phython等语言支持多继承)
3)子类会继承父类的所有属性和方法,无论是public还是private,但是只有public能够被使用(访问)
4)子类实例中也包含着父类的实例,可以使用super关键字的到父类引用的实例
注意:继承原则上不能超过三层
1.3 子类和父类的构造函数情况
构造方法(构造函数)是一类特殊的方法,用于创建对象时初始化对象中新的属性值。
语法格式:
[访问符] 类名 ([参数列表]){
初始化语句}
(1)方法名和类名相同
(2)方法名前面没有返回类型的声明
(3)方法中不能使用return语句返回一个值
类的构造方法有两种:
默认的构造方法:不带参数的构造方法,可以有语句也可以没有语句。
非默认构造方法:是指带参数的构造方法
继承中的构造方法:
每个类都有构造方法,如果不显示的创建构造方法,那么编译器就会给这个类自动生成一个没有参数的构造方法。
在继承中当父类里面没有写构造方法的时候,就会被自动生成了没有参数版本的构造方法,此时如果直接 new 子类实例,就会调用到刚才这没有参数的构造方法。
当父类有构造方法的时候,并且这个构造方法带参数的时候,编译器就不会自动生成没有参数的构造方法了,此时再创建子类实例,就需要显示的调用父类的构造方法,并且进行传参
1.4this、super和final
1、this:
a)代指对象本身
b)this访问本类的对象变量和成员方法,代表当前对象
c)在构造方法中使用this代表创建的对象
2、super:
a)在子类成员方法中,访问父类的成员变量
b)在子类成员方法中,访问父类的成员方法
c)在子类的构造方法中,访问父类的构造方法
this和super的区别:super是用来访问父类的内容,而this关键字在不同情况下访问的对象不同。
a)在本类的成员方法中,访问本类的成员变量。
b)在本类的成员方法中,访问本类的另一个成员方法
c)在本类的构造方法中,访问本类的另一个构造方法
3、final:
final关键字代表最终的不可修改的,具体修饰如下:
1)可以修饰类
格式:public final class
表示这个类不能被继承,其中的成员方法也不可以进行覆盖重写
2)可以修饰方法
格式:final 返回值 方法名(){}
表示该方法为最终方法不能被覆盖重写
3)可以修饰局部变量
第一种情况基本类型变量:表示变量当中的值不可以改变
第二种情况引用类型变量:变量中存放的地址不可以改变
4)可以修饰成员变量
a)当成员变量使用final修饰后不再有默认值,要进行下一步赋值
b)
1.5 继承中的执行顺序
1)父类的静态代码块优于子类的静态代码块
2)父类实例代码块和父类构造方法紧接执行
3)子类的实例代码块和构造方法紧接执行
4)第二次实例化对象时,父类和子类的静态代码块内容将不会被执行
二、组合
组合和继承相似,也是一种表达类之间关系的方式,也是能够达到代码重用的效果。通俗的说,就是一个类可以是其他类的成员。表现为:什么拥有什么、什么包含什么。
代码示例
public class Student {
...
}
public class Teacher {
...
}
public class School {
public Student[] students;
public Teacher[] teachers;
}
总的来说,继承和组合的目的都是为了让代码重用,提高代码的维护性。