继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
//首先父类有的行为和属,子类也需要有。
//一般来说,子类是父类属性和行为的细化
class 父类 { }class 子类 extends 父类 { }
继承的特性
-
子类拥有父类非 private 的属性、方法。
-
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
-
子类可以用自己的方式实现父类的方法。
-
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
-
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
继承关键字
extends和implements关键字
- extends关键字可以继承一个父类
- implements可以继承接口。变相实现多继承(不同:接口只有方法和常量的定义)
super关键字和this关键字
- super 关键字:我们可以通过 super 关键字来实现对父类成员的访问,用来引用当前对象的父类。
- this 关键字:指向自己的引用,引用当前对象,即它所在的方法或构造函数所属的对象实例。
上例中看Dog d new Dog(),创建了Dog的对象,后调用了eatTest方法。在这个方法中先调用了dog对象的eat方法,后super调用了animal的eat方法。故输出为:后两句
final 关键字
final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
final 含义为 "最终的"。
使用 final 关键字声明类(注意声明的是类而不是变量),就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写
最后构造方法:
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
重写(Override)和重载(Overload)
重写:既对方法的重写书写。
对象:子类对父类方法重写
限制:子类和父类具有相同名称、参数列表和返回类型的方法
重载
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象。Parent p = new Child();
Parent p = new Child();
p会继承Parent的属性。调用方法时使用的时child的方法。
抽象类
定义:
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。 //设计阶段设计可以减少后面的工作量
组成:
- 成员变量
- 成员方法
- 构造方法
- 抽象方法 //该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,
封装:
封装我们已经使用过了。就是我们设置属性为private,然后通过构造方法等进行调用
封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
封装的优点
-
1. 良好的封装能够减少耦合。
-
2. 类内部的结构可以自由修改。
-
3. 可以对成员变量进行更精确的控制。
-
4. 隐藏信息,实现细节。
接口:
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。
接口和类的相似之处
- 一个接口可以有多个方法。
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
- 接口的字节码文件保存在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
接口与类的区别:
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
枚举:
枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一年的 12 个月份,一个星期的 7 天,方向有东南西北等。
比如在一些游戏的玩家满意度反馈。你还玩过其他什么游戏。他会列出大部分游戏和其他。这就是一种枚举。
enum Color
{
RED, GREEN, BLUE;
}