一.继承
1.关键字:extends
2.继承的概述 :
格式:class 子类 extends 父类 {}
继承出现的场景:多个类有共同的成员变量和成员方法,抽取到另外一个类中(父类),在让多个类去继承这个父类,
我们的多个类就可以获取到父类中的成员了。
3.继承的特点 :
(1):在Java中,类只支持单继承,不允许多继承,也就是说一个类只能有一个直接父类。
(2):多个类可以继承一个父类,例如下面这种情况是允许的。
(3):在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如C类继承自B类,而B类又可以去继承
A类,这时,C类也可称作A类的子类。
(4):在Java中,子类和父类是一种相对概念,也就是说一个类是某个类父类的同时,也可以是另一个类的子类。例如上面
的这种情况中,B类是A类的子类,同时又是C类的父类。
4.继承的成员变量的特点 :
A:子类只能获取父类非私有成员
子父类中成员变量的名字不一样直接获取父类的成员变量
子父类中成员变量名字是一样的获取的是子类的成员变量
B:就近原则:谁离我近我 就用谁
如果有局部变量就使用局部变量
如果没有局部变量,有子类的成员变量就使用子类的成员变量
如果没有局部变量和子类的成员变量,有父类的成员变量就使用父类的成员变量
C: super:可以获取父类的成员变量和成员方法,用法和this是相似的
5.继承中成员方法的特点&方法重写:
A: 子类中没有这个方法,调用父类的
B: 子类中重写了这个方法,调用子类的
方法的重写:在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类重写了父类的方法之后,
使用子类对象调用的就是子类的方法
方法的重载: 在一个类中,有多个重名的方法,但是其参数不一样(参数的个数,参数的类型,参数的顺序),和返回值无关
6.方法重写的应用场景&注意事项:
应用场景:当父类的方法不能完全满足子类使用的时候,既可以保留父类的功能(沿袭、传承),还可以有自己特有的功能
注意事项:
(1)不可以重写父类私有的成员方法,压根就看不到父类的私有成员
(2)子类重写父类方法,权限必须大于等于父类方法的权限
(3)@Override:注解方法重写,说明下面的方法是重写父类的方法
7.继承中构造方法的执行顺序:
顺序:
>第一步:在子父类中,创建子类对象,调用子类的构造方法,
>第二步:在子类的构造方法的第一行代码如果没有调用父类的构造或者没有调用子类的其他构造,则默认调用父类无参构造。
>第三步:如果调用了子类的其他构造方法,在这个构造方法中,也遵循第二步的原则。
为什么要调用父类构造?
因为需要给父类的成员变量初始化,肯定会先把父类的构造执行完毕,在去执行子类构造中的其他代码。
super&this:
A:super(实参列表);语句 在子类的构造方法中使用,用来调用父类中的构造方法(具体哪一个由传递的参数决定),并且
只能在构造方法第一行使用
B:this(实参列表); 语句 在类的构造方法中使用,用来调用本类中的其它构造方法(具体哪一个由传递的参数决定),并且
只能在构造方法的第一行使用
8.this与super区别:
this:当前对象的引用
调用子类的成员变量
调用子类的成员方法
在子类的构造方法第一行调用子类其他构造方法
super:子类对象的父类引用
调用父类的成员变量
调用父类的成员方法
在子类的构造方法第一行调用父类的构造方法
9.继承的优缺点:
A:优点
提高了代码的复用性
提高了代码的可维护性
B:缺点:
类的耦合性增强了
开发的原则:高内聚低耦合
内聚:就是自己完成某件事情的能力
耦合:类与类的关系
二.匿名对象&final
1.匿名对象定义&使用:
* 匿名对象:没有名字的对象
* 匿名对象的应用场景:
* 当方法只调用一次的时候可以使用匿名对象
* 可以当作参数进行传递,但是无法在传参之前做其他的事情
*
* 注意:匿名对象可以调用成员变量并赋值,但是赋值并没有意义
2.final关键字
final: 修饰符,可以用于修饰类、成员方法和成员变量
final所修饰的类:不能被继承,不能有子类
final所修饰的方法:不能被重写
final所修饰的变量:是不可以修改的,是常量
常量:
字面值常量:1,2,3
自定义常量:被final所修饰的成员变量,一旦初始化则不可改变
注意:自定义常量必须初始化,可以选择显示初始化或者构造初始化
三.抽象类
1.概述
关键字:abstract,用于修饰方法和类
当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方
法体。但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形
类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么
这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
抽象方法:不同类的方法是相似,但是具体内容又不太一样,所以我们只能抽取他的声明,没有具体的方法体,没有具体方法体
的方法就是抽象方法。
抽象类:有抽象方法的类必须是抽象类。
注意:一个类如果继承了抽象类,就需要重写他所有的抽象方法,否则这个类就得是抽象类。
2.抽象类的特点
* 抽象方法只能在抽象类里面
* 抽象类和抽象方法必须被abstract修饰
* 抽象类不能创建对象(不能实例化)
* 抽象类中可以有非抽象的方法
* 抽象类和类的关系也是继承
* 一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类
3.抽象类的成员的特点
成员变量
可以有成员变量
可以有常量
成员方法
可以有抽象方法
可以有非抽象方法
构造方法
可以有构造方法的,需要对抽象类的成员变量进行初始化
final:修饰类、成员变量、成员方法
4.抽象类细节描述
A:抽象类关键字abstract可以和哪些关键字共存?
1.private(抽象方法不能和private共存):私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一
起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。
2.final(抽象类不能和final共存):抽象类不能和final共存,因为抽象类自身无法创建对象,我们需要通过子类创建对
象,一旦抽象类使用final关键字,那么抽象类就没有子类,抽象方法不能和final共存,因为抽象方法后期需要被子类重写,
一旦加final无法重写。
3.static(抽象方法不能和static关键字共存):抽象方法不能和static关键字共存,因为一旦加static我们就可以通过
类名直接访问抽象方法,由于抽象方法没有方法体,没有任何意义,也不允许这样做。
B:抽象类中是否可以不定义抽象方法?
是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用。
C:抽象类是否有构造函数?
有,抽象类的构造函数,是由子类的super语句来调用,用于给抽象类中的成员初始化。