Java函数和面向对象

本文详细介绍了Java中的函数,包括函数的好处、定义、参数类型以及返回类型。此外,还探讨了方法调用栈、方法重载和递归的概念。接着,文章转向面向对象编程,解释了对象、属性、行为以及类的定义。最后,讨论了对象的关联关系、this关键字和包的管理。

函数

函数出现

在目前为止的开发实现中,我们的代码都在main方法中,从上到下进行编写。

在此模式下,程序结构会随着功能复杂度的增加而越来越复杂。

在代码中会有不连续的出现重复性代码,无法用循环来解决。

为了简化代码以及程序结构,把这些不连续的重复性代码提取出来,封装为一个方法(函数),并为之取名。然后我在需要用到该方法(函数)代码的位置去调用该方法(函数)。

函数的好处

  1. 代码量少了很多,减少无畏的重复劳动

  2. 代码便于维护,修改重复代码时,只需要在单独的方法(函数)中,修改一次即可

  3. 能够在函数命名时做到见名知意,对代码可读性也提高

    在后期由于模块化编程思想的出现,我们除了把不连续的重复性代码提取封装为方法外,也会把独立的功能模块封装为方法

    还有一些其他益处

    1. 设计人员不用考虑实现的细节,只需要理清楚在整个程序中有哪些模块,模块与模块的关系,这样更有利于他们对于程序宏观的控制

    2. 开发人员可以只考虑自己负责的模块的实现,达到多人同时开发的效果,在效率上大大提升

函数定义

public static 返回类型 函数名 (形参列表){
//实现部分 功能实现语句块
}
修饰符:定义本方法的访问范围和访问方式,目前固定书写为 public static
返回类型:定义本方法在执行结束后,是否返回结果,该结果是什么数据类型(且只能书写一个)
函数名(方法名):定义方法时给方法取名属于自定义标识符,按规范书写
形参列表:定义本方法在执行钱需要从使用者身上得到初始数据,如果没有初始数据,可以不写
方法体:书写任意语句,实现该方法所要完成的功能即可
​

方法讲解

方法:对单独功能模块或不连续的重复性代码的封装

定义:
  public static 返回类型 方法名(形参列表){
     // 方法体 完成功能所书写的语句
   }

对函数定义位置的说明

注意:

  1. 方法本身是一个单独的模块,所以它的定义是在其他方法之外

  2. 所以方法都是平行关系,千万注意不要再一个方法里面定义另一个方法

  3. 方法定义只能写在Java类花括号中

不能再方法内部去定义方法

调用方法语法: 类名.方法名(参数列表);但调用本类方法时,类名. 可以省略

参数类型分类

实参 (实际的参数,方法调用时由使用者传入的数据):

方法调用时,由方法使用者,根据方法形参类型和个数,传入对应的数据

形参 (形式上的参数):

一般用于方法定义,如果没有形参可以不写,如果有一个写 参数类型 参数名 如果参数有多个,中间用逗号分隔

利用 参数 获取数据 数据是来源于方法的使用者

利用 输入器 获取函数 数据的来源只能来源于控制台的输入

对函数定义位置的说明:

  • 方法本身是一个单独功能模块的封装,所以它的定义必须要在其他方法之外;

  • 所有的方法都是平行关系,千万别在另一个方法里面去定义另一个方法

  • 方法的定义只能书写在Java类的定义(花括号)中

参数 可以从方法外部传入数据进行运算

分类:

形参 形式上参数(具体的参数数据,需要在调用方法时由使用者给出,所以定义方法的时候,只能使用变量声明语法,先确定参数的类型、个数和顺序)

实参 在调用方法时,真正给形参传递的数据,形参定义的类型、个数和顺序是什么样的,给实参是就是什么类型、个数和顺序

public static void compare(int num1,int num2,int num3){
}
​
public static void compare1(String str,int num2,double num3){
}
​
// 调用 方法时 compare1("abcd",100,3.14);

3、返回类型

定义本方法在执行结束后,是否有返回的结果,该结果是什么数据类型(能且只能书写一个)

  • 方法执行结束后,没有返回的结果 void(无返回值)

  • 方法执行结束后,有需要返回的数据,此时需要把返回类型书写为返回数据的数据类型(基本或引用数据类型)

要返回的数据 叫做 返回值 通过语法 return 返回值;

