Java之方法、数组的初步了解

方法

方法的含义

定义: 方法就是用来完成解决某件事情或实现某个功能的办法。

​ 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本,控制输入或计算数值。

​ 我们可以通过在程序代码中引用方法名称和所需的参数,实现在该程序中执行(或称调用)该方法。方法,一般都有一个返回值,用来作为事情的处理结果。

方法的定义

其格式为:

/*方法的定义如下
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,......){
执行语句
………
return 返回值;
}
*/

示例:

//例如:定义一个方法
public static void methodName(int k,int g){
//publics static 修饰符
//void 			 返回值类型
//methodName     方法名
//int  k		参数列表,与局部变量的声明方式一样
   					//执行语句
   					return k+b
}

修饰符: 方法的修饰符比较多,有对访问权限进行限定的 。目前默认为public static

返回值类型:用于限定方法返回值的数据类型 ,可以是基本数据类型也可以是引用数据类型

方法名:就是方法的名字,遵照Java的变量(标识符)的语法规则和规范。

参数类型: 用于限定调用方法时传入参数的数据类型 。可以是基本数据类型也可以是引用数据类型

​ 可以由参数也可以么有参数。

​ 若是有多个参数,中间用,分隔。

​ 方法定义的时候,这个参数都成为形式参数;相当是局部变量,只声明不赋值。

​ 在方法定义的时候,若是声明了参数类型类型,则调用此方法的时候必须赋值(传入参数)。

执行语句:是解决问题的代码。

return:

​ 一是提前结束方法

​ 二是返回最终的结果,返回的结果的数据类型要与返回值数据类型相一致。

方法的调用

有返回值的调用

​ 方法名(实参):执行方法中的代码,共有三种方法可以供调用:

​ 实参:方法调用的时候,传入的参数,其数据类型要与方法定义的时候的形式参数相一致。

直接调用:方法名(实参)

  1. 有返回值的方法不建议使用此方法;
  2. 一般使用在没有返回值的方法中

赋值调用

赋值调用:数据类型 变量名=方法名(实参);

  1. 一般使用在有返回值类型的方法中

输出调用:System.out.println(方法名(实参));

代码如下:

public class TestMethodDemo01{
	public static void main(String[] args){
		getPI();//直接调用,不建议
		double d=getPI();//赋值调用
		System.out.println(getPI());//输出调用
	}
	
	public static double getPI(){
		return 3.1415926;
	}
	public static double test(char a,int n){
		for(i=1;i<=n;i++){
			System.out.print()
			
		}
	}
没有返回值的调用

就是返回值类型为void;

/*
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,......){
执行语句
………
return 返回值;
}
*/
//例如:定义一个方法
public static void methodName(int k,int g){
//publics static 修饰符
//void 			 返回值类型,该类型为没有返回值类型
//methodName     方法名
//int  k		参数列表,与局部变量的声明方式一样
   					//执行语句
   					return k+b
}

参数

参数可分为形式参数和实际参数

​ 形式参数(形参):定义方法时候,方法名后面()中的参数。相当于局部变量的声明。

​ 实际参数(实参):调用放到是时候,方法名后面()中的参数。相当于给局部变量赋值。

​ 实际参数和形式参数其数据类型、顺序都要一致。

方法签名:(方法名+参数列表):标识方法的唯一

方法的兼容类型

形参和实参: 形参的类型>=实参的类型
返回值的数据类型<=方法返的回值类型<=接收返回值的变量类型:

接收返回值的变量类型:就是接收返回值 的数据类型

方法返回值类型:就是方法就是符号后面的 返回值类型

返回值的数据类型:就是return后面的数据的数据类型

return的使用

  1. 在有返回值类型中,使用return
    1. 提前结束该方法
    2. 返回最终结果
  2. 在没有返回值类型中
    1. 可以不使用return,建议使用该方便
    2. 可以使用return,作用提前结束该方法。

出现不可达语句的集中情况的分析

不可达语句:

  1. 一定会执行到的return后面的语句;

    1. 因为提前结束该方法导致无法执行后面的代码
  2. break后

    1. 因为提前结束该循环导致无法执行后面的代码
  3. 死循环后面

    1. 因为前面的代码用于无法执行完毕,导致无法执行后面的代码。
  4. continue后面

    1. 因为提前结束本次循环,导致无法执行后面的代码
  5. while(false){语句}

    1. 系统认为判断条件为false的时候,不会执行该语句。
    2. 可以采用赋值给变量,利用变量欺瞒系统。

    代码如下:

