OOP面向对象编程

OO面向对象

  • 类和对象
  • this关键字
  • 构造方法
  • 继承 extends
  • super
  • 方法的重写(override /overriding)
  • final
  • 抽象 abstract
  • 接口
  • 多态
  • 补充
    • 面向过程:
    • 面向对象:
    • 默认值规则:
    • 内存管理:
    • 泛化
  • 内部类
  • 封装
    • 访问控制修饰符
    • 静态
      • 静态变量
      • 静态块
      • 静态方法
  • 枚举

类和对象

什么是类?什么是对象?

  • 类,变量和方法组成的一种新的数据类型——引用类型
  • 现实生活是由很多对象组成的,基于对象抽象了类

类中可以包含:

  • 对象的属性、特征、数据,设计为成员变量
  • 对象的行为、动作、功能,设计为方法

对象: 软件中真实存在的单个的个体、东西
类: 类型 / 类别,代表一类个体

  • 类是对象的类别 / 模板 / 图纸
  • 对象是类的具体的实例
  • 类是一种引用数据类型

类中包含:
成员变量 ------- 对象的属性
方法 ------------- 对象的行为、功能

声明类型的引用变量,指向对象

this关键字

this:指代当前对象,
只能用在方法中,方法中访问成员变量之前默认有个this
this指代当前对象,哪个对象调用方法,this指的就是哪个对象

  • this.成员变量名 —— 访问成员变量
  • this.方法名() —— 调用方法
  • this() ———— 调用构造方法

当成员变量与局部变量同名时,若想访问成员变量,则this不能省略

构造方法

构造函数、构造器、构建器、
好处: 复用给成员变量赋初始值的代码
作用: 给成员变量赋初始值
语法: 与类同名,没有返回值类型(连void都没有)
调用: 在创建new对象时被自动调用

  • 若自己不写构造方法,则编译器默认提供一个无参构造方法,若自己写了构造方法,则不再默认提供无参构造,无参构造会被覆盖
  • 构造方法可以重载

继承 extends

  • 通过extends实现继承
  • 作用:实现代码复用
    超类、父类、基类 -> 共有属性和行为
    派生类、子类 -> 特有的属性和行为
  • 派生类可以访问超类的和派生类的,但超类不能访问派生类的
  • 一个超类可以有多个派生类,但一个派生类只能有一个超类,称为单一继承
  • 继承具有传递性

super

指代超类的成员变量
super . 成员变量名 -> 访问超类的成员变量
super . 方法名() -> 调用超类的方法
super()-> 不写且默认有该关键字调用超类的无参构造方法

  • 当超类成员变量和派生类成员变量同名时,super指超类的,this指派生类的
  • 若没有同名现象,则写super和this是一样的

Java规定: 构造派生类之前必须先构造超类
为了保证这个规则,Java做了两种操作

  1. 在派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法
    注:super()调用超类构造方法必须位于派生类构造方法的第一行
  2. 在派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供

方法的重写(override /overriding)

  • 发生在父子类中,方法名相同,参数列表相同
  • 重写方法被调用时,看对象的类型执行方法,即new谁就调用谁的方法

final

表示最终的,不可改变的
修饰变量:表示变量不能被改变
修饰方法:表示方法不能被重写
修饰类:表示类不能被继承

抽象 abstract

只有方法的定义,没有具体的实现(连{}都没有)

包含抽象方法的类必须是抽象类
由abstract修饰
抽象类不能被实例化(new对象)
抽象类是需要被继承的,派生类有两种处理方法

  1. 也声明为抽象类
  2. 必须重写所有抽象方法

抽象类的意义

  1. 封装共有的属性和行为,实现代码复用
  2. 可以包含抽象方法,为所有派生类统一入口(名字统一),强制必须重写

接口

是一种引用数据类型
由interface定义
只能包含抽象方法(常量、默认方法、静态方法、私有方法)
接口不能被实例化(new对象)
接口是需要被实现的,实现类:必须重写接口中的所有抽象方法
注意:重写接口中的抽象方法时,必须加public
一个类可以实现多个接口。若又继承又实现,先继承再实现
接口可以继承接口

接口的应用:

  1. 接口是对继承单根性的扩展 实现多继承
  2. 接口是一种标准、规范,表述具备某种功能
    实现了某接口就具备某个功能,不实现接口就不具备那个功能

类间关系
类和类 -> 继承+
接口和接口 -> 继承
类和接口 -> 实现

多态

向上造型/自动类型转换

  1. 超类型的引用指向派生类的对象
  2. 属性看引用类型的

Animal o new Animal();
Dog o = new Dog();
Animal o = new Dog(); 把子类造成父类
Dog o new Animal //编译错误

应用1:
将超类型(Animal)作为参数类型
传递派生类(Dog Chick Fish) 对象
以扩大方法的应用范围
实现代码服用
应用2:
将不同对象(Dog chick Fish)
统一封装到超累数组 (Animal数组) 中来访问
实现代码服用

