开发遵循原则之一:

DRY原则:Don't Repeat Yourself(不要重复你自己的代码)

原因:重复意味着维护成本的增大

    public static void main(String[] args) {
System.out.println("代码片段A");
doWork();
System.out.println("代码片段B");
doWork();
System.out.println("代码片段C");
doWork();
System.out.println("代码片段D");
doWork();
}
//把共同的代码抽离到方法中
static void doWork(){
System.out.println("共同200行代码");
}

方法的定义格式:

[修饰符]  返回值类型  方法名称 (形式参数1,形式参数){

    方法体

    (如果方法需要给调用者返回一个结果,此时需要使用return  值)

}

方法中的术语:

  修饰符:public, static等, static修饰的方法属于类,直接使用类名调用即可,public修饰的方法表示公共的方法,可以通过类的对象调用;

   返回值类型:方法其实是在完成一个功能,该功能操作完毕之后,是否需要给调用者返回一个结果

        如果不需要给调用者返回结果,此时使用关键字void来声明,表示无返回结果的意思;

  方法名称:遵循标识符规范,使用动词表示,首字母小写,若是由多个单词组成,使用驼峰表示法,之后每个单词的首字母大写;

  形式参数:方法圆括号内的变量,仅仅只是占位而已,形式参数的名称其实无所谓,并且形式参数可以有多个;

  参数列表:参数列表 == 参数类型 + 参数个数 + 参数顺序;

  方法签名:方法签名 == 方法名称 + 方法参数列表;

          (在同一个类中,方法签名是唯一的,否则编译报错)

  方法体:方法的{}中的代码,表示具体完成该功能的代码;

  返回值:在方法内部,使用return关键字:

      功能一:给调用者返回一个结果值,此时该方法不能使用void修饰.

      功能二:结束当前方法.

  实际参数:调用者在调用某一个具体方法的时候,实际传递的参数值。

  方法的调用者:在哪里调用某一个方法,那么哪里就是该方法的调用者

public static void main(String[] args){
//TODO
}
//main方法专门由主方法来负责调用,我们只管启动JVM

方法定义的位置:

  1):在类中定义,在Java中最小的程序单元是类;

  2):方法定义在其他方法之外,方法和方法之间是兄弟关系

  3):方法定义的先后顺序不影响

 如何来定义/设计方法:

  1):是否需要定义返回值类型;

  2):是否需要形式参数

  3):具体需要定义什么功能方法;

-------------------------------------------------------------------------------

1):是否需要定义返回值类型:

  我们说方法其实就是在完成某一个功能那么完成该功能之后,是否需要给调用者返回一个结果数据,如果不需要返回结果数据,此时使用void声明(无返回)

  如果需要返回一个结果数据,我们就把该结果数据的类型作为该方法的返回值类型,

  具体操作为打印操作:此时我们在乎的是方法执行的过程,而不是结果,所以使用void声明

  具体操作为求两个数之和:此时我们在乎的方法执行的过程,并且执行完毕之后,需要给调用者一个反馈

2):是否需要形式参数:

  该方法在完成该功能的过程之中,是否有未知的因素参与,如果有请作为参数传递,如果没有则没有形参

  求两个数之和的时候,这两个数到底是多少,其实对于方法来说,是未知的,仅仅是调用者知道,而且不同的调用者传递不同的参数值.

方法的重载设计

需求1:在同一个类中,分别定义求两个整数,小数之和的方法

    //解决方案:
//求两个整数之和
static int getSum1(int x, int y) {
return x + y;
} //求两个小数之和
static double getSum2(double x, double y) {
return x + y;
}

需求2:在同一个类中,分别打印String,double,boolean类型的方法

    //解决方案:
//打印String
static void pString(String data){
System.out.println(data);
}
//打印int
static void pInt(int data){
System.out.println(data);
}
//打印boolean
static void pBoolean(boolean data){
System.out.println(data);
}

方法的重载设计(overload):重载方法的定义是在同一个类中,某方法允许存在一个以上的同名方法,只要它们的参数列表不同即可。

方法重载的作用:屏蔽了同一功能的方法由于参数不同所造成方法名不同

方法重载判断原则:“两同一不同”

   两同: 同类中,方法名相同;     

     一不同: 方法参数列表不同(参数类型、参数个数、参数顺序) ;

          只要参数类型参数个数参数顺序有一个不同参数列表就不同.

  注意:方法重载和方法的返回值类型无关,只是一般要求返回值类型一致。

     参数列表和参数的名称没关系,方法的重载和形参没关系

方法递归操作

读高中学数列的时候,我们见过斐波纳契数列,其通项公式为: F <0) =0,F(1)=1,Fn=F(~-1)+F(-2) (n>=3,nEN*) ,现在求F(5)的值,怎么做呢?

观察:这个数列从第三项开始,每一项都等于前两项之和

要求F(5)的值,肯定要先求F(4)和F(3)的值,而求F(4)的值又需要求F(3)和F(2)的值....

解决办法1:

依次求出(1)、F(2)、F(3)、F(4)值,再处理。这种办法很笨,效率低极低。

方法fn的作用就是求num数的函数值,而求函数值又需要num-1和num-2的函数值,而这两个函数值的求法和求num一样,那么也就可以使用同一个方法。

如图下图:

递归代码如下:

public static void main(String[] args) {
//斐波那契函数,通项公式:Fn(0) = 0,Fn(1) = 1, Fn(n) = Fn(n-1) + Fn(n-2)。求Fn(5)
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个正整数:");
int y = sc.nextInt();
System.out.println(Fn(y));
}
static int Fn(int x){
if(x == 0){
return 0;
}else if(x == 1){
return 1;
}else{
return Fn(x - 1) + Fn(x - 2);
}
}