    System.out.println();{
    //蒙蔽编译器
    boolean flag=true;
    	while(flag){//若是条件直接为false,则系统报错。
    		System.out.println("循环体");
    		}
    		System.out.println("循环后面的代码");
    }
    

使用方法的好处

  1. 隐藏方法实现的细节,可以提高安全性
  2. 简化代码,可以多次复用代码。

方法的重载

定义:重载就是具有相同函数名,返回类型可以不同,参数个数、顺序、类型不同的函数。

个人理解:就是在同一个类中,只按照函数名相同,参数列表不同来区分是否是重载。

重载的无关因素

​ 跟修饰符、返回值以及参数列表中相同类型中的参数名称无关。

//与public static	修饰符无关 
//与void				返回值类型无关
//与int a中的a		   参数列表中的 参数名称无关
public static void getSum(int a,int b){
		System.out.println("求2个数的和int,int");
		System.out.println(a+b);
	}
重载的有关因素

​ 与参数列表中的数据类型、顺序以及个数有关

public class OverloadDemo04 { 
	
	//主方法
	public static void main(String[] args){ 
		getSum(1.0,2);
	}
	//求2个数的和
	public static void getSum(int a,int b){//a与b交换位置,仍是同一个的方法,构成不了重载
		System.out.println("求2个数的和int,int");
		System.out.println(a+b);
	}
	
	
	public static void getSum(int b,double a){//参数列表数据类型不一致,构成重载
		System.out.println("求2个数的和int,double");
		System.out.println(a+b);
	}
	
	
	public static void getSum(double a,int b){//参数列表属性不一样,构成重载
		System.out.println("求2个数的和double,int");
		System.out.println(a+b);
	}
	
	//求2个数的和
	public static void getSum(int a,int b,int c){//参数个数不一致,构成重载
		System.out.println("求3个数的和int,int,int");
		System.out.println(a+b+c);
	}
}

数组

数组的含义

​ 数组的含义:数组(array)是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。

数组与变量的区别

​ 变量只能存入一个数据,而数据可以存入多个数据并且是有序排列的。

数组的声明方式(三种)

动态初始化(一种)
  1. 第一种声明方式(动态初始化)//先声明并开辟数组空间。

    1. 数据类型[] 数组名;

    2. 类型数据 数组名[];

      1. 数据类型:基本数据类型或引用数据类型。

      2. 数组名:就是标识符,完全遵照Java中的规则和规范。

      3. 在同一个数组中,只能存放同一种类型的数据, 数据类型可以是任何相同的数据类型 。

        备注:若是声明是int变量,只能存储int变量的数组。

静态初始化(两种)
  1. 第二种声明方式//声明数组的同时并赋值
    1. 数据类型[] 数据名=new 数据类型{};
  2. 第三种声明方式//声明数组的同时并赋值
    1. 数据类型[] 数据名={};

示例:

public class WhatEver {
    public static void main(String[] args) {
        //第一种   例:
        String[] test1 = new String[6];
        test1[0] = "数组0";
        test1[1] = "数组1";
        //第二种 例:
        String[] test3 = new String[]{"数组0","数组1","数组2","...."};
         //第三种 例:
        String[] test2 = {"数组0","数组1","数组2","...."};
    }
}

数组的使用

​ 数组的索引:根据数组的索引可以精确的定位到数组中的每一个的位置,对这个位置上是数据进行增加、删除、修改、查询。

​ 数组的索引默认从0开始,数组的长度可使用数组.length-1得到

数组的遍历(两种方式)

普通for循环

语法格式如下:

for(初始化条件;判断条件;迭代因子){
    执行语句;
}
增强for循环|for each

语法格式如下

//for..each|增强for  获取值
for(数据类型 变量名: 数组名){
		变量->数组中从前到后的每一个空间的数据值
}

示例如下:

public class ArrayDemo07 { 	
	//主方法
	public static void main(String[] args){ 
		String[] arr={"张三","李四","王五","赵六"};
		//for普通  i作为数组的索引
		for(int i=0;i<=arr.length-1;i++){
			System.out.println(arr[i]);
		}
		//for..each|增强for
		for(String str: arr){
			System.out.println(str);
		}
    }
}

递归(了解即可)

​ 含义:方法调用自己

递归的构成:
1.递归头:停止自己调用自己的条件
2.递归体:自己调用自己

1.临界条件: 递归头
2.递归前进段:从调用自己开始,到临界条件之间过程称之为递归前进段
3.递归后推段:从临界条件开始,将结果返回到调用的上一层

红色箭头递归前进段绿色箭头递归后推段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NHDHtG0o-1572098810381)( https://github.com/wuzhaoming/studyphotos/blob/master/%E9%80%92%E5%BD%92.png?raw=true )]

示例:

public class Recursion05 { 
	//主方法
	public static void main(String[] args){ 
		//System.out.println(rec(5));
		print(5);
	}
	//求阶乘 
	//求某个数的阶乘
	//返回值:要 int     参数:int i   5*4*3*2*1 = 5 * 4!  4!=4*3!
	public static int rec(int i){
		//临界条件
		if(i==1){
			return 1;
		}
        //执行语句
		return i * rec(i-1);
	}
	
	//使用递归打印几几乘法表
	//返回值:不需要			参数:int n
	public static void print(int n){
		//n=1 临界条件
		if(n==1){
			System.out.println("1*1=1");
			//return;
		}else{
			//使用递归,调用功能,打印出前n-1行
			print(n-1);
			//打印当前行
			for(int i=1;i<=n;i++){
				System.out.print(i+"*"+n+"="+i*n+"\t");
			}
			System.out.println();  //换行
		}
	}
	
}

if(i==1){
return 1;
}
//执行语句
return i * rec(i-1);
}

