热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaSe基础第七章方法

JavaSe基础-第七章方法0、什么是方法,有什么用?1、方法怎么定义,语法机制是什么?2、方法定义之后怎么调用呢?3、关于方法的一些问题4、栈数据结构-了解5、方法执行过程中内存

JavaSe 基础 - 第七章 方法




    • 0、什么是方法,有什么用?

    • 1、方法怎么定义,语法机制是什么?

    • 2、方法定义之后怎么调用呢?

    • 3、关于方法的一些问题

    • 4、栈数据结构-了解

    • 5、方法执行过程中内存的变化

    • 6、方法重载overload

    • 7、方法递归

    • 8、我们要一味地将变量缩减吗?代码缩减吗?这样好吗?


  • 传送门

0、什么是方法,有什么用?

(可以先看一下一个程序如果没有方法,会出现什么问题?)
方法(英语单词:method)是可以完成某个特定功能的并且可以被重复利用的代码片段。
在C语言中,方法被称为“函数”。在java中不叫函数,叫做方法。
你定义了一个/抽取了一个方法出来,而这个方法却无法完成某个功能,
那么你抽取的这个方法毫无意义。一般一个方法就是一个“功能单元”。
假设在以后的开发中,某个功能是可以独立抽取出来的,建议定义为
方法,这样以后只要需要这个功能,那么直接调用这个方法即可,而
不需要重复编写业务逻辑代码。

1、方法怎么定义,语法机制是什么?

[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}

注意:

   [ ] 符号叫做中括号,以上中括号[ ]里面的内容表示不是必须的,是可选的。

   方法体由Java语句构成。

   方法定义之后需要去调用,不调用是不会执行的。

1.1、关于修饰符列表:
修饰符列表不是必选项,是可选的。目前为止,统一写成:public static
后面你就理解应该怎么写了。
1.2、关于返回值类型:
第一:返回值类型可以是任何类型,只要是java中合法的数据类型就行,数据类型
包括基本数据类型和引用数据类型,也就是说返回值类型可以是:
byte short int long float double boolean char String......
第二:什么是返回值?
返回值一般指的是一个方法执行结束之后的结果。
结果通常是一个数据,所以被称为“值”,而且还叫“返回值”。
方法就是为了完成某个特定的功能,方法结束之后大部分情况下
都是有一个结果的,而体现结果的一般都是数据。
数据得有类型。这就是返回值类型。
main{
// 调用a方法
a();..如果a方法执行结束之后有返回值,这个返回值返回给main了。
}
a(){}
方法执行结束之后的返回值实际上是给调用者了。谁调用就返回给谁。

第三:当一个方法执行结束不返回任何值的时候,返回值类型也不能空白,
必须写上void关键字。所以void表示该方法执行结束后不返回任何结果。
第四:如果返回值类型“不是void”,那么你在方法体执行结束的时候必须使用"return 值;"这样的语句来完成“值”的返回,
如果没有“return 值;”这样的语句那么编译器会报错。
return 值; 这样的语句作用是什么? 作用是“返回值”,返回方法的执行结果。

第五:只要有“return”关键字的语句执行,当前方法必然结束。
return只要执行,当前所在的方法结束, 记住:不是整个程序结束。
第六:如果返回值类型是void,那么在方法体当中不能有“return 值;”这样的语句。
但是可以有“return;”语句。这个语句“return;”的作用就是用来终止当前方法的。
第七:除了void之外,剩下的都必须有“return 值;”这样的语句。
1.3、方法名
方法名要见名知意。(驼峰命名方式)
方法名在标识符命名规范当中,要求首字母小写,后面每个单词首字母大写。
只要是合法的标识符就行。
1.4、形式参数列表
简称:形参
注意:形式参数列表中的每一个参数都是“局部变量”,方法结束之后内存释放。
形参的个数是:0~N个。
public static void sumInt(){}
public static void sumInt(int x){}
public static void sumInt(int x, int y){}
public static void sum(int a, int b, double d, String s){}
形参有多个的话使用“逗号,”隔开。逗号是英文的。
形参的数据类型起决定性作用,形参对应的变量名是随意的。
1.5、方法体:
由Java语句构成。java语句以“;”结尾。
方法体当中编写的是业务逻辑代码,完成某个特定功能。
在方法体中的代码遵循自上而下的顺序依次逐行执行。
在方法体中处理业务逻辑代码的时候需要数据,数据来源就是这些形参。

2、方法定义之后怎么调用呢?

方法必须调用才能执行。
怎么调用,语法是什么?
类名.方法名(实际参数列表);
实参和形参的类型必须一一对应,另外个数也要一一对应。

