面向对象三大特征
一、封装
定义
封装就是将属性隐藏起来,对于外界不可见。若要访问某个属性,提供公共方法对其访问。如此,可以让代码更加容易理解,同时可以加强代码的安全性。
体现
- 方法就是一种封装
- 关键字private也是一种封装
步骤
- 使用
private
关键字来修饰成员变量或成员方法,即private 数据类型 变量名;
,从而使得成员变量或成员方法只有在本类中访问,超出本类范围则不能直接访问。 - 对需要访问的成员变量或成员方法,则可以间接访问,即提供对应的
setXxx()
、getXxx()
方法。 - 对于
setXxx()
方法,不能有返回值,参数类型和成员变量对应。 - 对于
getXxx()
方法,不能有参数,返回值类型和成员变量对应。 - 特殊地,对于基本类型中的boolean值,
getXxx()
必须写成isXxx()
的形式,而setXxx()
规则不变
public class Student {
private int age;
//专门设置age的数据
public void setAge(int a) {
if (a > 0 && a < 100){ //提高了代码的安全性
age = a;
}else {
System.out.println("年龄值输入错误");
}
}
//专门获取age的数据
public int getAge() {
return age;
}
//对于数据类型布尔值的特殊情况
private boolean male;
public void setMale(boolean m) {
male = m;
}
public boolean isMale() {
return male;
}
}
构造方法
-
定义:专门用来创建对象的方法
- 通过new关键字创建对象时,就是在调用构造方法
-
格式:
public 类名称 (参数类型 参数名称) { 方法体 }
-
注意事项
- 构造方法的名称必须和所在的类名称完全一样,包括大小写
- 构造方法不要写返回值类型,不写void
- 构造方法不能return一个具体的返回值
- 构造方法可以进行重载,即可以定义或不定义参数
标准的类:符合JavaBean
规范
- 组成:
- 所有成员变量由private关键字修饰
- 每个成员变量都有get/set方法
- 有一个无参数的构造方法
- 有一个全参数的构造方法
- 编译器IDEA中快速写一个标准的类:
- 先点击菜单栏中的Code
- 再点击Code中的Generate
- 之后根据对应所缺少的组成部分,生成对应组件
- 当生成无参数的构造方法时,需要选择Select None
二、继承
定义
- 解决的问题:共性抽取,提高代码的复用性
- 特点
- 子类可以拥有父类的内容
- 子类可以拥有自己特色内容
- 格式:
class 子类 extends 父类
类之间继承的特点
- 支持单继承,不支持多继承,即儿子只能有一个父亲。
- 支持多重继承,即儿子可以有爸爸,还可以有爷爷。
- 子类只有一个父类,但父类可以有多个子类。即允许有兄弟姐妹。
注:接口和接口之间支持单继承,也支持多继承。(接口可以有多个爹)
继承后的问题
- 成员变量重名
- 使用
super
关键字,即 super.成员变量名 - 直接通过子类对象访问成员变量:等号左边是谁,就优先用,否则向上找
- 间接通过成员方法访问成员变量:该方法属于谁,就优先用,否则向上找
- 使用
- 成员方法重名:覆盖重写(override)
- 保证父类和子类的方法名称和参数列表都一致,可以用
@override
写在方法前来检查是否是有效的重写 - 子类方法的权限修饰符 ≥ 父类方法的权限修饰符 public > protected > (default) > private
- 子类方法的返回值范围 ≤ 父类方法的返回值范围
- 保证父类和子类的方法名称和参数列表都一致,可以用
this关键字
本类对象的引用,用来访问本类内容
- 原因:解决成员变量名和
setXxx()
的形参变量名的重名问题,若重名,会根据「就近原则」优先使用局部变量,导致成员变量被隐藏从而方法调用时不能赋值使用 - 含义:代表所在类的当前对象的地址值
- 哪个对象调用方法,方法中的this就代表哪个对象,即通过谁调用的方法,谁就是this。
- 格式:this.成员变量名 this一定是写在方法里面的
public class Student {
private int age;
public void setAge(int age) {
//age = age; 出现成员变量和参数变量的重名问题
this.age = age;
}
public int getAge() {
return age;
}
super关键字
父类对象的引用,用来访问父类内容
- 在子类的成员方法中,访问父类的成员变量/成员方法
- 在子类的构造方法中,访问父类的构造方法
三、多态
两种形式实现多态:继承和实现
引用类型转换
-
对象的向上转型
父类名称 对象名 = new 子类名称();
即创建一个子类对象,把它当做父类来看待使用。
-
对象的向下转型
子类名称 对象名 = (子类名称) 父类对象;
将父类对象,[还原]成为本来的子类对象。
四、修饰符
权限修饰符
修饰符 | 同一个类 | 同一个包(子类与无关类) | 不同包的子类 | 不同包非子类 |
---|---|---|---|---|
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
- 一般成员变量用private修饰。
- 一般构造方法用public修饰。
- 一般成员方法用public修饰。
状态修饰符
final修饰符
修饰方法:方法不能被重写
修饰基本类型变量:变成常量,不能被赋值
修饰引用类型变量:地址不能改变,地址里面的内容可以改变(可以不建公园,但是可以建商场)
修饰类:类不能被继承(绝种了)
static修饰符
- 作用:类的多个对象共享同一份数据。
- 调用格式:类名称.静态变量 类名称.静态方法()
- 注意事项
- 静态成员方法只能访问静态方法和静态变量,不能访问非静态。(因为内存先用的静态,后有的非静态。)
- 静态方法中不能使用this关键字
- 内存说明:根据类名称访问静态成员变量时候,只和类有关,和对象无关。因为在方法区中有一块独立的空间,叫静态区,专门存储static的数据。