//使用递归打印几几乘法表
//返回值:不需要			参数:int n
public static void print(int n){
	//n=1 临界条件
	if(n==1){
		System.out.println("1*1=1");
		//return;
	}else{
		//使用递归,调用功能,打印出前n-1行
		print(n-1);
		//打印当前行
		for(int i=1;i<=n;i++){
			System.out.print(i+"*"+n+"="+i*n+"\t");
		}
		System.out.println();  //换行
	}
}

}

【使用教程】 一、环境配置 1、建议下载anaconda和pycharm 在anaconda中配置好环境,然后直接导入到pycharm中,在pycharm中运行项目 anaconda和pycharm安装及环境配置参考网上博客,有很多博主介绍 2、在anacodna中安装requirements.txt中的软件包 命令为:pip install -r requirements.txt 或者改成清华源后再执行以上命令,这样安装要快一些 软件包都安装成功后才算成功 3、安装好软件包后,把anaconda中对应的python导入到pycharm中即可(不难,参考网上博客) 二、环境配置好后,开始训练(也可以训练自己数据集) 1、数据集准备 需要准备yolo格式的目标检测数据集,如果不清楚yolo数据集格式,或者有其他数据训练需求,请看博主yolo格式各种数据集集合链接:https://blog.csdn.net/DeepLearning_/article/details/127276492 里面涵盖了上百种yolo数据集,且在不断更新,基本都是实际项目使用。来自于网上收集、实际场景采集制作等,自己使用labelimg标注工具标注的。数据集质量绝对有保证! 本项目所使用的数据集,见csdn该资源下载页面中的介绍栏,里面有对应的下载链接,下载后可直接使用。 2、数据准备好,开始修改配置文件 参考代码中data文件夹下的banana_ripe.yaml,可以自己新建一个不同名称的yaml文件 train:训练集的图片路径 val:验证集的图片路径 names: 0: very-ripe 类别1 1: immature 类别2 2: mid-ripe 类别3 格式按照banana_ripe.yaml照葫芦画瓢就行,不需要过多参考网上的 3、修改train_dual.py中的配置参数,开始训练模型 方式一: 修改点: a.--weights参数,填入'yolov9-s.pt',博主训练的是yolov9-s,根据自己需求可自定义 b.--cfg参数,填入 models/detect/yolov9-c.yaml c.--data参数,填入data/banana_ripe.yaml,可自定义自己的yaml路径 d.--hyp参数,填入hyp.scratch-high.yaml e.--epochs参数,填入100或者200都行,根据自己的数据集可改 f.--batch-size参数,根据自己的电脑性能(显存大小)自定义修改 g.--device参数,一张显卡的话,就填0。没显卡,使用cpu训练,就填cpu h.--close-mosaic参数,填入15 以上修改好,直接pycharm中运行train_dual.py开始训练 方式二: 命令行方式,在pycharm中的终端窗口输入如下命令,可根据自己情况修改参数 官方示例:python train_dual.py --workers 8 --device 0 --batch 16 --data data/coco.yaml --img 640 --cfg models/detect/yolov9-c.yaml --weights '' --name yolov9-c --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15 训练完会在runs/train文件下生成对应的训练文件及模型,后续测试可以拿来用。 三、测试 1、训练完,测试 修改detect_dual.py中的参数 --weights,改成上面训练得到的best.pt对应的路径 --source,需要测试的数据图片存放的位置,代码中的test_imgs --conf-thres,置信度阈值,自定义修改 --iou-thres,iou阈值,自定义修改 其他默认即可 pycharm中运行detect_dual.py 在runs/detect文件夹下存放检测结果图片或者视频 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值