day8--面向对象编程
面向对象编程
OOP
一、面向对象
- 面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考,最后才对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题
- 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统,但是,具体到微观操作,仍然需要面向过程的思路
面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
- 抽象
- 三大特性
- 封装
- 继承
- 多态
- 从认识论角度考虑是先有对象后有类。对象,是具体的事物,类是抽象的,是对对象的抽象。
- 从代码运行角度考虑是先有类后有对象。类是对象的模板。
二、方法回顾加深
-
方法的定义
- 修饰符
- 返回类型
- break与return
- 方法名
- 参数列表
- 异常抛出 (throw)
-
方法的调用
-
静态方法
类加载时加载
-
非静态方法
实例化类
-
形参和实参
-
值传递和引用传递
- 引用传递:对象,本质还是值传递
-
this关键字
-
三、对象的创建分析
类实例化后会返回一个自己的对象
构造方法:
- 跟类名同
- 无返回类型
- 如果定义了有参构造,就需要默认的定义无参构造
- alt+insert
作用:
- new本质在调用构造器
- 初始化对象的值
对象是通过引用来操作的
四、面向对象的三大特性
1 、封装
高内聚,
低耦合; 仅暴露少量的方法给外面使用
该露的露,该藏的藏
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
属性私有 get/set
意义:
-
提高程序的安全性,保护数据
-
隐藏代码的实现细节
-
统一接口
-
提高了系统的可维护性
2. 继承
继承的本质是对某一批类的抽象,从而实现对现实世界 更好的建模
extands的意思是扩展,子类是父类的扩展
java中类只有单继承,没有多继承
- 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等。
- 继承关系的两个类,一个为子类(派生类)一个为父类(基类)。子类继承父类,使用关键字extends来表示。
- 子类和父类之间,从意义上讲应该具有 is a 的关系
- object 类
- supper
- 方法重写
子类继承了父类,就会拥有父类的全部方法。
ctrl + h 继承树
在java中所有的类,都默认直接或者间接继承object类
调用父类构造必须在第一行
注意点
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造方法
this:
- 代表的对象不同:
- this本身调用者这个对象
- super代表父类对象的应用
- super只能在有继承关系的时候调用
- this()本类的构造
- super()父类的构造
方法重写
重写都是方法的重写,和属性无关
父类的引用可以指向子类
静态方法的调用只跟左边定义的类型有关
静态方法和非静态的方法区别很大
非静态public方法存在重写
需要有继承关系,子类重写父类的方法
1.方法名必须相同
2.参数列表必须相同
3.修饰符范围可以扩大,不能缩小 ,public>protect>default>private
4.抛出的异常,范围可以被缩小,但不能扩大: classNotFoundException --->Exception(大)
为什么需要重写
- 父类的功能,子类的功能不一定需要或者满足
3.多态
同一方法可以根据发送对象的不同面采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)
子类调用的方法都是自己的或者继承父类的
父类调用的方法都是自己的方法
instanceof (类型转换) 引用类型
instanceof 可以判断两个类型是否有父子关系
x instanceof y 看这个代码编译能不能通过,就看是否存在父子关系
子类转父类可能丢失自己本来的一些方法
注意
- 多态是方法的多态,属性没有多态
- 父类和子类有联系,类型转换异常 classCastException
- 存在条件:继承关系,方法需要重写,父类的引用指向子类对象
- static方法属于类,不属于实例
- final常量不能重写
- private方法也不能重写
static关键字
private static int age //静态变量
public static void go(){} //静态方法
static {
//静态代码块
}
import static java.lang.Math.random; //静态导入包
final 修饰的类,不能继承
五、抽象类和接口
abstract 修饰符可以用
抽象类的所有方法继承了它的子类必须实现
接口可以多继承
//抽象类
public abstract class Action {
//抽象方法 只有方法名字,没有方法实现
public abstract void doSomething();
}
- 不能new抽象类,只能靠子类去实现
- 抽象类里面可以写普通方法,抽象方法必须在抽象类中
- 抽象的抽象,约束
- 存在的意义,抽象出来,提高开发效率
接口
普通类:只有具体实现
抽象类:具体实现和规范都有
接口:只有规范,自己无法写方法,专业的约束,约束和实现分享
接口就是规范,定义的是一组规则,体现了现实世界中如果你是到必须能的思想,如果你是天使则必须能飞。
接口的本质是契约
oo的精髓是对对象的抽象。
//抽象的思维
public interface UserService{
//接口中定义的属性都是public static final
//接口中的所有定义其实都是抽象的 public abstract
void add();
void delete();
void update();
void query();
}
//实现了接口的类,就必须要实现接口的方法
public class UserServiceImpl implements UserService,Time{
}
public interface Time{
void timer();
}
-
约束
-
定义一些方法,让不同的人实现
-
接口不能被实例化,接口中没有构造方法
-
implements可以实现多个接口
-
必有要重写接口中的方法
六、内部类及oop实战
内容类就是一个类的内部再定义一个类。
-
成员内部类
通过外部类来实例化内部类
-
静态内部类
-
匿名内部类
一个java类中可以有多个class类,但是只能有一个类用public修饰
-
局部内部类
七、异常机制
-
什么是异常
异常指程序运行中出现的意外。Exception
异常发生在程序运行期间,它影响了正常的程序执行流程
-
异常体系结构
- 检查性异常
- 运行时异常
- 错误
-
java异常处理机制
-
异常处理
-
自定义异常
Exception
- RuntimeException
- ArrayIndexOutOfBoundsException
- NullPointerException
- ArithmeticException
- MissingResourceException
- ClassNotFoundException
异常处理机制
try catch finally throw throws
try{
//监控区域
//主动抛出异常
throw new Exception();
}catch (ArithmeticException e){ //想要捕获的异常
//捕获异常
}
catch (Error e){ //想要捕获的异常
//捕获异常
}
catch (Exception e){ //想要捕获的异常
//捕获异常
}
catch (Throwable e){ //想要捕获的异常
//捕获异常
}finally{
//执行善后工作
}
在捕获异常中,如果要捕获多个异常,需要catch从小到大
选中代码码 CTRL+ALT+T 包果代码
//throws 用在方法上
public void test() throws Exception{
throw new Exception();
}
自定义异常
用户自定义异常类,只需要继承Exception类即可
- 创建自定义异常类
- 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
- 在多生catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上try-catch,处理潜在异常
- 尽量去处理异常,切忌只是简单地打印异常
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加finally语句去释放占用的资源,IO.

浙公网安备 33010602011771号