3、关于方法的一些问题

3.1、在方法调用的时候,什么时候“类名.”是可以省略的。什么时候不能省略?
a()方法调用b()方法的时候,a和b方法都在同一个类中,“类名.”可以省略。
如果不在同一个类中“类名.”不能省略。
3.2、调用程序不一定写到main方法中,不要把main方法特殊化。
main方法也是一个普通方法。

main方法最先执行,并且main方法是最后一个结束。
main结束,整个程序就结束了。
在多个方法互相调用的时候,
别自乱阵脚:任何一个方法体当中的代码都是遵循自上而下的顺序依次逐行执行的。
3.3、break;语句和return;语句有什么区别?
不是一个级别。
break;用来终止switch和离它最近的循环。
return;用来终止离它最近的一个方法。
3.4、在同一个域当中,"return语句"下面不能再编写其它代码。编写之后编译报错。

public static int m(){
boolean flag = true;
if(flag){
return 1;
//错误: 无法访问的语句
//System.out.println("hello1");
}
// 这行代码和上面的代码hello1的区别是:不在同一个域当中。
//System.out.println("hello2");
return 0;
// 错误: 无法访问的语句
//System.out.println("hello3");
}
3.5、编译器不负责运行程序,编译器只讲道理。
//错误: 缺少返回语句
/*
public static int m(){
boolean flag = true; //编译器不负责运行程序,编译器只讲道理。
// 对于编译器来说,编译器只知道flag变量是boolean类型
// 编译器会认为flag有可能是false,有可能是true
if(flag){
// 编译器觉得:以下这行代码可能会执行,当然也可能不会执行
// 编译器为了确保程序不出现任何异常,所以编译器说:缺少返回语句
return 1;
}
}
*/
// 怎么修改这个程序呢?
// 第一种方案:带有else分支的可以保证一定会有一个分支执行。
/*
public static int m(){
boolean flag = true;
if(flag){
return 1;
}else{
return 0;
}
}
*/
// 第二种方案:该方案实际上是方案1的变形。
// return语句一旦执行,所在的方法就会结束。
/*
public static int m(){
boolean flag = true;
if(flag){
return 1;
}
return 0;
}
*/
// 三目运算符有的时候会让代码很简练。
public static int m(){
boolean flag = true;
return flag ? 1 : 0;
}

4、栈数据结构-了解

   要想理解方法执行过程中内存的分配,我们需要先学习一下栈数据结构

   那么什么是数据结构呢?

数据结构是一门独立的学科,不仅是在 java 编程中需要使用,在其它编程语言中也会使用,
在大学的计算机课程当中,数据结构和算法通常作为必修课出现,而且是在学习任何一门编程
语言之前先进行数据结构和算法的学习。
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。

   常见的数据结构有哪些呢?

栈、队列、链表、数组、树、图、堆、散列表等。

目前我们先来学习一下栈(stack)数据结构,这是一种非常简单的数据结构。

   栈数据结构存储数据有这样的特点:先进后出,或者后进先出原则。

   也就是说最先进去的元素一定是最后出去,最后进去的元素一定是最先出去,因为 一端是开口的,另一端是封闭的。


5、方法执行过程中内存的变化


局部变量:只在方法体中有效,方法结束之后,局部变量的内存就释放了。
JVM三块主要的内存:栈内存、堆内存、方法区内存。
(1)方法区最先有数据:方法区中放代码片段。存放class字节码。
(2)堆内存:后面讲(面向对象)。
(3)栈内存:方法调用的时候,该方法需要的内存空间在栈中分配。

方法不调用是不会在栈中分配空间的。
方法只有在调用的时候才会在栈中分配空间,并且调用时就是压栈。
方法执行结束之后,该方法所需要的空间就会释放,此时发生弹栈动作。
方法调用叫做:压栈。分配空间
方法结束叫做:弹栈。释放空间
stack栈中存储什么?
方法运行过程中需要的内存,以及栈中会存储方法的局部变量。

【代码示例:】

public class MethodTest08{
//主方法,入口
public static void main(String[] args){

//int a = 100;
// 这个赋值原理是:将a变量中保存的100这个数字复制一份传给b变量。
// 所以a和b是两个不同的内存空间,是两个局部变量。
//int b = a;
System.out.println("main begin");
int x = 100;
m1(x);
System.out.println("main over");
}
public static void m1(int i){ // i是局部变量
System.out.println("m1 begin");
m2(i);
System.out.println("m1 over");
}
public static void m2(int i){
System.out.println("m2 begin");
m3(i);
System.out.println("m2 over");

}
public static void m3(int i){
System.out.println("m3 begin");
System.out.println(i);
System.out.println("m3 over");
}
}
/* 程序结果
main begin
m1 begin
m2 begin
m3 begin
100
m3 over
m2 over
m1 over
main over
*/



