面向对象概念
- 面向对象的设计思想
1.1 什么是面向对象
一种看待问题的思维方式,着眼于找到一个特殊功能的具体个体,然后委托这个个体去做某些事情,我们称之为“对象”。
“对象”是计算机抽象世界看待世界的一种方式,“面向对象”可以用很多方式表达。
(1)世界上每一个事物都可以称为一个对象,
对象有身份/名字(identify)
,状态(state)
,行为(behavior)
比如:世界是由什么组成的?
具体的各种自然界的位置。
注意:在用语言文字来描述一件事的时候,其中的每个名词都可能被抽取出来作为一个“对象”。
在Java用什么来描述一个类?
类和对象的关系 class和Object的关系
如人类 (class)和 赵炳泉(Object)
类的概念:类是所有对象的抽象概念或者集合(物以类聚),对象称为类的具体实例
类是抽象的,对象是具体的 - 对象实例化 new 关键字 实例化一个对象或者创造一个对象
对象和对象的引用的关系 电视机和遥控器的关系,拿到了遥控器就可以控制电视机
Person person = new Person();
Person 表示对象的引用
在计算机中new一个对象的过程中 计算机做了什么
在内存中申请一片独立的空间,表示可以使用独立的空间运行程序,申请的空间大小由对象自身的属性决定
堆内存 栈内存
实体 地址
Person 使用变量名字 如”a”来代替地址
6. 面向对象的三大特性
封装
隐藏内部实现的细节,对外提供公共的访问方法
对于设计者来说,一个是安全性,防止代码被修改破坏
从调用者角度,忽略实现细节,只关注功能怎么调用
如何设计封装:
- package 包的概念引入:
对所有的class进行分类,以方便管理。包命名的规则:小写字母,一般都是四级目录
Com.company.project.model
如何编译包
javac -d . 类名.java
javac -d . *.java
如何执行:
Java 全路径(包名/…/…/…/类名)
8. 构造方法:
什么是构造方法?
构造方法是一个类在初始化的形态,类本身自带的特征。
//jvm会提供一个默认的构造方法,直到我们重新定义一个构造方法
构造方法的特点:
共有的,与类名相同,没有返回值
构造方法的用处在哪里?
初始化成员变量
This表示本类对象的引用
构造方法越多,代表在这个类初始化的时候,形态越多。
构造方法的重载(overload);
参数类型不同,参数次序不同,参数个数不同都能构成重载。
构造方法的重载
构造方法越多,实例化对象的类型就越多
类在编程中称为最小单元
9. 类的成员方法:
方法的概念:方法是一个类接受外部信息的其中的渠道。
方法在一个类中专门解决业务逻辑的。
public 返回值 方法名(参数列表){ return 返回值 }
10. 方法参数的传递:传值或者传递引用
对象的关系:
关联关系,类与类之间是可以互相调用的
方法的参数传递只能传递两种类型:
如果是要传值就是一个具体的值、
如果要传递引用,那么传递的是该对象的地址
11. static 用来修饰静态的方法,静态的代码模块,静态变量
12. 如果使用static
所修饰 的方法或者变量,可以使用类名直接调用,不需要new对象来调用,
13.static
修饰的变量在内存中只有唯一的一个地址 ,
14. 使用场景:只有在工具类中才可以使用,该方法被频繁的调用,确实节省内存空间
在非静态方法中是可以引用静态方法的
静态的代码模块无法调用非静态的
类的继承 extends
类与类的关系有哪些?
1. 关联(聚合)(has -a)
2. 继承关系 (is-a)
如果是关联关系,那么就是类调用类
所有的对象都是继承Object
类,Java
是单根继承的特点
单根继承的好处
能保证纯正的血统
子类可以调用父类的方法,减少代码的冗余度。
在父类的角度考虑问题,继承可以衍生父类的功能(扩大功能)
里氏替换原则
将多个类中重复的方法提取出来作为父类的方法,用多个方法去继承父类的方法
单根继承的不好
当父类的方法出现问题,子类调用的时候就也会出现问题
多继承的好处是什么??
方法更多
如果子类继承父类,子类可以调用父类的公有方法
子类调用父类的时候,父类的构造方法会被调用
Super关键字只能存在子类中,主要在子类的方法中调用父类的方法,包括构造方法
写在程序的第一行
super就是子类调用父类方法的关键字;
Super可以在子类的构造方法中调用父类的构造方法super();
因为需要调用父类任何的构造方法
重写(override)子类覆盖父类的同名方法,好处在于扩充子类的方法功能。
final关键字
表示最终的。如果用final所修饰的变量,称为常量(不能被改变或者赋值)
如果final修饰一个方法,那么该方法在子类中不能被重写
如果final修饰一个类,那么这个类不能被继承
14. 抽象类
abstact
关键字
public abstract class 类名{
}
- 抽象类和普通类的区别在哪里?
基类是可以实例化的,抽象类是不能被实例化的,也就是不能使用new 关键字 - 定义一个抽象类的用途是什么?
- 抽象的概念是不需要实际去做的,但是在实际应用中有两种实际用途:
- 父类某一个功能或者方法,需要子类强行去重写的,这个类必须是抽象类
- 父类对于某一个方法无法预知子类会怎么实现,那么该方法必须是抽象的
- 抽象类在继承的关系图中起什么作用?
承上启下的作用
如果一个类里面有抽象方法,必然是抽象类,反之抽象类不一定有抽象方法
接口 interface
接口的概念
接口是一种标准,所有实现该接口的子类都要实现这个标准。
接口也是一种契约,所有的实现该接口的子类都要实现该接口的条款
接口也是一种身份特征,所有的子类都具有该身份特征。
接口里面的所有方法都是抽象的,公有的。
接口里所有的成员变量都是常量。
接口可以继承接口
16. 多态
17. 什么是第多态?一个事物在不同的条件下,所表现出的多种形态
18. 在开发中使用多态的场景,主要使用用在方法的参数传递上,可以传递接口,也可以传递抽象类
异常
Exception
异常是一个对象
异常就是错误,是在程序编译阶段或者执行过程中的错误。
学习异常主要是调试程序的错误信息,根据错误信息来发现程序的bug
异常分类:运行时异常和编译异常
异常的级别Error
和Exception
Error
:表示不可抗因素造成的
Exception
:表示程序运行错误,是可以调试的
捕获异常的语法
try{
假设代码运行正常
}catch(异常类型){
}finally{
//不管程序是否出错,都执行
}
异常的类型必须要明确的,这样才能准确的找出错误。
throws
和throw
的区别 声明异常和 抛出异常
声明异常(throws)>=抛出异常(throw)
自定义异常信息:标准的异常中无法描述错误信息,我们需要自己定义一个异常信息。
Catch
的捕获需要从小到大
什么时候捕获异常,什么时候抛出异常?
如果我们调用的是标准的API文档的方法,如果该类抛出异常,我们必须要捕获。
在实际开发中,我们所编写的程序的功能执行成功与否,与外界有紧密关系(比如,参数传递,调用关系)必须要抛出异常
某些方法在调用的时候会抛出异常,抛出异常就必须要处理
例如在某些方法在API中描述的时候就把调用时可能会抛出的异常写在之中。
例如,方法中的参数错误传递,even
Example
**Class FileInputStream**
public FileInputStream( )
throws FileNotFoundException
**Throws:**
[FileNotFoundException] - if the file does not exist, is a directory rather than a regular file, or for some other reason cannot be opened for reading.
[SecurityException] - if a security manager exists and its checkRead method denies read access to the file.