注意: 1 如果方法定义了返回类型(不是void),就必须给方法返回数据,如果不给会报错

2 如果方法定义了返回类型(不是void),那么调用方法的语句可以将其视作一个数据进行操作(声明变量保存、输出、通过运算符对其进一步运算都可)

3 如果方法定义的返回类型为void,那么不能使用 return 返回值;这一语法,且不能调用该方法的语句视作数据进行操作

4 如果方法定义的返回类型为void,虽然不能使用return 返回值这一语法,但能使用return关键字,因为return关键字,除了可以用于返回数据之外,还可以用于结束方法

方法的调用栈

当出现多个方法嵌套使用时,最先执行的方法最后结束,此时呈现的是一种”先进后出“的栈结构,称之为方法调用栈

注意:在调用方法时,注意不要产生方法本身调用自己的情况,如果出现,那么就有可能出现StackOverflowError(堆栈溢出错误)

出入栈的概念

入栈:方法不断调用的过程叫入栈或压栈

出栈:当我们栈顶部的方法执行完毕后,该方法空间会自动在栈内销毁叫做出栈

Debug:

1、show execution point:光标在其他位置时,点击此按钮可以将光标跳转到当前代码执行的那一行

2、step over(步过):代码会一行一行往下走,如果这一行这一行是方法那也不会进入此方法,会继续往下执行

3、step into(步入):当前行有方法,可以进入方法内部,一般进入的是自定义的方法内

4、Force step into(强制步入):一行一行往下走,能进入任何方法(自定义方法/官方方法),需要查看底层代码时候可以用

5、Force step out(强制步出):可从进入方法内部返回方法调用出,此时方法会执行完毕

6、drop frame:在调试的时候想要重新走一遍流程,点击这个进行回退

7、把程序运行到光标处

方法重载

在同一个类中,声明多个同名方法,这些方法参数列表不同,将之称为方法的重载

当我们类中需要定义多个同名方法时,需要使用到方法重载

参数列表的不同:参数类型 ,或参数个数或参数顺序不同

编写运行代码时,Java编译器可以通过这些同名方法的参数去进行编译

递归

当方法自己调用自己时,根据方法执行流程,会形成一种类似于循环执行该方法情况,就称为递归

递归一定要有结束条件,没有结束条件,就进入无止境的递归,最终导致内除被完全消耗

递归适用:新问题规模要比原始问题小新问题又转化规模更小的问题,直到问题规模小到某一基本情况为止(递归结束条件)

结束递归的代码

调用代码

结束或继续使用

特点:

  • 原始问题转化为解决方法相同的新问题

  • 新问题规模要比原始问题小

  • 新问题又转化规模更小的问题

  • 直到最终归结最基本的情况---递归终结条件

面向编程是一种编程思想,其本身于编程语言无关

编程思想是我们开发者编写程序,分析问题域时采用的一种思维方式

在Java基础课,也使用过一种面向过程编程思想,此时解决问题时,需要把问题解决步骤,一步一步进行描述

OO面向对象

OOP面向对象编程

Java只在语法设计直接引入面向对象概念,在语句层能够表现对象各种特征

Java第一门纯面向对象编程语言,设计完全基于面向对象所需重要概念,比如写一个Java文件,会创建一个和文件名同的类

区别

在结构化编程中,程序围绕着解决任务设计

面向对象编程,程序围绕问题域的对象设计

面向对象解决问题核心

需要解决问题中找“对象”,除找出有哪些对象外,还要找出对象有哪些属性,有哪些行为

什么是属性:就是对象身上值数据

什么是行为:就是对象身上功能

万物皆对象,对象因关注而产生

在同一问题域中,我们会找到大量同类型的对象出现,根据类型进行编码,这就是类的概念

在问题域中,找到的对象,是具体实际存在的,是真正存在的,也是我们后续操作的东西

类把大量有相同属性和行为对象进行归纳总结而形成定义,对象的抽象化概念

抽取类关键点:

1.什么是类:类就是一种数据类型,这种数据类型可以装很多的复杂数据(姓名、年龄、身高等),同时还可以定义这个类能够做什么事(上课、摸鱼、吃饭等)

2.定义好一个类,是不能直接使用,类是用来产生对象的,具体操作是就操作对象

类相对于一个图纸、模板,根据图纸、模板产生出具有相同属性和相同行为对象

