- Object Oriented Programming 多个类的共同行为规范
- 封装
- 定义
- 广义- 函数 将某个功能包装起来, 便于重复调用该功能
- 狭义- 隐藏对象的属性和实现细节, 仅对外提供公共的访问方式
- 私有化属性 用private修饰- 仅限于本类中使用
- 对外界提供get/set方法 可以对私有属性访问
- 单例模式- 唯一的实例对象, 提高性能
- 通常为饿汉式
- 私有化构造方法
- 在本类中创建一个 私有的本类对象
- 对外提供一个方法, 通过这个方法获取对象(仅此一个方式)
- 懒汉 为私有的本类对象提供懒加载, 初始化为null (不用不加载, 现用现加载)
- 类
同一个包中不能有两个同名文件
- 代码块
- 静态代码块 static{ } 不能存在于方法中 优先级高于main函数
- 构造代码块 {} 直接在类中定义的代码块, 只有创建此对象, 才会加载
- this 关键字
- 构造函数
- 对象的创建过程
- 继承 extends
- 将两个或两个以上的普通类中的属性和行为/方法, 抽取到一个共通类中
- Java中只能单继承
- 子类创建对象时, 会隐式调用父类的无参构造方法
- @override 方法重写: 子类和父类有同名方法, 当子类调用时, 优先执行子类方法
- super. 调用父类属性或方法
- super() 调用父类的构造方法
- 多态
- 前提: 存在继承关系
- 定义: 一个父类对象可以提现几种不同的形态
- 上转型 父类 a = new 子类(); 此时可以调用子类方法
- 编译时类型是父类, 只能访问父类方法和属性(除了子类重写过的方法), 编译时被当做了父类的对象
- 如果想访问子类特有的方法, 需要下转型
- 下转型 子类 b = (子类)a;
- instanceof 是否可转换
- 一些修饰词
- static 静态: 修饰变量, 方法, 代码块
- static 修饰的变量可以直接用类名访问
- static 变量存在于内存的方法区中
- static 方法不能被覆盖 (@Override 是动态绑定, static是编译时就已经静态绑定好了, 与任何对象都不相关)
- abstract 抽象: 修饰类
- 抽象类被继承, 则子类必须重写抽象父类中的所有方法
- 抽象类中的方法称为抽象方法, 在抽象类中只需要声明出来
- 只要有抽象方法, 这个类就是抽象类
- 抽象类不能实例, 但可以上转型创建子类对象
- 如果子类重写了抽象方法, 则这个抽象子类的普通子类可以不重写
- final 不可变的
- final 修饰的引用类型不能更改地址, 可以更改值
- final 修饰的类不能被继承
- final 修饰基本数据类型, 必须赋初始值
- final 修饰的方法不能被子类覆盖
- 一个java文件中只有一个类用public修饰(包含main方法)
- 接口
- implements
- 接口只能用public 修饰
- 接口可以多继承, 但接口之间不能相互实现, 一个类实现了一个接口, 则接口中的所有方法都必须实现
- 无修饰词的接口, 默认为public static final
- 无修饰词的接口方法, 默认为 public abstract
- 重写接口的方法, 必须加public
- 内部类
- 匿名内部类
- 简化代码
- 实现接口或 继承抽象类
- 类名/接口名 a = new 类名/接口名(){ 重写抽象方法};
- 局部内部类
- 与局部变量平级
- 有几个class定义的类, 编译之后就会生成几个class文件
- 一般放在方法里面
- 局部内部类无法实例对象, 但可以通过外部方法调用内部类的方法
- 私有内部类
- private 与属性和方法平级
- 有几个class定义的类编译之后就会生成几个class文件
- 私有内部类对应的class文件格式: 外部类类名$内部类类名.class
- 无法创建内部类对象, 但可以间接调用内部类的方法
- 静态内部类
- static 与属性和方法平级
- 有几个class定义的类编译之后就会生成几个class文件
- 静态内部类对应的class文件格式: 外部类类名$内部类类名.class
- 可以实例内部类对象, 格式: 外部类类名.内部类类名 变量 = new 外部类().new内部类();
- 成员内部类
- 外部类对象必须已经创建
- 与属性和方法平级
- 有几个class定义的类编译之后就会生成几个class文件
- 可以实例内部类对象 格式: 外部类类名.内部类类名 变量 = new 外部类().new内部类();
- Object类
- 所有class定义的类的父类
- public int hashCode(){}
- public boolean equals(Object o){}
- String中的equals重写了此方法, 增加了一种按位判断的方法
- ==比较的是对象的内容, 包括地址, 也可以判定是一个
- equals比较的是值
- public String toString(){}
- 抽象类和接口
- 1. 抽象类可以有构造, 接口不能
- 2. 抽象类可以有成员变量, 接口不能
- 3. 只要有抽象方法的类, 即可称之为抽象类, 但接口必须全是抽象方法
- 4. 接口可以被多实现, 抽象类只能单继承
- java9.0之后 接口可以有私有方法
- *访问权限修饰符
- default (什么也不写) : 同包内可见, (类、接口、变量、方法)
- private : 仅本类内部可见 (变量、方法 不能修饰外部类)
- public : 对所有类可见 (类、接口、变量、方法)
- protected : 对同一包内的类 和其所有子类可见 (变量、方法 不能修饰外部类)