向下转型
向下转型/强制类型转换,成功的条件只有如下两种
1 引用所指向的对象,该类型
2 引用所指向的对象,实现了该接口或继承了该类
强转是若不符合如上条件,则发生 ClassCastException 类型转换异常
何时需要强转:若想访问的属性/行为在超类中没有,则需要强转
建议:在强转之前通过 instanceof关键字 判断引用指向的对象是否是该类型

引用类型数组
数组元素引用类型的数组,即为引用类型数组

补充

高质量代码
复用
扩展
维护
移植
健壮
可读
性能

面向过程:

以方法为单位来解决问题,比较合适简单的业务(大象装冰箱、银行取钱)

面向对象:

以对象为单位来解决问题,比较合适复杂的业务(造汽车,造航母)

OO: (Object Oriented)面向对象
OOA: (Object Oriented Analysis)面向对象分析
OOD: (Object Oriented Design)面向对象设计
OOAD:面向对象分析与设计
OOP: (Object Oriented programming)面向对象编程

默认值规则:

byte、short、int、long、char -> 0
float、double -> 0.0
boolean -> false
引用类型 -> null

内存管理:

由JVM来管理
堆: new出来的对象(包括实例(成员)变量、数组的元素、方法的地址)
栈: 局部变量(包括方法的参数)
方法区: .class字节码文件(包括所有方法、静态变量)

泛化

  1. 泛化:从程序设计角度而言叫泛化,从代码实现角度而言叫继承,泛化就是继承
  2. 继承要符合is(是)的关系
  3. 继承的是父类的成员变量和普通方法,不包括构造方法,父类的构造方法是被子类通过super()来调用的

内部类

特点
内部类中可以直接访问外部类的成员
内部类中有个隐式的引用指向了创建它的外部类对象 外部类名.this

成员内部类

  1. 类中套类,外面的称为外部类,里面的称为内部类
  2. 内部类通常只服务于外部类,对外不具备可见性
  3. 内部类对象通常在外部类中创建
  4. 内部类可以直接访问外部类的成员,在内部类中有个隐式的引用指向创建它的外部类对象。隐式的引用:外部类名.this
  5. 何时用:若A类(Baby)只让B类(Mama)用,并且A类(Baby)还想访问B类(Mama)的成员时,可以设计成员内部类

匿名内部类

  1. 若想创建一个派生类的对象,并且对象只创建一次,可以设计为匿名内部类,可以简化代码
  2. 注意:匿名内部类中不能修改外面局部变量的值
  3. 内部类有独立的class吗? 有

package
用于声明包
作用:避免类的命名冲突
规则:同包中的类不能同名,但不同包的类可以同名
类的全称:包名.类名
建议:包名常常有层次结构,所有字母都小写

import
用于导入类
同包中的类可以直接访问,但不同包中的类不能直接访问,
若想访问:
先import导入类,再访问类
或者类的全称,但不建议过于麻烦

封装

访问控制修饰符

作用:保护数据的安全(隐藏数据、暴露行为)
设计:数据(成员变量)私有化 private
行为(方法)大部分公开化 public

public 公开、任何类
private 私有的,本类
protected 受保护的,本类,子类、同包类
默认的:什么也不写,本类、同包类(Java不建议)

访问权限由低到高依次为:
private < 默认的 < protected < public

  • 类的访问权限只能是public或默认的类中成员的访问权限如上四种都可以

  • 成员内部类充当成员不是类

由static 修饰的成员变量即为静态变量
成员变量分两种:
1、 实例变量:没有static修饰,属于对象,存储在堆中,有几个对象就有几份由对象/引用访问

2、静态变量:有static修饰,属于类,存储在方法区中,只有一份由类名访问

静态

静态变量

  1. 由static修饰的成员变量
  2. 属于类,存储在方法区中,只有一份
  3. 常常通过类名点来访问
  4. 何时用:对象所共享的数据

静态块

  • 由static修饰的语句块
  • 属于类,在类被加载期间自动执行,因类只被加载一次
    所以静态块也只执行一次
  • 何时用:初始化/加载静态资源/静态变量

静态方法

  1. 由static修饰的方法
  2. 属于类,存储在方法区中,只有一份
  3. 常常通过类名点来访问
    静态方法中没有隐式this传递,
  4. 所以静态方法中不能直接访问实例成员(实例变量/实例方法)
  5. 何时用:方法的操作与对象无关(不需要访问对象的属性/行为)

由static和final共同修饰的成员变量,即为常量
常量名所有字母都大写,多个单词之间用分隔
NAME
CLASS_NAME
常常通过类名来访问,不能被改变

常量

  1. 必须声明相同初始化;
  2. 常常通过类名点来访问,不能被改变
  3. 建议:常量名

枚举

是一种引用数据类型
枚举类型的对象数目是固定的,常常用于定义一组常量
例如:季节、星期、月份、订单状态等
枚举的构造方法都是私有的
枚举的第一行默认都是罗列枚举对象名称

你可能感兴趣的:(JAVA语法,java)