6、方法重载overload

1、什么情况下我们考虑使用方法重载机制?
当功能相似的时候,建议将方法名定义为一致的,
这样代码美观,又方便编程。
注意:如果功能不相似,坚决要让方法名不一致。
2、代码满足什么条件的时候构成了方法重载?
条件1:在同一个类当中
条件2:方法名相同
条件3:形式参数列表不同(类型、个数、顺序)

只要同时满足以上3个条件,那么我们可以认定方法和方法之间发生了
重载机制。
注意:
方法重载和修饰符列表无关,和返回值类型无关。
(public static) (void)
3、方法重载的优点?
代码美观、方便代码的编写
【补充】println是一个方法名。
// println我承认是方法名了,但是这个方法谁写的?SUN公司的java团队写的。
// 你直接用就行。
// println()方法肯定是重载了。(不信,你可以翻阅一下SUN公司写的源代码看看。)
// 对于println()方法来说,我们只需要记忆这一个方法名就行。
// 参数类型可以随便传。这说明println()方法重载了。
System.out.println(10);
System.out.println(3.14);
System.out.println(true);
System.out.println('a');
System.out.println("abc");
System.out.println(100L);
System.out.println(3.0F);

7、方法递归

1、需要理解什么是方法递归?
方法自身调用自身。
2、使用递归的时候,必须添加结束条件,没有结束条件,会发生栈内存溢出错误。
StackOverflowError
原因:一直压栈,没有弹栈,栈内存不够用。

【代码示例:】

public class RecursionTest01{
// 入口
public static void main(String[] args){
doSome();
}
public static void doSome(){
System.out.println("doSome begin");
// 调用方法:doSome()既然是一个方法,那么doSome方法可以调用吗?当然可以。
// 目前这个递归是没有结束条件的,会出现什么问题? 一直输出 doSome begin
doSome();
// 这行代码永远执行不到。
System.out.println("doSome over");
}

3、会画出递归方法的内存结构图。
递归的过程当中可以将图画出来。
4、能够使用循环代替递归的尽量使用循环,循环的执行耗费内存少一些,
递归耗费内存相对多一些,另外递归使用不当很容易内存溢出,JVM停止工作。
当然,只有极少数情况下,只能用递归,其它代码解决不了问题。
5、当递归有结束条件,并且结束条件合法的时候,就一定不会内存溢出吗?
也不一定。可能递归的太深了。
6、分享了一些递归方面的经验
在实际的开发中遇到递归导致的栈内存溢出错误是怎么办?
第一步:先检查结束条件是否正确。
第二步:如果正确,可以调整JVM的栈内存大小。(java -X)

【练习】:使用递归,请编写程序,计算1~n的和

public class RecursionTest03{
public static void main(String[] args){
// 1~3的和
int n = 3;
int r = sum(n);
System.out.println(r); // 6
}
// 大家努力的去看,去听,自己写不出来没关系,关键是能不能看懂。
// 单独编写一个计算1~n和的方法
// 这个代码修改为递归的方式。
// 3 + 2 + 1
public static int sum(int n){
//n最初等于3
// 3 + 2 (2是怎么的出来的:n - 1)
//sum(n - 1);
if(n == 1){ //递归的结束条件
return 1;
}
// 程序能执行到此处说明n不是1
return n + sum(n-1);
}
}


8、我们要一味地将变量缩减吗?代码缩减吗?这样好吗?

public class Test{
public static void main(String[] args){
/*
int i = 100;
System.out.println(i);
*/

System.out.println(100);
boolean flag = test();
if(flag){
...
}
// 缩减之后的
if(test()){
....
}
}
public static boolean test(){
return true;
}
}

太计较变量的数量会有什么后果呢?(运行效率不会低)
后果1:代码的可读性差。
后果2:可读性差也可以会牵连到代码的开发效率。

其实计算机内存不差这个。。。。。。
注意:在编码过程中,有一些变量名是必须要定义的。
因为在后面代码中还需要访问这个数据。重复的访问这个数据。

传送门

上一章:JavaSe 基础 - 【1-6章 - 内容回顾】

下一章:JavaSe 基础 - 第八章 认识面向对象

本文地址:https://blog.csdn.net/W1324926684/article/details/107347451



推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
不懂
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有