面向对象编程OOP
面向过程和面向对象
属性+方法=对象
面向过程:线性过程,第一步。。。第二步。。。第三步。。。适合一些简单的问题
面向对象:分类思想,一个事情分成几个部分,每个分类单独思考,符合复杂问题(微观是面向过程)
OOP本质:以类的方式组织代码,以对象的方式组织(封装)数据
核心思想:抽象
三大特性:封装、继承、多态
- 类是对象的模板,是对象的抽象。
- 对象是类的具体事物
- 静态方法static,类里直接调用,别的类用类型.方法名直接调用
- 非静态方法没有static,需要实例化一个对象,用对象.方法名调用,实例化后才存在,没有实例化不能调用
- 两个静态方法可以相互调用,但是静态不能调用非静态,因为没有实例化不存在
- 实参和形参类型要对应
- 值传递就是形参和实参的数值传递
- 引用传递,引用类型实参和形参的内存地址传递
- this:当前对象/当前类
类和对象的创建
- 一个项目应该只存在一个main方法,创建一个总的测试方法,application
- 其他类不要总是加public static void main(String[] args){ }
- 一个类只有属性和方法,没有其他东西
- 类是抽象的,需要实例化
- new对象时,会对属性进行默认初始化以及对类中构造器进行调用
- 可以对对象进行属性赋值,不同对象不同赋值
构造器详解
构造器也叫构造方法,是创建对象时必须调用的,有两个特点:(new person()中的person方法)
- 必须和类名相同
- 必须没有返回值,也不能用void
- 不写的话,编译时候会默认生成
- 写了有参,无参的就没了
构造器的作用:
- 无参构造器:设置对象初始值,不写的话默认null、0
- 有参构造器:new一个对象本质在调用构造器,有参的话,new对象是需要带上参数,可以传参给对象
- 当你有了有参构造,还想用无参构造,就要有无参数的构造方法两个都要写,无参直接{}也可以
- Alt+insert快捷键可以生成构造器
创建对象内存分析
封装详解
- 该露的露,该藏的藏
- 高内聚(类的内部数据操作细节自己完成,不允许外部干涉)
- 低耦合(暴露少量的方法给外部使用)
- 属性私有,get/set
- 一般都是属性私有,然后提供一些公有方法可以设置这些属性
- 意义
– 提高程序安全性,保护数据
– 隐藏代码实现细节
– 统一接口
– 系统可维护性增加了
继承详解
- 继承本质是对某一批类的抽象(对类的抽象),从而实现对现实世界更好的建模
- extends的意思是拓展,子类是父类的拓展
- java只有单继承,没有多继承
- 类之间的关系除了继承,还有依赖,组合,聚合
- 继承关系的两个类中,一个是父类,一个是子类
- 子类与父类之间,从意义上讲,应该具有“ is a ”的关系
- 子类继承父类,就会拥有父类的属性和方法
- object是所有类的老爹,所以有很多的方法,默认的
super详解
- super 调用父类的方法
- this 调用所用的子类的方法和变量
- 私有的方法不被继承
- 没有声明,默认用子类的
- 构造子类对象的时候,隐形之中也构造了父类(隐藏代码super(),而且在子类代码的第一行)
- 父类有参的话,子类必须传参才能调用父类构造方法
- super和this不能同时调用构造方法
- this没有继承也可以使用,但是super只有继承关系才可以用
方法重写
方法重写实现多态
重写都是方法的重写,和属性无关
父类可以构造子类对象,方法都有static时,方法从属于对象的类型
方法没有static时,从属于对象,因为子类重写了父类的方法,因此没事不要乱写static方法
重写只跟非静态方法有关,而且关键词只能是public
- 重写需要有继承关系,子类重写父类的,方法名必须相同,参数列表必须相同,方法体不同
- 修饰符范围可以扩大,但是不能变小;抛出的异常范围可以被缩小,但是不能扩大
- public>protected>default>private
- ClassNotFoundException<Exception
- 为什么需要重写?
- 子类不一定需要/满足父类的方法
什么是多态
可以实现动态编译
定义:同一方法根据发送对象的不同而采用不同的行为方式
- 一个对象的实际类型是确定的,引用类型不一定,父类的引用指向子类
- 引用类型 名字=new 实际类型();
- 对象能执行哪些方法主要看左边,如果父类型对象可以指向子类,但是不能使用子类独有的方法,如果非要用会强制转换到子类类型
- 父类引用指向子类,子类引用不能指向父类
多态是方法的多态,属性没有多态
没有关系,强制转换会出错
多态存在的条件:继承关系,方法重写
无法重写的情况:
static 属于类,不属于实例
final 常量
private 方法,私有
instanceof和类型转换
instanceof判断某个对象和某个类型有没有关系
类型转换可以理解为子类范围方法比较多,父类要使用子类方法,一定要强制转换为子类才可以用子类的独有方法;但是父类方法比较少,子类使用父类不需要转换
子类转为父类可能丢失部分方法
static关键字详解
静态方法一直存在,非静态需要打开,static 可以扩大使用范围
匿名代码块需要调用,静态代码块一直存在(只执行一次),可以设置初始值
抽象类
抽象类的所有方法交给子类实现
抽象类不可以new,只能被继承,被实现
抽象类可以写普通方法
抽象方法必须在抽象类中
思考:抽象类有构造器吗?抽象类存在的意义?
节省代码,提高开发效率
接口定义和实现
类是单继承的,但是接口是多继承的
- 普通类只有具体实现
- 抽象类有具体实现和规范
- 接口只有规范,自己写方法,专业的约束,实现约束和实现分离,(面向接口编程)
接口的本质:接口就是规范,契约,是一组规则
接口的声明是Interface
接口中的所有定义都是抽象的
如果类实现接口,就要重写接口中的方法
接口可以有属性,但要是常量,不经常用
接口没有实例化,没有构造方法
N种内部类
内部类就是一个类中再定义一个类,相对于内部类的概念就是外部类,A中定义B,B是A的内部类,A是B的外部类
- 成员内部类:可以拿到外部类的私有属性
- 静态内部类:外部类的static属性才可以被static内部类拿到
- 一个文件可以有多个class,但是只能有一个public的class
- 局部内部类
- 匿名内部类
异常
error和exception
异常指的是运行过程中不期而至的各种状况
异常发生在程序运行期间,影响了正常的程序执行流程
以下情况通常是程序员的错误
不处理异常,可能不能编译,大多数情况不需要自定义异常
大多数异常可以被程序处理
捕获和抛出异常(异常的处理)
五个关键字:try、catch、finally、throw、throws
try{//监控区域
}catch(捕获的某种异常,异常有多种可能,就用throwable大佬或者exception){
处理方法
}catch(){
}catch(){//提供捕获多种异常//越大的异常放越后面
}finally{
有没有异常都会执行的工作
}
(finally可选项,通常用于善后工作,关掉IO流等)
//快捷键Ctrl+Alt+T
//打印错误栈信息
知道什么情况下会出错,可以主动抛出异常,一般在方法中使用
方法中处理不了,可以在方法上声明抛出异常throws
自定义异常