Loading

学习笔记 - Java 面向对象_上

学习面向对象内容的三条主线

  • Java 类及类的成员:属性、方法、构造器;代码块、内部类
  • 面向对象的特征:封装、继承、多态、(抽象)
  • 其他关键字的使用:this、super、package、import、static、final、interface 等

类的相关概念

类和对象概述

类(Class)和对象(Object)是面向对象的核心概念。

  • 类:具有相同特征的事物的抽象描述,是抽象的,概念上的定义;
  • 对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)。

类的成员概述

Java 中用类(Class)来描述事物。类是一组相关属性和行为的集合,是类最基本的两个成员。

  • 属性:该类事物的状态信息,对应类中的成员变量
    • 成员变量 <=> 属性 <=> Field
  • 行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法
    • (成员)方法 <=> 函数 <=> Method

类的实例化

概述

等价描述:类的实例化 <=> 创建类的对象 <=> 创建类的实例

格式:类类型 对象名 = new 对象实体

例如:

Phone p1 = new Phone();
Scanner scan = new Scanner(System.in);

面向对象完成具体功能的三步操作

  1. 创建类,设计类的内部成员(属性、方法);
  2. 创建类的对象;
  3. 通过对象调用内部声明的属性和方法,完成相关的功能

对象的内存解析

image-20230814170816072 image-20230814171159956

对象数组

定义

当数组的元素为引用数据类型的时候,我们称其为对象数组。

内存解析

image-20230814171159956

类的属性

成员变量和局部变量相同点

  • 变量声明的格式相同:数据类型 变量名 = 变量值
  • 变量都有其有效的作用域,在作用域外就会失效
  • 变量必须先声明,后赋值,再使用。

成员变量和局部变量不同点

  • 类中声明的位置不同
    • 属性:声明在类内,方法外的变量
    • 局部变量:声明方法、构造器内部的变量
  • 在内存中分配的位置不同
    • 属性:随着对象的创建,存储在堆空间中
    • 局部变量:存储在栈空间中
  • 生命周期
    • 属性:随着对象的创建而创建,随着对象的消亡而消亡
    • 局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配;随着方法对应的栈帧出栈,局部变量消亡
  • 作用域
    • 属性:在整个类的内部都是有效的
    • 局部变量:仅限于声明此局部变量所在的方法(或构造器、代码块内)
  • 是否可以用权限修饰符进行修饰:
    • 属性:可以
    • 局部变量:不可以
  • 是否有默认值
    • 属性:都有默认初始化值,如果没有给属性进行显式地初始化赋值,则会有默认初始化值
    • 局部变量:都没有默认初始化值,在使用局部变量之前,必须要显式地赋值,否则报错

类的方法

概述

方法是类或对象行为特征的抽象,用来完成某个功能操作。

将功能封装为方法可以实现代码重用,减少冗余,简化代码。

Java 里的方法只能被定义到类里。

方法声明的格式:

权限修饰符 [其它修饰符] 返回值类型 方法名(形参列表) [throws 异常类型] { //方法头
	//方法体
}

注意

  • Java 里的方法不能独立存在,所有的方法必须定义在类里;
  • Java 里的方法不调用就不执行。每调用一次就执行一次;
  • 方法内可以调用本类种的方法和属性;
  • 方法内不能再定义方法

方法调用的内存解析

  • 形参:方法在声明时,一对 ( ) 内声明的一个或多个形式参数,简称为形参;
  • 实参:方法在被调用时,实际传递给形参的变量或常量,称为实际参数,简称实参。
image-20230814171159956

每当一个方法被调用,就入栈,方法执行结束就出栈。

方法中的基本数据类型,都在栈中存储,引用数据类型在堆中存储,栈中只存储地址。

方法的重载(overload)

在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。满足这样特征的多个方法,彼此之间构成方法的重载。

总结为两同一不同:

  • 两同:同一个类、相同的方法名;
  • 一不同:参数列表不同。
    • 参数个数不同;
    • 参数类型不同。

注意:方法的重载与形参的名、权限修饰符、返回值类型都无关。

同一个类中不允许定义两个相同的方法,即方法名相同且形参列表相同(形参列表相同指的是参数个数和类型都相同,与参数名无关)。

可变个数形参的方法

在调用方法时,可能会出现形参类型确定但个数不确定的情况,此时就可以使用可变个数形参的方法。

格式:(参数类型 ... 参数名)

说明:

  1. 可变个数形参的方法在调用时,所赋给实参的个数可以为 0 至多个;
  2. 可变个数形参和重载同时出现时,重载优先级更高;
  3. 可变个数形参等同于一个数组类型的形参,二者不构成重载(不能同时出现),例如:test(int ... nums) <=> test(int[] nums) 。在方法中调用时也是作为数组调用;
  4. 可变个数形参必须在形参列表的末尾,且只能有一个(意味着不会有两个不同类型的可变个数形参),例如:test(int num1, int ... nums)

方法的值传递机制

对于局部变量来说,如果出现赋值操作:

  • 如果是基本数据类型,则将此变量保存的数据值传递出去;
  • 如果是引用数据类型,则将此变量保存的地址值传递出去。

方法的参数传递与之相同:

  • 如果形参是基本数据类型,则将实参保存的数据值赋给形参;
  • 如果形参是引用数据类型,则将实参保存的地址值赋给形参。

递归方法

方法自己调用自己的现象就称为递归。

说明:

  • 递归方法包含了一种隐式的循环;
  • 递归方法会重复执行某段代码,但无需循环控制;
  • 递归一定要向已知方向递归,否则就会变成无穷递归,类似死循环,最终发生栈内存溢出。

封装性

封装是把客观事物封装成抽象概念的类,并且类可以把自己的数据和方法开放给可信的类或对象,对其他类或对象隐藏信息。

Java 中通过权限修饰符对类和方法进行封装,具体的访问范围如下:

修饰符 本类 同包 子类 全局
private
default(缺省)
protected
public

构造器

概述

构造器(constructor,也可以叫做构造方法)一般搭配 new 关键字使用,用来创建类的对象,可以给对象的相关属性赋值。

格式:权限修饰符 类名(形参列表){}

注意

  • 创建类以后,在没有显示提供任何构造器的情况下,系统会默认提供一个空参的构造器,且构造器的权限与类的权限一致;

  • 一旦类中声明了构造器,则系统不再提供默认的空参构造器;

  • 一个类中可以声明多个构造器,彼此之间构成重载。

补充知识

类中属性赋值过程

  1. 默认初始化;
  2. 显式初始化;
  3. 构造器初始化;
  4. 通过 对象.方法 赋值;
  5. 通过 对象.属性 赋值。

其中 1-3 是对象实例化过程,只能执行一次, 4-5 可以执行多次。

JavaBean

JavaBean 是一种 Java 语言编写的可重用组件,它满足以下要求:

  1. 类是公共的;
  2. 有一个无参的公共的构造器;
  3. 有属性,且有对应的 get、set 方法。

UML 类图

在软件开发中,使用 UML 类图可以更加直观地描述类内部结构(类的属性和方法)以及类之间的关系(如关联、依赖、聚合等)。

在 UML 类图中,表示方法如下:

  • + 表示 public 类型, - 表示 private 类型,# 表示 protected 类型;
  • 方法:方法的类型(+ 或 -) 方法名(参数名: 参数类型): 返回值类型
  • 斜体表示抽象方法或类。
image-20230816180009237
posted @ 2023-08-16 18:10  KoiC  阅读(12)  评论(0编辑  收藏  举报