目录
java中OOP的基本概念有哪些?
1、面向对象的世界观
面向对象的世界观的具体内容:
世界是由各种各样的具有自己独特的运动规律和内部属性的对象组成,不同对象之间互相作用和通讯就形成了缤纷的世界
2、类和对象
概念
对象:现实生活中客观存在的,万物皆可为对象,是类对应的实体,不同的对象有不同或者相同的运动规律和内部属性,对象之间存在交互和复杂的关系
类:是将现实中的对象抽象成java代码世界中的类(建模),用来封装对象的相关数据和处理这些数据的方法,当java中的一个类被创建/实例化(类-->对象)后就会加载进入内存
类是抽象的,而对象是具体的
类变量和实例变量
类变量:static修饰的变量成员变量,可以通过类型/类名访问
实例变量:没有static修饰的成员变量,必须通过实例对象访问
成员变量:java中,成员变量是指在类体的变量部分中定义的变量,也称为属性。成员变量声明在类中,方法体之外,在创建对象时实例化;成员变量可被类中的方法、构造方法以及特定类的语句块访问。如果声明成员变量时没对其初始化,则系统会使用默认值初始化成员
全局变量:定义在类中,作用于整个类,要考虑线程安全
局部变量:定义在方法中,只作用于某一块,运行时压栈,结束后出栈,线程安全
,类中的static代码块
类中的static代码块的特点:
在类加载完成,进行初始化时执行,且整个生命周期只被执行一次,一般的可用于资源初始化
使用过数据库的一定知道DBHelper这个类,它是数据库连接类,在这个类中的第一步就是加载数据库驱动资源,其代码就写在static代码块中:
修饰符
public、protected、friendly(默认)、private: 访问权修饰词
修饰符的作用域:(接口中定义的方法默认修饰符是public)
作用域 当前类 同一包中的类 子类孙类 其他包中的类 public √ √ √ √ protected(仅自己家族用) √ √ √ × friendly(默认) √ √ × × private √ × × × 为提高安全性,在开发过程中修饰符能用作用域范围小的修饰符就使用
abstract: 抽象类,不能实例化对象
final:最终类,不能有子类,在java中的游戏工具类会用final修饰符修饰,其目的就是为了让使用者只能直接实例化使用,不能修改和继承
3、继承
概念
继承的英文是extends,继承在java中存在的原因是因为在现实世界中存在着事物的分类,比如“花”是一个大类,而不同品种的花就是不同的小类,小类中即有大类的相关特征又具备自己的特征
这种分类的现象中代码中被形容成了继承,即父类和子类的关系,子类可以继承父类,具备父类的方法,也可以添加自己的方法,或者重写父类的方法,方法就是现实生活中事物的各种动作、行为
继承的作用
其重要作用就是实现多态(下面会讲),除此之外还可以复用父类的代码,提高代码利用率
4、方法的重载和重写
方法的概念
方法在现实生活中是事物的各种动作、行为,在java的世界中方法是类的行为(或者叫功能)
方法可以类比为是遥控器上的按钮,不同的按钮触发不同的控制效果
方法不能嵌套定义,即方法中不能再写方法
不能在方法体外直接写逻辑代码(static块除外)
方法的重载和重写
重载(Overload):一个类里面,方法名字相同,而参数不同,最常用的地方就是构造器的重载的好处:
传入不同的方法参数,具有不同的行为。(静态多态或叫编译时多态)
重载的规则:
- 必须改变参数列表(参数个数或类型不一样)
- 可以改变返回类型
- 可以改变访问修饰符
- 可以声明新的或更广的检查异常
- 方法能够在同一个类中或者在一个子类中被重载
- 无法以返回值类型作为重载函数的区分标准
重写(Override):是子类对父类的允许访问的方法的实现过程进行重新编写,但返回值和形参都不能改变
重写的好处:
好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。(运行时多态或叫动态多态 ,继承类,实现接口也是动态多态 )
重写的规则:
- 参数列表必须完全与被重写方法的相同
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(说明:java5 及更早版本返回类型要一样,java7 及更高版本可以不同)
- 访问权限不能比父类中被重写的方法的访问权限更低,例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected
- 父类的成员方法只能被它的子类重写
- 声明为 final 的方法不能被重写(最终方法,不能被重写)
- 声明为 static 的方法不能被重写,但是能够被再次声明
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法
- 构造方法不能被重写
- 重写的方法能够抛出任何【非强制异常】,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的【强制性异常】,或者比被重写方法声明的更广泛的【强制性异常】,反之则可以
5、抽象类
使用abstract修饰符修饰的类即为抽象类
抽象类中,可以定义抽象方法(使用abstract修饰符修饰的方法),但是不能实例化对象,一般用于给其他类继承
抽象类是对类型进行建模
6、接口
接口中所有方法均为抽象方法(jdk8之后不太合适)
接口不可实例化,jdk8:接口支持申明带实现的方法,关键字(default )
类只能单一继承,但可以实现多个接口
可以将接口理解为职责或契约,用于树立规范
接口是对行为的建模,也是多态的体现
小总结👉我的理解:现实生活中的名词事物,在java中就是类或者抽象类,现实生活中的动作行为特征就是java中的方法、接口
7、多态
概念
同一种行为,在不同的对象、不同的环境中有不同的形态
同样的类型(如动物类和狮子类,老虎类...),因为不同的实例产生不同的行为
类之间的关系也是一种多态的体现:类的对象对同一消息作出不同的响应,这些不同类要么是继承了相同的父类,要么是实现了相同的接口
多态的作用
解耦,各种设计模式的基础
产生多态现象的条件
1、有继承或实现关系
2、子类重写父类的方法
例外情况:
- static方法,因为被static修饰的方法是属于类的,而不是属于实例的
- final修饰的方法,不能被子类不重写
- private修饰的方法,对子类不可见,更不能被重写
- protected修饰的方法,虽然子类可见也能重写,但不能再外部引用
3、 实现同一接口
4、使用父类或接口类型来引用子类或接口的实现类(里氏替换),即一个父类可以继承的子类是多个的,比如人这个父类就可以继承男人,女人,按国家分就有更多了
8、异常
异常的分类
非强制异常(或叫非受检异常/运行时异常)
- 定义:RuntimeException及其子类都被称为运行时异常
- 特点:Java编译器不会检查它,出现此类异常时不管是否使用throws进行声明抛出或者通过try-catch进行捕获处理,都会编译通过
- 常见的非受检异常:ClassCastException(类转换异常)、IndexOutOfBoundsException(数组越界)、NullPointerException(空指针)、ArrayStoreException(数据存储异常,操作数组类型不一致)
强制异常(或叫受检异常/被检查的异常)
- 定义:Exception本身,以及Exception的子类除了“RuntimeException”之外的其他子类都属于受检异常
- 特点:Java编译器会检查它,此类异常必须通过throws进行声明抛出或者通过try-catch进行捕获处理,否则不能通过编译
- 常见的受检异常:IOException、SQLException、FileNotFoundException(文件未找到)
异常抛出的方式
try-catch-finally:对异常进行捕获并处理
throw、throws:用于抛出异常实例,在方法定义中声明该方法可能抛出的异常,如果异常为强制异常则方法调用者必须trycatch捕获或者继续抛出
java中常见的异常
异常也可以自己定义,最重要的是异常的命名
OOP中的设计原则有哪些?
1、开闭原则
开闭原则是所有原则的总目标,即所有原则最终都是为了走向开闭原则
开闭原则简单来说就是指对扩展开放,对修改关闭,即在添加新功能时,不需要修改源代码
开闭原则不修改源代码,减少了bug的引入,易维护,易定位错误(加入的代码中)
2、里氏替换原则
使用父类或接口类型来引用子类或接口的实现类,即子类应当可以替换父类并出现在父类能够出现的地方,里氏替换原则是多态的基础,即一个父类下有多种继承它的子类,可以用父类声明这些子类
3、迪米特原则
迪米特原则又叫最少知识原则,只与你的直接朋友交谈,不与"陌生人"说话
例如在添加功能代码时,一次只添加一个功能的代码,每个功能在代码上分类,便于找错和维护
优点:降低类之间的耦合度,提高模块的相对独立性
缺点:过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性
4、单一职责原则(DIP)
类不要承担太多的功能,职责要单一,减少因在类中添加新功能或者修改时bug引入的机会
如果承担太多功能,则每个功能的变化都会影响该类
5、接口分离原则(ISP)
客户端不应依赖它不需要的接口
可以理解为接口要符合单一职责原则
6、依赖倒置原则
高层模块不应该依赖底层模块,二者都应该依赖抽象
抽象不依赖于具体,具体依赖于抽象
中心思想是面向接口/抽象编程
原因:细节的东西往往是多变的,而越抽象则越稳定
7、 组合/聚合复用原则
如果处于代码复用的目的,则应该使用组合/聚合复用原则,而不要使用继承
这里简单解释一下组合和聚合
组合和聚合指一个对象由多个对象组成,之间紧密联系,但是组合的组成对象中如果有某个对象出现问题了可以再创建一个新的对象来代替原来的对象,而聚合则不能
这7个OOP设计原则就介绍到这里的,这也是我的理解,感兴趣的还可以多多翻看别的介绍文档,理解了这些设计原则,会对后期的深入学习有很大帮助