面向对象
一.面向对象简介
1.面向对象是什么
oop : Object Oriented programming
面相对象是一种程序设计的范型,一种思想。 使用类 和对象 的概念来进行设计程序
一切皆对象,世间万物都是对象
2.两个概念
2.1类
类是具有相同的特征和行为的一组对象的抽象
张三 李四 王五 ---- 人类
旺财 大黄 二狗 ---- 狗类
类是同一类型的抽象,没有具体事物与之对应 : 如 人类 狗类
2.2 对象
对象是类的实例
对象是某个具体事物: 如 这个学生 这只狗
类和对象的关系: 类是对象的模板 对象是类的具体体现
二.类的使用
1.定义类
语法:
public class 类名{
// 属性 -- 这种类型的特征
// 方法 -- 这种类型的行为
}
类:
- 一个类就是一个数据类型,定义一个类其实就是创建了一个类型 — 引用类型
- 类名 要规范
- 一个文件(.java)中可以定义多个类,但只能有一个public修饰的类,且此类的名称必须与文件名相同
属性:
- 类的特征
- 定义方式 : 数据类型 属性名;
- 属性名要规范 驼峰命名法
方法:
- 类的行为
- 定义方式: public 返回值类型 方法名(参数){ 方法体 具体代码 }
- 方法名 驼峰命名法 一般多使用动词 updateStudent run
2.创建对象
语法:
//方式一
类名 对象名 = new 类名();
//方式二
类名 对象名;
对象名 = new 类名();
3.访问对象
访问对象的属性: 对象名.属性名
访问对象的方法: 对象名.方法名()
三.this关键字
1.全局变量和局部变量
全局变量:
- 在类中定义的变量,称为全局变量,也就是属性
- 在整个类都可以使用 — 作用域
- 有默认值,可以直接使用
局部变量:
-
除了全局变量以外的其他变量,如: 主方法中,自定义的方法,某个段代码中
-
只能在局部使用
-
没有默认值,必须赋值才能用
-
局部变量和全局变量同名,局部变量的优先级更高。 默认访问的是局部变量
可以使用this关键字来解决局部变量和全局变量同名的问题
2. this用法
this 表示当前类的一个对象
- 局部变量和全局变量同名,可是使用this.变量名,来访问全局变量
- this可以用来调方法
四.static关键词
static 表示静态的,可以用来修饰变量和方法,分别称为 静态变量 静态方法
1.静态变量
使用 static 修饰的变量 : static 数据类型 变量名;
静态变量为类的所有对象共有,属于整个类,不属于某个对象特有
静态变量只在内存中分配一块空间
访问方式: 对象名.变量名 类名.变量名(推荐)
2.静态方法
使用static修饰方法
访问方法: 对象名.方法名 类名.方法名()推荐的
静态方法中只能访问静态变量或调用静态方法,不能直接访问普通方法和变量
五.方法的重载
一个类中包含两个或两个以上同名的方法,其参数不同,称为方法的重载(overload)
- 在同一个类中
- 方法名相同
- 参数列表不同 (参数个数,类型,顺序至少有一项不同)
- 与方法的返回值类型,形参名无关
六.构造方法
构造方法是一种特殊的方法,也称 为构造函数, 构造器 constructor
作用: 用于创建对象 和初始化对象的(对对象进行初始化赋值)
特点:
-
方法名必须与类名相同
-
没有返回值,不能写void
-
当创建一个类的对象时,实际上会自动调用构造方法
-
如果没有自定义的构造方法,类中会有一个默认的无参的构造方法
-
一个类中可以有多个构造器(构造方法的重载)
没有参数的构造器: 创建一个没有初始值的对象
可以带一个或多个参数的构造器: 在创建对象的同时初始化对象,给指定的属性赋值
-
如果自定义了构造方法,默认的无参构造就没有。
-
可以使用this(参数) 调用当前类中的另一个构造方法,但只能出现在构造方法的第一行
七.包 package
包的作用:
- 区分同名的类
- 类比较多的时候 便于管理
声明包:
- 用来指定当前类所在的包
- package 包名;
- 必须位于第一行(注释行不算)
命名规范:
- 采用反向域名法 com.公司名.模块名 com.baidu.fanyi com.itany.user
- 使用小写字母
导入包:
- 当需要使用其他包中的类时必须导入包
- 使用import import 包名.类名
- 必须位于包声明的下面
java.lang 包 中包含了java的核心类, 默认自动导入, 不需要import导入
八.访问修饰符
用来控制访问的范围 ,可以修饰属性,方法, 类等;
修饰符 | 同一个类 | 同一个包中的类 | 不同包的子类 | 不同包并不是子类 |
---|---|---|---|---|
public 公开的 | √ | √ | √ | √ |
protected 受保护的 | √ | √ | √ | |
默认 | √ | √ | ||
private 私有的 | √ |
总结:
- public :在哪都能访问
- protected: 只有不同包并且不是子类就不能访问,其他能访问
- 默认: 只有在同包中可以访问
- private: 只有在本类中可以访问
- 范围的从大到小的顺序 public > protected > 默认 > private
九. 对象初始化顺序
1.类加载
概念: 将 class文件读取到JVM内存中的过程,称为类加载。
类加载的时机
- 创建类的对象
- 调用类的静态属性或静态方法时
- 执行main方法时,main方法所在的类会被加载
- 通过反射调用类
2.类的成员
类中有哪些成员
- 属性(静态属性,非静态属性(实例属性))
- 方法(静态方法 实例方法)
- 构造方法
- 代码块 ( 静态代码块 , 普通代码块)
3.执行顺序
执行顺序 : 静态代码块 》 代码块,属性 》 构造方法 》 根据调用顺序执行具体的方法
十. 面向对象的三大特征
1.封装
1.1java代码规范
- 将类的属性封装在类中,不允许在类的外部直接访问,保证数据安全性,使内容可控
- 只能通过特定的方法才能对数据进行访问
- 类的基本原则就是封装
1.2实现方式
-
将属性私有化
使用private 修饰属性
-
提供对外访问的方法, 用于赋值和取值
使用public 修饰方法
方法的名字规范:
- 赋值方法: 以set开头,后面接属性名 如:setName()
- 取值方法: 以get开头,后面接属性名 如: getName()
2.继承
2.1概念
可以让一个类继承另一个类,此时该类会继承另一个类中的属性和方法
去继承的类称为子类,被继承的类称为父类(超类/ 基类)
继承是一种 is a 的关系 cat is a animal user is a person
2.2 实现方法
语法:
public class 子类 extends 父类{
}
作用:
- 代码复用: 将多个子类中相同的属性和方法 定义到父类中
- 功能扩展: 子类可以有自己独特的属性和方法
特性:
-
java中只支持单继承。 但支持多层继承,继承的传递
-
java中所有的类都直接或者是间接的继承了 java.lang.Object类 (后面会讲)
Object类是所有类的父类 ,每个类都会继承 Object类中的方法
2.3 继承的范围
子类可以继承父类的哪些成员
- 父类中用 public protected 默认 修饰的属性和方法,都可以继承 (同包的情况下)
- 父类中private 修饰的属性和方法不能被子类继承
- 父类的构造方法不能被子类继承( 构造方法 名必须与类名相同,而子类名称不可能与父类名称相同)
2.4构造方法的调用
调用过程:
- 创建子类对象时,会自动调用父类无参的构造方法(此时必须保证父类中有无参的构造,否则子类会报错)
- 从子类 开始,依次往上调用父类的构造方法,直到Object类,然后在会到子类中,执行后续的代码
super关键字:
- 表示父类的对象,只能在子类中使用
- 可以使用 super() 调用父类的构造方法 ,位于第一行
- 可以使用 super.xxx 访问父类的属性和方法。解决父类和子类属性同名的问题
2.5方法的重写
子类中的方法,与父类中的方法名称,参数,返回类型都一样,我们就说子类重写了父类的方法,称为为方法重写 override
- 在父子类
- 返回类型可以相同 也可以是子类类型
- 访问修饰符不能缩小
作用:用来重写定义子类的行为,解决父类和子类的差异性
面试: 方法重写和方法重载
3.多态
3.1概念
多态: 一种事物,具有多种表现形态。
多态的体现: 重写, 父类的引用指向子类的对象。 称为向上转型(自动转换)
基本类型之间的转换
- 自动
- 强制
引用类型之间的转换
3.2引用类型之间的转换
-
自动(向上转型)
将子类对象转换为父类 Student ----- Person
将父类的引用指向子类的对象
特性:
- 通过父类保存 的变量 调用的是 子类 重写后的方法,不是父类的方法
- 通过父类保存的变量 无法调用子类特有的属性和方法
-
强制(向下转型)
将父类转为子类, 进行强制转换
语法: (子类类型)父类对象
特性:
- 向下转型后,可以访问子类特有的属性和方法
- 转换时,父类必须为真实的子类类型,否则会出现转换异常 ClassCastException(类型转换异常)
- 向下转型是不安全的。 可以在转换时 使用 instanceof 关键字去判断当前对象的类型,避免出现转换异常
3.3多态的应用
将父类作为方法形参,将子类的对象作为方法实参,实现多态---- 减少代码量
将父类作为 返回类型, 可以直接返回子类类型 ----- 减少代码量
案例: 主人类 宠物类 (Pet类 Dog类 Cat类)
- 主人类: 领养宠物,给宠物喂食,与宠物玩耍的方法
- 宠物类: 吃食物,玩耍的方法
优点:
- 减少代码量
- 提高可扩展性