再谈面向对象-2023(一)

学习面向对象的三条主线:

类及类的成员: 属性、方法、构造器、代码块、内部类
面向对象三大特征: 封装、继承、多态
其它关键字: this、super、package、import、static、final、interface、abstract等


1. 面向过程编程(POP) vs 面向对象编程(OOP)

简单的语言描述二者的区别

面向过程:
- 以函数为组织单位。
- 是一种“执行者思维”,适合解决简单问题。扩展能力差、后期维护难度较大。

面向对象:
- 以为组织单位。每种事物都具备自己的属性行为/功能
- 是一种“设计者思维”,适合解决复杂问题。代码扩展性强、可维护性高。

二者关系:

我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!

2. 面向对象编程的两个核心概念:类(Class)、对象(Object)

谈谈对这两个概念的理解?

类:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。

对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)

类与对象的关系:

类是对象的抽象;对象是类的具体。

  • 类定义了对象应具有的特征和行为,类是对象的模板;
  • 对象是拥有多个相同特征和行为的实体,对象是类的实例。
  • 类和对象就像是模具和产品的关系
  • 模具的作用就是用来生产产品的,定义类的目的是用来创建具有相同属性和行为的对象,由类生成对象的过程,也称为类的实例化过程。

定义类的注意点:

  • 一个java文件中只能有一个public修饰的类,文件名要与此类名相同。
  • 类名首字母一定大写,可以使用驼峰式命名方法。

3.“面向对象”设计思想的要点:

1、认为客观世界由各种对象组成
2、程序的分析和设计都围绕着:
(1)有哪些对象类、
(2)每个类有哪些属性,哪些方法、
(3)类之间的关系(继承、关联等)、
(4)对象之间发送消息(调用方法)


1.类的内部成员:

成员之一:成员变量 == 属性 == field(字段、域)
成员之二:成员方法 == 函数 == method(行为)

2.类的成员之一:属性

final
static
static
变量
成员变量
局部变量
常量
全局常量
静态变量 / 类变量
非静态变量 / 实例变量

变量的分类:

  • 按照数据类型来分:基本数据类型(8种)、引用数据类型(数组、类、接口、枚举、注解、记录)
  • 按照变量在类中声明的位置的不同:成员变量(或属性)、局部变量(方法内、方法形参、构造器内、构造器形参、代码块内等)

区分 成员变量 vs 局部变量

相同点:

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

不同点:

① 类中声明的位置的不同:

成员变量:声明在类内,方法外的变量
局部变量:声明方法、构造器内部的变量

② 在内存中分配的位置不同(难):

成员变量:随着对象的创建,存储在堆空间中。(实例变量存储在堆中 的对象实体中,类变量存储在堆中的静态域内)
局部变量:存储在栈空间中

③ 生命周期:

成员变量:随着对象的创建而创建,随着对象的消亡而消亡。
局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配;随着方法对应的栈帧出栈,局部变量消亡。

④ 作用域:

成员变量:在整个类的内部都是有效的
局部变量:仅限于声明此局部变量所在的方法(或构造器、代码块)中

⑤ 是否可以有权限修饰符进行修饰:(难)

都有哪些权限修饰符:public、protected、缺省、private。(用于表明所修饰的结构可调用的范围的大小)

成员变量,是可以使用权限修饰符进行修饰的。
局部变量,不能使用任何权限修饰符进行修饰的。

⑥ 是否有默认值:(重点)

成员变量:都有默认初始化值。意味着,如果没有给属性进行显式初始化赋值,则会有默认初始化值。
局部变量:都没有默认初始化值。意味着,在使用局部变量之前,必须要显式的赋值, 否则报错。
(对于方法的形参而言,在调用方法时,给此形参赋值即可。)

默认初始化值

在这里插入图片描述

属性赋值过程

1.可以给类的非静态的属性(即实例变量)赋值的位置有:

① 默认初始化
② 显式初始化 或 ⑤ 代码块中初始化
③ 构造器中初始化


④ 有了对象以后,通过"对象.属性"或"对象.方法"的方法进行赋值

执行的先后顺序:

① - ②/⑤ - ③ - ④

以上操作在对象创建过程中可以执行的次数如何?

只能执行一次:①、②、③、⑤
可以多次执行:④

(超纲)关于字节码文件中的的简单说明:(通过插件jclasslib bytecode viewer查看)

方法在字节码文件中可以看到。每个方法都对应着一个类的构造器。(类中声明了几个构造器就会有几个)
编写的代码中的构造器在编译以后就会以方法的方式呈现
方法内部的代码包含了实例变量的显示赋值、代码块中的赋值和构造器中的代码。
方法用来初始化当前创建的对象的信息的。

给实例变量赋值的位置很多,开发中如何选?

显示赋值:比较适合于每个对象的属性值相同的场景

构造器中赋值:比较适合于每个对象的属性值不相同的场景

