JAVA SE 之三大特性:封装、继承、多态
一、封装
1.概念
将类的某些信息隐藏在类的内部,不允许外部程序的直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
2.好处
- 只能通过规定的方法访问数据
- 隐藏类的实例细节,方便修改和实现
3.封装的实现步骤
- 修改属性的可见性 列如:设为private
- 创建getter/setter方法:用于属性的读写
- 在getter/setter方法中加入属性的控制语句:对属性的合法性进行判断
补充:
Java中的访问修饰符
访问修饰符: 可以修饰属性和方法的访问范围
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
Java中this关键字
this关键字代表当前对象
this属性 操作当前对象的属性
this方法 调用当前对象的方法
总结:
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
二、继承
1.概念
继承是类与类之间的一种关系,
注意:
-
Java中的继承是单继承(一个类只有一个父类)
-
private属性不能被子类继承
2.继承的好处:
- 子类拥有父类的所有属性和方法
- 实现代码的复用
3.语法规则
class 子类 extends 父类
class Dog extends Animal{
.....
}
4.方法的重写
- 如果子类对父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法。
- 语法规则 a:返回值类型 b:方法名 c:参数类型及个数 都要与父类继承的方法相同,才叫方法的重写。
5.继承的初始化顺序
①初始化父类在初始子类
②先执行初始化对象中的属性,再执行构造方法中的初始化
图解:
父类对象-----》属性初始化-----》构造柱方法
|
|
|
/
子类对象-----》属性初始化-----》构造柱方法
6.final关键字
- 使用final关键字做标识有“最终的含义”
- final可以修饰类、方法、属性和变量
- final修饰类:则该类不允许被继承
- final修饰方法:则该方法不予许被覆盖(重写)
- final修饰属性:则该类的属性不会进行隐试的初始化(类的初始化必须有值)或者在构造方法中赋值(但只能选择其一)
- final修饰变量:则该变量的值只能赋一次值,即变为常量
7.super关键字
在对象的内部使用,可以代表父类的对象
-
访问父类的属性
super.age
-
访问父类的方法
super.eat()
注意:
- 子类的构造的过程当中必须调用其父类的构造方法
- 如果子类的构造方法没有显示父类的构造方法,则系统默认调用父类无参的构造方法。
- 如果显示的调用构造方法,必须在子类的构造方法的第一行
- 如果子类构造方法中既没有显示调用父类的构造方法,而父类又没得无参的构造方法,则编译出错
8.Object类
Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外 的一个类,那么这个类默认继承Object类,Object类中的方法。适合所有子类
- toString()方法
- 在Object类里面定义toString()方法的时候返回的对象的哈希code(对象地址字符串)
- equals()方法
- 比较的是对象的引用是否是指向同一块内存地址
总结:
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
三、多态
1.概念:
对象的多种形态
- 引用多态
- 父类的引用可以指向本类的对象
- 父类的引用可以指向子类的对象
- 方法多态
- 创建本类对象时,调用的方法时本类的方法
- 创建子类的方法时,调用的方法为子类重写的方法或者是继承的方法
2.引用类型转换
- 向上类型的转换(隐式/自动类型转换),是小类型到大类型的转换
- 向下类型的转换(强制类型的转换),是大类型到小类型
- instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题
3.抽象类
- 语法定义:抽象类前使用abstract关键字修饰,则该类为抽象类
- 应用场景
- 在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法
- 从多个具有相同特征的类中抽出一个抽象类,以这个抽象类作为子类的模板,从而避免子类设计的岁随意性
- 作用:限制规定自子类实现某些方法。但不关注实现细节
- 使用规则
- abstract 定义抽象类
- abstract 定义抽象方法,只有声明,不需要实现
- 包含抽象方法的类是抽象类
- 抽象方法可以包括普通方法,也可以没有抽象方法
- 抽象类不能直接创建,可以定义引用变量
4.接口
-
接口概念:接口可以理解为一种特殊的类。由全局常量和公共的抽象方法所组成
-
类是一种具体的实现体,而接口定义某一批所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类方法的实现细节,它只规定这些类里必须提供某些方法
-
接口定义:
- 和类定义不同,定义接口不再使用class关键字,而是使用interface关键字
- 常量中的属性是常量,即使定义时不添加,public static final 修饰符 ,系统也会自动加上
- 接口中的方法只能是抽象方法,总是使用,即使定义时不添加public abstract 修饰符 ,系统也会自动加上
-
语法格式
[修饰符] interface 接口名[extends 父接口1,父接口2..] { 零个到多个常量定义... 零个到多个抽象方法的定义... }
注意:
接口就是用来被继承的,被实现的,修饰符一般建议用public
不能使用private 和protected修饰接口
接口是可以多继承的
-
使用接口
-
一个类可以实现一个或者多个接口,实现接口使用implements关键字,Java中的一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以做补充。
-
继承父类实现接口的语法
[修饰符] class 类名 extends 父类 implements 接口1,接口2... { 类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。 }
注意:
如果要继承父类,继承父类必须在实现接口之前
总结:
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
-