JVM内存模型

JVM内存划分,人为根据不同内存空间的存储特点以及存储的数据:

程序计数器:当前线程所执行的字节码的行号指示器。

本地方法栈:为虚拟机使用的native方法服务。

Java虚拟机栈:描述Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息

  每一个方法,创建一个栈帧,栈帧存放了当前方法的数据信息(局部变量),当前方法调用完毕,该方法的栈帧就会被销毁。

Java堆:被所有线程共享的一块内存区域,在虚拟机启动时创建,所有的对象实例以及数组都要在堆上分配(使用new关键字,就表示在堆中开辟一块新的存储空间)。

方法区:线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量即时编译器编译后的代码数据(这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载)

GC(Garbage Collection):垃圾回收器

Java的自动垃圾回收机制:简单理解为,程序员不需要再手动的去控制内存的释放。当JVM发觉内存资源紧张的时候,就会自动去清理无用的对象(没有被引用的对象)所占用的空间。

注意:Java的垃圾回收器,自动回收的是堆空间的内存;而栈空间内存会随着该方法的执行结束,自动释放该方法的栈帧内存。

class文件加载进JVM简单示意图:

以上所有笔记,改编、转载自叩丁狼教育--任小龙老师的笔记,附视频链接

Java语言基础之方法的设计的更多相关文章

  1. 【JAVA基础】04 Java语言基础:方法

    1. 方法概述和格式说明 为什么要有方法 提高代码的复用性 什么是方法 完成特定功能的代码块. 方法的格式 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {     方法 ...

  2. 第二十五节:Java语言基础-面向对象基础

    面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基 ...

  3. day01<计算机基础知识&Java语言基础>

    计算机基础知识(计算机概述) 计算机基础知识(软件开发和计算机语言概述) 计算机基础知识(人机交互) 计算机基础知识(键盘功能键和快捷键) 计算机基础知识(如何打开DOS控制台) 计算机基础知识(常见 ...

  4. Java之--Java语言基础组成—数组

    Java语言基础组成-数组 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的数组,数组 ...

  5. Java之--Java语言基础组成—函数

    Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...

  6. Java语言基础(五)

    Java语言基础(五) 一.浮点数 浮点数就是小数,其标准是IEEE 754,用指数和尾数表示 例如30000=3*10000=3*10^4  其中4是指数,3是尾数 Java中,浮点数有float ...

  7. Java语言基础(一)

    Java语言基础(一) 在这里说明一下,有基础的跳过 高手跳过.在这里我想复习以前的东西,以及给正在学java的一些帮助 我用的MyEclipse8.5编写java代码,有需要联系我  QQ:9035 ...

  8. Java入门篇(二)——Java语言基础(下)

    上篇说到Java中的变量与常量,接下来就是简单的计算了,首先需要了解一下Java中的运算符. 六.运算符 1. 赋值运算符 赋值运算符即"=",是一个二元运算符(即对两个操作数进行 ...

  9. 第二十六节:复习Java语言基础-Java的概述,匿名对象,封装,构造函数

    Java基础 Java语言概述 Java语言 语言 描述 javaee 企业版 javase 标准版 javame 小型版 JDK JDK(Java开发工具包) Java语言 语言 Java语言 Ja ...

随机推荐

  1. ZABBIX 4.0 LTS 部署

    1. 环境说明 关于zabbix的详细使用可以参考之前的3.0 版本,该文档仅记录zabbix 4.0 编译安装过程!ZABBIX 3.0 从入门到精通(zabbix使用详解) : https://w ...

  2. go微服务框架go-micro深度学习(三) Registry服务的注册和发现

    服务的注册与发现是微服务必不可少的功能,这样系统才能有更高的性能,更高的可用性.go-micro框架的服务发现有自己能用的接口Registry.只要实现这个接口就可以定制自己的服务注册和发现. go- ...

  3. 记一次spring boot参数初始化的问题

    背景:接手一个项目,看到一个配置参数的引用: @Value("${webSocket.id}") 再看看配置application.yml: ... webSocket: id: ...

  4. Fortran+ OpenMP实现实例

    PROGRAM parallel_01 USE omp_lib IMPLICIT NONE INTEGER :: i,j INTEGER() :: time_begin, time_end, time ...

  5. go 资料

    channel 底层原理 https://www.youtube.com/watch?v=KBZlN0izeiY go concurrency https://www.youtube.com/watc ...

  6. Kafka#4:存储设计 分布式设计 源码分析

    https://sites.google.com/a/mammatustech.com/mammatusmain/kafka-architecture/4-kafka-detailed-archite ...

  7. Linux 常见操作

    grep -nr SEARCHTERM file1 file2 ...https://www.linuxnix.com/grep-command-usage-linux/ https://www.li ...

  8. 深度学习卷积网络中反卷积/转置卷积的理解 transposed conv/deconv

    搞明白了卷积网络中所谓deconv到底是个什么东西后,不写下来怕又忘记,根据参考资料,加上我自己的理解,记录在这篇博客里. 先来规范表达 为了方便理解,本文出现的举例情况都是2D矩阵卷积,卷积输入和核 ...

  9. 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应

    没接触过flexible的建议先看看大漠的这篇文章这样你才会知道长度为什么用rem,而字体要用px 安装flexible npm install lib-flexible --save 引入flexi ...

  10. 【iCore4 双核心板_ARM】例程三十八:DSP MATH库测试

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i,j; int res; ]; ; /* USER CODE END 1 */ /* ...