2. 可以给类的 静态变量 赋值的位置有:

① 默认初始化
② 显式初始化 或 ④ 代码块中初始化
③ 在使用时,通过"类.属性"或"对象.属性"的方法进行赋值

3.可以给类的 常量 赋值的位置有:

见 final关键字

3.类的成员之二:方法

使用方法的好处

方法的理解:方法是类或对象行为特征的抽象,用来完成某个功能操作。
方法的好处:实现代码重用,减少冗余,简化代码

方法声明的格式 (重要)

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

注:[ ]中的内容不是必须的

具体的方法声明的细节

权限修饰符

Java规定了哪些权限修饰符呢? 有四种:private \ 缺省 \ protected \ public

返回值类型:描述当调用完此方法时,是否需要返回一个结果。
  • 无返回值类型:使用void表示即可。比如:System.out.println(x)的println(x)方法、Arrays的sort()
  • 有具体的返回值类型:需要指明返回的数据的类型。可以是基本数据类型,也可以引用数据类型
  • 需要在方法内部配合使用"return + 返回值类型的变量或常量"
方法名:

属于标识符。需要满足标识符的规定和规范。“见名知意”

形参列表

形参,属于局部变量,且可以声明多个,用逗号隔开。

分类:
无形参列表:不能省略一对()。
有形参列表:根据方法调用时,需要的变量的类型和个数,确定形参的类型和个数。

方法体

当我们调用一个方法时,真正执行的代码。体现了此方法的功能。

注意点

Java里的方法不能独立存在,所有的方法必须定义在类里。
Java中的方法不调用,不执行。每调用一次,就执行一次。
方法内可以调用本类中的(其它)方法或属性
方法内不能定义方法。

关键字:return

return的作用

  • 作用1:结束一个方法
  • 作用2:结束一个方法的同时,可以返回数据给方法的调用者 (方法声明中如果有返回值类型,则方法内需要搭配return使用)

注意点:

return后面不能声明执行语句。

方法的重载(overload)

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

  2. 总结为:“两同一不同”

    • 两同:同一个类、相同的方法名
    • 一不同:参数列表不同。→ ① 参数个数不同 ② 参数类型不同 ③参数顺序不同

注意(随便看看,记住两同一不同即可):
- 方法的重载与形参的名、权限修饰符、返回值类型都没有关系。
- 在同一个类中不允许定义两个相同的方法。只有满足两同一不同,两个同名的方法才有可能存在于同一个类中。

可变个数形参的方法 (jdk5.0)

  1. 使用场景
    在调用方法时,可能会出现方法形参的类型是确定的,但是参数的个数不确定。此时,我们就可以使用可变个数形参的方法

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

  3. 说明:
    ① 可变个数形参的方法在调用时,针对于可变的形参赋的实参的个数可以为:0个、1个或多个
    ② 可变个数形参的方法与同一个类中,同名的多个方法之间可以构成重载
    ③ 特例:可变个数形参的方法与同一个类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载。
    ④ 可变个数的形参必须声明在形参列表的最后
    ⑤ 可变个数的形参最多在一个方法的形参列表中出现一次

方法的值传递机制

  1. (复习) 对于方法内声明的局部变量来说:如果出现赋值操作

    • 如果是基本数据类型的变量,则将此变量保存的数据值传递出去。
    • 如果是引用数据类型的变量,则将此变量保存的地址值传递出去。
  2. 方法的参数的传递机制:值传递机制

实参给形参赋值的过程:

  • 如果形参是基本数据类型的变量,则将实参保存的数据值赋给形参。
  • 如果形参是引用数据类型的变量,则将实参保存的地址值赋给形参。
  1. 面试题:Java中的参数传递机制是什么?值传递。(不是引用传递)

4、构造器 (构造方法)

构造器的作用

  • 作用1:搭配new关键字,创建类的对象
  • 作用2:在创建对象的同时,可以给对象的相关属性赋值

构造器的使用说明

  • 构造器声明的格式:权限修饰符 类名(形参列表){}
  • 创建类以后,在没有显示提供任何构造器的情况下,系统会默认提供一个空参的构造器,且构造器的权限与类声明的权限相同。
  • 一旦类中显示声明了构造器,则系统不再提供默认的空参的构造器。
  • 一个类中可以声明多个构造器,彼此之间构成重载。

5、四种权限修饰符

权限修饰符的访问权限:
在这里插入图片描述
成员变量和成员方法可以用四种权限修饰符修饰
构造器也可以用四种权限修饰符修饰,不过常用的是public和private(用在单例模式)
类只能用缺省或public修饰

6、JavaBean的理解

所谓JavaBean,是指符合如下标准的Java类:

  • 类是公共的
  • 有一个无参的公共的构造器
  • 有属性,且有对应的get、set方法

7、内存解析(来源:尚硅谷)

类的实例化与对象内存解析

方法调用的内存解析

静态变量的内存解析

字符串常量池:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值