面向对象(基础)

2023-12-27 15:22:16

目录

方法最基本的三个成员

?属性(变量的另一种认识 )、

?方法

?构造器(constructor)

? ?面向对象的特征之一:封装性

package(包)和import(导入)关键字的理解和使用:

pakage作用:

import作用

方法的应用:4个

1.重载(overload):

定义:

特征为两同一不同:

怎么判断两个方法是相同呢?编译器如何确定:

所以一个类中不允许定义多个相同的方法。

2.可变个数形参的方法:

使用场景:

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

注意点:

3.方法值传递机制剖析:

总结:对于方法内声明的局部变量,赋值时:

基本数据类型:传递本身所保存的数据值

引用数据类型:

实参与形参的传递:

4.方法的应用4:递归

对象数组

定义

举例:

案例:耐心看完

类与对象:

?面向对象完成具体功能的三个步骤

类的实例化?

对象的内存解析(还是康师傅)


方法最基本的三个成员

?属性(变量的另一种认识 )、

  • 复习一下变量的分类
    • 成员变量(也叫做属性)
      • 属性的其他称呼:成员变量,field,字段,域
    • 局部变量(方法内,方法形参,构造器内,构造器形参,代码块内)
  • 两者之间的相同点和不同点
    • 共同点:
      • 声明的格式相同:数据类型 变量名 = 变量值
      • 变量都有其有效的作用域,出了作用域就失效了。
      • 必须先声明后赋值,最后使用
    • 不同点
      • 属性声明在类内,方法外的变量 ,局部变量:方法内,方法形参,构造器内,构造器形参,代码块内
      • 在内存中分配的位置不同:局部变量就在栈里面属性随着对象的创建,存储在堆空间中。
      • 生命周期:属性:随着对象的创建而创建,随着对象的消亡而消亡。局部变量:随着方法对应的栈帧入栈(或消亡),局部变量会在栈中分配(或消亡)
      • 作用域:属性在整个类内都是有效的,局部变量仅限于其所在的方法(……)。
      • 是否可以有权限修饰符来修饰:修饰符有:public protected 缺省 private(用于表明所修饰的结构可调用的范围的大小)
        • 属性可以用权限修饰符来进行修饰,局部变量不能使用任何修饰符进行修饰.
  • 是否有默认值
    • 属性:都有默认初始化值 意味着如果没有给属性进行显示初始化值,则会有默认初始化值
    • 局部变量:都没有默认初始化值 意味着,在使用之前必须要显示赋值,否则会报错
      • 当局部变量作为方法的形参时,无影响,因为可以在调用方法时再赋值(比较特殊)
  • image

  • image

  • image

?方法

  • 是类或对象行为特征的抽象,用来完成某个功能操作。(在某些语言中也称为函数或过程,比如C语言)
  • 方法的好处:实现代码重用,减少冗余,简化代码
  • 使用例子:Math.random()的random()方法等
  • 定义的格式:
    • 权限修饰符【其他关键词(以后讲)】 返回值类型 方法名(形参列表)【throws 异常类型】//这些都是方法头
      {
      方法体
      }
      • 方法体:调用一个方法时,真正执行的代码。体现了此方法的功能
      • 【】里面的不是必须的、可加可不加,比如static、final等。
      • 权限修饰符: public \ protected \ 缺省 \ private (声明方法是先都写public,以后讲封装再考虑这个)
      • 返回值类型:描述当调用完此方法时,是否需要返回一个结果(无返回值类型void/有具体返回值类型(指明返回的数据类型),而且在最后要用return 返回值类型;)
      • 方法名就是根据标识符的规则来写的
      • 形参列表:属于局部变量。且可以声明多个
        • 格式(形参类型1 形参1,形参类型2 形参2)
        • 分类:有/无形参列表
          • 无:不能省略小括号,比如:Math.random()
          • 有:也不能省略小括号,调用时需要不确定变量的类型和个数来确定形参类型和个数;比如:Arrays.sort(数组名) Arrays.binarySearch(数组名 要找的数)
          • 如何判断:根据“在方法体里面有没有不确定的数”来判断是否需要形参列表
  • 注意点:
    • 必须先声明后使用(main方法中)
    • 不能单独存在,只能放在类里面定义
    • 方法不调用不执行,每调用一次执行一次
    • 在一个方法当中,可以调用本类中的其他方法。
    • 方法内不能定义方法。
  • 形参实参解释:
    • 形参:方法在声明时,一对()内声明的一个或者多个形式参数,简称形参
    • 实参:方法在被调用时,实际传递给形参的变量或常量,就称为实际参数,简称实参
  • 内存解析(康师傅图片)例子里面的Person类里面的属性由name、age、gender,方法有sleep、intersts?

?构造器(constructor)

  • 作用:
    • 1.搭配new关键字,创建类的对象
    • 2.在创建对象的同时,可以给对象的相关属性赋值
  • 使用:
    • 构造器的声明:权限修饰符 类名(形参列表){}
    • 创建类以后,在没有显示提供任何构造器的情况下,系统会默认提供一个空参的构造器,且和构造器的权限与类声明的权限相同。
    • 一旦类中显示声明了构造器。则系统不在提供默认的空参构造器(这个地方要加重记一下,后面复习super、和this有用)
    • 一个类中可以声明多个构造器,彼此之间构成重载

? ?面向对象的特征之一:封装性

我这样记两个常用的权限修饰符:我的就是我的(private),你的还是我的(public)

