面向对象 总结
构造方法
构造方法的名字必须和所在类的名字一致,没有返回值,但不能声明void,访问权限可以为任意,但是一般情况下使用public方法权限,构造方法中的参数可以根据需要自行定义,参数的不同的构造方法构成重载。
重点
java中构造方法的使用:
1.跟在关键字new后面,类名加上一个小括号(),小括号内根据实际加上实参
2.跟在关键字super或this后加上一个小括号(),小括号内根据实际添加实参
this或super调用构造方法只能出现在构造方法中,而且必须出现在第一行,所以一个构造方法中第一行只能为this或super调用构造方法,两者不能同时调用构造方法出现
java中构造方法的作用
1.为了初始化成员属性,而不是初始化对象,初始化对象是通过new关键字实现的
2.通过new调用构造方法初始化对象,编译时根据参数签名来检查构造函数,称为静态联编和编译多态
(参数签名:参数的类型,参数个数和参数顺序)
3.创建子类对象会调用父类构造方法但不会创建父类对象,只是调用父类构造方法初始化父类成员属性;
面向对象三大特性
继承
继承的条件
- 拥有一个父类
- java只支持单继承
- 若要多个继承只能一个接着一个继承 比如:A→B→C
继承的作用
子类拥有父类所有的属性和方法
extends关键字
extends 格式:class 子类 extends 父类{ }
super关键字
super 格式 super. super() 实现对父类成员的访问(构造方法、方法、成员变量)
方法重写
重写父类的方法
- 一定要发生继承关系
- 参数列表要一致
- 返回类型要一致
Tips:
可以用<a>@override</a>注解判断是否重写
Object
Object 是所有类的基类、超类、父类
封装
static关键字
public : 外界一定是通过该方法获取当前类的实例对象 所以对外一定要可见
static : 构造器都私有了 外部肯定无法获取到当前类的实例对象 所以只能用static修饰 属于类的 可以通过类名调用 不加static要通过对象调用 对象没有
返回值 : 当前类的实例
权限修饰符
| 能否被访问 | 本类 | 同包下的子类 | 同包下的无关类 | 异包下的子类 | 异包下的无关类 |
|---|---|---|---|---|---|
| public | ✔ | ✔ | ✔ | ✔ | ✔ |
| protected | ✔ | ✔ | ✔ | ✔ | ✖ |
| 默认的(不写) | ✔ | ✔ | ✔ | ✖ | ✖ |
| private | ✔ | ✖ | ✖ | ✖ | ✖ |
Tips:
可以修饰变量、方法、类
单例模式
单例模式:书(大话设计模式、设计模式之禅、ODD)
什么是单例: 一个类只能产生一个实例对象 *
什么场景下使用单例:windows 任务管理器 Spring SessionFactory
如何编写?
1.构造器私有
2.对外提供过去对象的方法
3.声明一个static的成员变量 类加载的时候创建当前单例对象 4:在获取对象方法中返回成员变量的值
饿汉式
- 缺点: 不能做到延迟加载
- 优点: 天然线程安全
懒汉式
- 线程不安全
- 优点:能够做到延迟加载
多态
多种形态 前提:父类 a = new 子类()多态:a.父类方法() 编译看左边(父类中是否存在此方法),运行看右边(子类中是是否存在此方法)。
构成多态的条件
- 继承关系
- 父类变量指向了子类对象
- 一定要有方法的重写
Tips:
父类引用其子类对象,可以看成是类型自动转换,由小类型转换到大类型
类型转换
自动转换
父类型 变量名 = 子类对象; [new 子类对象|子类对象的变量]
强制转换
子类型 变量名 = (子类型)父类变量; [事先确定了父类变量中实际存储的对象是什么类型] 否则会出现ClassCastException类型转换异常
类的加载顺序
三种代码块
重点如下
{} 代码块:
局部代码块:声明在方法中的代码块
缩减局部变量的生命周期 提高内存是使用率
成员代码块:初始化块
声明在方法外 类中的代码块
初始化块在类加载的时候是不会执行的
在创建对象之前会被调用(对于对象中的一些初始进行初始化操作)
静态代码块:
声明在类中 方法外 且使用static修饰
类加载的时候就会被加载 并且只加载1次 静态内容
类中的执行顺序:
1:首先执行静态内容(加载) 静态代码块
2:初始化块
3:构造器
类加载:
使用当前类中的静态方法、静态变量
创建当前类的实例对象