在面对对象情况下,分析问题域和编码步骤

1.找对象(包括对象属性和行为)

2.在根据找到的一系列对象来定义,然后通过类来产生对象

最后根据对象来产生效果

定义类的语法

实例化对象语法new关键字

语法:new类名() 产生对象

类名 对象名 = new类名()

表示创建名为对象名的变量空间,

类名 对象名

产生对象时没有给实现(变量)提供数据,此时会根据属性

定义属性和定义变量区别

1.定义位置不同,属性(在类中)变量常量(方法内部)

2.属性需要加上修饰符,变量常量不用加

3.属性不赋值在对象产生时会根据数据类型初始化一个值,变量常量如果初始化无法对其进行运算操作

操作对象-----点操作符 .

通过 对象名.属性(行为)方式访问对象内部信息

销毁

对象的销毁在Java不需要程序员自己销毁,而是JVM来完成,它可以通过一个机制---垃圾回收机制(GC),取检查内存,一旦发现某个对象没有引用指向它,就是被回收

(GC)是自动运行,不需要操心

可以通过代码System.gc( )让垃圾回收机制来清理内存垃圾,不一定马上来清理内存,是由垃圾回收机制内部算法决定的System.gc( )这个只起到喊它作用

基本概念类、对象、属性、行为

类:把一系列具有相同属性和行为的对象,进行总结归纳形成抽象定义

注意:类是一种引用数据类型,定义好的类不能直接使用,类是用来产生对象的,具体操作的是对象

对象:是具体实际的存在,是真正要存在的东西

万物皆对象,对象因关注而产生

类和东西关系:类是东西的抽象,东西是类的具体实例

掌握定义类的语法

类名 对象名 :本质创建一个可以存放引用的变量空间,没有创建对象

掌握产生对象的语法--new

掌握操作对象的语法---点操作符

对象名.属性(行为)

理论:销毁对象

对象的关联关系

三种关联关系

has — a 关系:有一个

指是在一个对象内部拥有另一个对象

use — a:用一个

指在一个对象的某个单独中使用另一个对象

is — a:是一个

指一个对象是另外一种对象的特例

先学前两个

has—a

在语法上,把一个对象,设计为另一个对象的属性

关联 — 单向关联和双向关联

A has a B 或 B has a A 单向

A has a B 且 B has a A双向

把对方设计自己属性后,有一个特点,就是在当对象所以方法中我就可以访问到关联对象,

两个对象声明周期保持一致,就是你中有我,我中有你

has a 关系是单向还是双向,取决于问题于分析,如果在问题域中,只需要通过A找B或B找A,就设计单向,如果A找B也要通过B找A,就设计双向

use—a

在语法层面上use—a 把一个对象,设计为另外一个对象某个方法的局部变量

该变量通过参数传递进这个方法,也可以在方法内部new一个,两者不管用哪一个都是use—a,不管是参数传递还是方法内部声明定义,都是方法局部变量,方法结束局部变量会消失关系解除

this关键字

如果类在定义属性和行为,都需要通过"对象名."方式访问实现或行为,因为同一个类可以产生多个对象,要必须明确告知计算机,操作哪一个对象属性和行为

在类的内部方法中,访问当前类的属性或调用自己的某个方法,也有一个默认对象—用this表示,this就表示当前对象,谁是当前对象谁调用谁就是当前对象

this用或者不用问题都不大,但建议只要访问本类属性和方法就加this

原因:

1.利用IDEA(集成开发环境)写this,可以自动联想出本类属性和方法,提高编码速度

2.可以区分局部变量和属性重名

当程序越来越打时,包含的类会越来越多,那么可以更好管理类,以及对类进行分门别类存放,就需要一种结构帮助我们,于是就有了包

本质:就是专门用来放Java类的文件夹,当一个Java类被放入某个包中,会有一下特点:

1.这个类最上面会有一句声包的代码,格式:关键字 package 后面加上包名

包名书写规范:

1.全小写,如果包有多级结构,就包名1.包名2

2.在默认情况,一个Java类只能访问同一个包中其他类,如果需要访问其他包类,用关键字 import 导入进来, import 包名.类名; 就行了

3.在公司包名会有书写规范,com.公司名.具体包

4.IDEA创建包和类方式 大家慢慢摸索,逐渐掌握

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值