另外缺省其实就是“啥也不写”,就比如创建一个类的时候:直接? ?class……

  • 用权限修饰符来进行封装
    • 四种权限修饰:分别是private、缺省、protected、public
    • 修饰类即类内部的成员,当这些成员被调用时,体现可见性的大小
    • private:本类内部
    • 缺省:本类内部、本包内
    • protected:本类内部、本包内、其他包的子类
    • public:本类内部、本包内、其他包的子类、其它包非子类
  • 类:只能使用public、缺省修饰
  • 类的内部成员:可以使用四种权限修饰符

package(包)和import(导入)关键字的理解和使用:

首先想一下他们的实用性:我们不能肯定在开发中,你们每个人定义的类或接口会做到“不重复标识符”,就比如现在有两个包下都定义了Person类,所以为了判断使用的是哪一个Person就需要import结合package来解决了

pakage作用:

用于指明该文件中定义的类、接口等结构所在的包

一个源文件只能有一个package的语句,只能放首行

包名全部小写,且开头不能为java.

一个包下有多个类和接口,但不能同名。(不同包下可以定义同名的类)?

import作用

用impoort来显示引入指定包下所需要的类

语法格式:import 包名.类名

写在包的声明和类的声明之间

如果已经导入了想使用的的包,又想使用该包下子包中的类,就仍然需要导,或者用更简单的下一步

import 包名 . *代表该包的所有类

导入的类或接口如果在同一个包下,则可以省略此步骤

?如果想同时用不同包下两个相同名字类,要使用全类名的方式java.包名.类名 名字 = new java.包名.类名 名字,在很久之前一般的情况下其实都应该是这样的方式,但为了提高可读性,才用上了import关键词来简单化导包的过程

方法的应用:4个

1.重载(overload):

定义:

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

特征为两同一不同:

  • 不同:参数列表不同:1。参数个数不同2.参数类型不同
  • 两个相同:同一个类,相同方法名。
  • 注意:方法的重载与形参的名,权限修饰符,返回值类型都没有关系

怎么判断两个方法是相同呢?编译器如何确定:

  • 先通过方法名确定了一波重载的方法,进而通过不同的形参列表,确定对应的方法
  • 方法名,形参列表(参数个数与类型)都相同
  • 要求:在一个类中,允许存在多个相同名字的方法,只要他们的形参列表不同。

所以一个类中不允许定义多个相同的方法。

2.可变个数形参的方法:

使用场景:

再调用方法时,可能会出现方法形参的类型是确定的,但形参的个数不确定。此时,我们就可以使用可变个数形参的方法。(把他当作数组对待就行了,不过是构建方法时没确定数组的大小)

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

注意点:

1.可变个数形参的方法在调用时,针对于可变的形参赋的实参的个数可以为0个,1个或多个。

2.与同类中同名的多个方法之间可以构成重载(因为形参不同嘛)

3.特例:可变个数形参的方法与同一个类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载。(你可以把现在这个功能当成数组)

  • image

  • image

4.可变个数的形参必须声明在形式列表之后:

仔细想一下,如果声明在前面的话,就不知道后面某个形参是不是属于可变个数形参里面

5.可变个数的形参最多在一个方法的形式列表中出现一次:你总不可能在形参列表里面定义多个吧,有什么意义?

3.方法值传递机制剖析:

总结:对于方法内声明的局部变量,赋值时:

1.基本数据类型:将此变量保存的数据传递出去

2.引用数据类型:将此变量保存的地址值传递出去

基本数据类型:传递本身所保存的数据值

引用数据类型:

? ? ? ? 对于数组:所存储地址值一样,都指向同一个数组

? ? ? ? 对于对象:地址值一样,指向同一份Order空间

实参与形参的传递:

1.如果形参的类型为基本数据类型的变量,则将实参保存的实际值赋给形参

2.如果形参的类型为引用数据类型的变量,则将实参保存的地址值赋给形参

4.方法的应用4:递归

这就不是这里要复习的内容了,可以看别的数据结构与算法

对象数组

定义

这样理解更容易:数组元素可以是基本数据类型也可以是引用数据类型,当元素是引用类型中的类时,我们称为对象数组。类似于c语言中的结构体数组

举例:

String[]:String是引用数据类型,数组里面的每个元素都是一个String的对象

案例:耐心看完

  • 定义一个Student,包括三个属性,学号(number int ),年级(state int),成绩(score int)

  • 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定

    • 需求:
      • 1.打印出3年级(state)的学生的信息
      • 2.使用冒泡排序按学生成绩排序,并遍历所有学生信息

类与对象:

这是面向对象的两个核心概念

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

类:具有相同特征的事物的抽象描述,是抽象的,概念上的定义。就比如我上面的Student类

?面向对象完成具体功能的三个步骤

1.创建类,并设计类的内部成员(现在只写属性和方法)

2.创建类的对象

3.通过对象,调用其内部声明的属性和方法,完成相关的功能?

类的实例化?

仅仅就是创建对象用它而已

类的实例化=创建类的对象=创建类的实例

格式:类的类型 对象名 = 通过new创建的对象实体

举例:Phone p1 = new Phone();

对象的内存解析(还是康师傅)

  • 栈(stack):方法内定义的变量,存储在栈中
  • 堆(heap):new 出来的结构(比如:数组实体,对象实体)。包括对象中的属性
  • 方法区(method area):存放类的模板。比如:Phone的模
  • 创建类的多个对象时,每个对象在堆空间中有一个对象是实体,每个对象实体中保存着一份类的属性。如果修改某个对象的属性时,不会影响其他对象此属性的值。

  • 此时的p3,p1两个变量指向了堆空间中两个对象实体,通过其中某一个变量,修改其属性时会改变另一个

文章来源:https://blog.csdn.net/yiyiyu66/article/details/135160418
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。