java基础4(黑马)
一、方法
1.定义
方法:是一种语法结构,它可以把一段代码封装成一个功能,以便重复使用。
方法的完整格式:
package cn.chang.define;
public class MethodDemo1 {
public static void main(String[] args) {
// 目标:掌握定义方法的完整定义,搞清楚使用方法的好处
// 需求:假如现在很多程序员都要进行2个整数的求和
int a1 = 10;
int b1 = 20;
int rs = add(a1, b1);
System.out.println(rs);
int rs2 = add(20, 30);
System.out.println(rs2);
}
public static int add( int a, int b ) {
int c = a + b;
return c;
}
}
定义方法,其实是定义了一个类方法,类方法写在main函数的上面和下面都是可以的。如果是C语言的话,写在下面,那么在main函数的上面就要声明。
修饰符:暂时都使用public static进行修饰。
返回值类型:方法声明了具体的返回值类型,内部必须使用return返回对应类型的数据。
方法名:add
形参列表:形参列表可以有多个,甚至可以没有,如果多个形参,多个形参必须用逗号隔开,且不能给初始化值。
方法体代码:int c = a + b
return 返回值
使用方法的好处:提高了代码的复用性,提高了代码的开发效率。让程序的逻辑更清晰。
2.执行
方法要执行必须怎么办?
必须进行调用,
调用格式:方法名称(...)。
方法必须先创建才能使用,该过程成为方法定义。
方法建立后并不是直接运行的,需要手动使用后,才执行,该过程成为方法调用。
方法必须先定义,后调用,否则程序将报错。
3.方法的其他形式
方法的其他形式:
方法定义时:需要按照方法解决的实际业务需求,来设计合理的方法形式解决问题。
1)方法是否需要接收数据处理;
2)方法是否需要返回数据;
package cn.chang.define;
public class MethodDemo2 {
public static void main(String[] args) {
// 目标:掌握按照方法解决的实际业务需求不同,设计出合理的方法形式来解决问题
// 需求:打印3行Hello World
printHelloWorld(3);
System.out.println("------")
printHelloWorld(5);
}
/**
* 有参数:无返回值的方法
*/
public static void printHelloWorld(int n) {
for (int i = 1; i <= n; i++) {
System.out.println("Hello World");
}
}
}
注意事项:
如果方法不需要返回数据,返回值类型必须声明成void (无返回值声明),此时方法内部不可以使用return返回数据。
方法如果不需要接收数据,则不需要定义形参,且调用方法也不可以传数据给方法了。
当一个方法没有参数,且没有返回值类型(void)声明的方法,称为无参数、无返回值的方法,依次类推。
方法使用时的常见问题:
package cn.chang.define;
public class MethodProbDemo3 {
public static void printHelloWorld() {
for (int i = 1; i <= 3; i++) {
System.out.println("Hello World");
}
}
public static void main(String[] args) {
// 调用方法
printHelloWorld();
int rs = sum(10, 20);
System.out.println(rs);
System.out.println(sum(40, 60));
sum(100, 200);
printHelloWorld();
}
public static int sum(int a, int b) {
int c = a + b;
return c;
}
}
设计方法的技巧,主要关注三方面:
1)方法是否需要接收数据进行处理?
2)方法是否需要返回数据?
3)方法要处理的业务(编程能力)?
二、方法在计算机中的执行原理
方法被调用的时候,是进入到栈内存中运行。方法的运行区域是在栈内存中。
栈的特点是:先进后出。push pop。
保证一个方法调用完另一个方法后,可以回来。
方法为什么要在栈中运行自己。
sum 执行到return语句,会得到返回值30,传给rs,然后sum方法就从栈中被清理掉。
然后再执行main方法,打印rs的结果,main方法执行完成,main也会从栈中被清理掉。
程序执行完成之后,栈里的方法都会被清理。
Java的参数传递机制:
java的参数传递机制都是:值传递。
实参:在方法内部定义的变量。
形参:定义方法时,所声明的参数。
基本类型的参数传递
所谓值传递:指的是传输实参给方法的形参的时候,传输的是实参变量中存储的值的副本。
就是将实参变量的值拷贝一份出来,传递给形参。
package cn.chang.parameter;
public class MethodDemo1 {
public static void main(String[] args) {
// 目标:理解方法的参数传递机制:值传递
int a = 10;
change(a);
System.out.println("main " + a); // 10
}
public static void change(int a) {
System.out.println("change1 " + a); // 10
a = 20;
System.out.println("change2 " + a); // 20
}
}
change函数退出之后:
引用类型的参数传递:
数组:传递的是堆内存地址,相当于浅拷贝,那应该会互相影响的。
也是传递的地址,不过是地址的副本,也就是拷贝了一份给形参。
这是一节比较特殊的关键课程,必须要懂。
package cn.chang.parameter;
public class MethodDemo2 {
public static void main(String[] args) {
// 目标:引用类型的参数传递
int[] arr = new int[]{10, 20,30};
change(arr);
System.out.println("main方法:" + arr[1]);
}
public static void change(int[] arr) {
System.out.println("方法内1:" + arr[1]);
arr[1] = 222;
System.out.println("方法内2:" + arr[1]);
}
}
三、方法重载
一个类中,出现多个方法的名称相同,但是它们的形参列表不同的,那么这个方法就叫方法重载。
例:
package cn.chang.overload;
public class MethodOverloadDemo1 {
public static void main(String[] args) {
//目标:认识方法重载,掌握应用场景
test();
test(100);
}
public static void test() {
System.out.println("test1");
}
public static void test(int a) {
System.out.println("test2");
}
}
方法重载的注意事项:
一个类中,只要一些方法的名称相同,形参列表不同。那么它们就是方法重载,其他的都不管。(如修饰符、返回值类型是否一样都无所谓。)
形参列表不同指的是:形参、个数、顺序不同,不关心形参的名称。
package cn.chang.overload;
public class MethodOverloadDemo1 {
public static void main(String[] args) {
//目标:认识方法重载,掌握应用场景
test();
test(100);
}
public static void test() {
System.out.println("test1");
}
public static void test(int a) {
System.out.println("test2");
}
void test(double a) {
System.out.println("test3");
}
int test(int a, double b) {
System.out.println("test4");
return a;
}
int test(double b, int a) {
System.out.println("test5");
return a;
}
}
return、break、continue三者概念的再理解
return;跳出并立即结束所在方法的执行。
break;跳出并结束当前所在循环的执行
continue;结束当前所在循环的当次继续,进入下一发执行,
四、案例
案例1:买飞机票:
用户购买机票的时候,机票原价会按照淡季、旺季,头等舱还是经济舱的情况进行相应的优惠,优惠方案如下:5-10月为旺季,头等舱9折,经济舱8.5折;11月到来年4月为淡季,头等舱7折,经济舱6.5折,请开发程序计算出用户当前机票的优惠价。
分析:
1)方法是否需要接受数据?需要接收机票价、当前月份和舱位类型;
2)方法是否需要返回数据?需要返回计算出机票优惠价;
3)方法内部:先使用if判断月份是旺季还是淡季,然后使用switch分支判断是头等舱还是经济舱。
package cn.chang;
public class Case1 {
public static void main(String[] args) {
// 目标:买飞机票的案例
double price = calculate(1000, 8,"经济舱");
System.out.println("优惠价是:" + price);
}
public static double calculate(double price, int month, String type) {
// 判断当前月份是淡季还是旺季
if (month >= 5 && month <= 10) {
// 旺季
switch(type) {
case "头等舱":
price *= 0.9;
break;
case "经济舱":
price *= 0.85;
break;
}
} else {
// 淡季
switch(type) {
case "头等舱":
price *= 0.7;
break;
case "经济舱":
price *= 0.65;
break;
}
}
return price;
}
}
案例2:开发验证码:
开发一个程序,可以生成指定位数的验证码,每位可以是数字、大小写字母。
分析:
1)分析方法是否需要接收数据?
需要接收一个整数,控制生成验证码的位数,也就是验证码的长度。
2)方法是否需要返回数据?
需要返回生成的验证码。
3)方法内部的业务:
使用for循环依次生成每位随机字符,并使用一个String类的变量把每个字符连接起来,最后返回该变量即可。
package cn.chang;
import java.util.Random;
public class Case2 {
public static void main(String[] args) {
// 目标:完成随机验证码
String rs = createCode(5);
System.out.println(rs);
}
public static String createCode(int n) {
Random random = new Random();
String code = "";
for (int i = 1; i <= n; i++) { //为每个位置生成一个随机字符,可能是数字、大小写字母//思路:随机一个0/1/2之间的数字出来,0 代表随机生成一个数字、1/2代表随机大写字母、小写字母
int type = random.nextInt(3);switch (type) { case 0:
// 随机数字字符
code += random.nextInt(10);
break;
case 1:
// 随机大写字母
code += (char) ('A' + random.nextInt(26));
break;
case 2:
// 随机小写字母
code += (char) ('a' + random.nextInt(26));
break;
}
}
return code;
}
}
案例3:评委打分:
在唱歌比赛中,可能有多名评委要给选手打分,分数[1-100]之间的整数。选手最后得分为:去掉最高分、最低分、剩余分数的平均分,请编写程序能够录入多名评委的分数,并算出选手的最终得分。
分析:
1)方法是否需要接收数据进行处理?需要接收评委的人数。
2)方法是否需要返回数据?需要返回计算出选手最终得分。
3)方法内部的业务:定义动态数组,录入评委的分数存到数组中,接着我们需要遍历数组中的分数,计算出总分,并找出最高分和最低分,最后按照这些数据算出选手最终得分并返回即可
package cn.chang;
import java.util.Scanner;
public class Case3 {
public static void main(String[] args) {
// 案例:评委打分
double rs = getAverageScore(5);
System.out.println("该选手的平均分是: " + rs);
}
public static double getAverageScore(int number) {
// 使用数组来存储评委分数
int[] scores = new int[number];
// 评委打分,存到数组中
Scanner sc = new Scanner(System.in);
System.out.println("开始评委打分:");
for (int i = 1; i <= number; i++) {
System.out.print(i + "号评委的评分: ");
int score = sc.nextInt();
scores[i - 1] = score;
}
//求和
int sum = 0;
int max_value = scores[0];
int min_value = scores[0];
for (int i = 0; i < scores.length; i++) {
int score = scores[i];
sum += score;
if (score > max_value) {
max_value = score;
}
if (score < min_value) {
min_value = score;
}
}
// 使用sum值减去最高分,减去最低分,然后再求平均
double average = 1.0 * (sum - max_value - min_value) / (number - 2);
return average;
}
}
相关文章:

java基础4(黑马)
一、方法 1.定义 方法:是一种语法结构,它可以把一段代码封装成一个功能,以便重复使用。 方法的完整格式: package cn.chang.define;public class MethodDemo1 {public static void main(String[] args) {// 目标:掌…...

nodejs - vue 视频切片上传,本地正常,线上环境导致磁盘爆满bug
nodejs 视频切片上传,本地正常,线上环境导致磁盘爆满bug 原因: 然后在每隔一分钟执行du -sh ls ,发现文件变得越来越大,即文件下的mp4文件越来越大 最后导致磁盘直接爆满 排查原因 1、尝试将m3u8文件夹下的所有视…...

注意力机制(Attention Mechanism)和Transformer模型的区别与联系
注意力机制(Attention Mechanism) 和 Transformer 模型 是深度学习领域中的两个重要概念,虽然它们紧密相关,但有着明显的区别。下面我们将从 定义、作用、结构 和 应用 等多个维度来分析这两者的区别与联系。 1. 定义 注意力机制(Attention Mechanism): 注意力机制是一…...

C++,设计模式,【单例模式】
文章目录 一、模式定义与核心价值二、模式结构解析三、关键实现技术演进1. 基础版(非线程安全)2. 线程安全版(双重检查锁)3. 现代C++实现(C++11起)四、实战案例:全局日志管理器五、模式优缺点深度分析✅ 核心优势⚠️ 潜在缺陷六、典型应用场景七、高级实现技巧1. 模板化…...

C++:类和对象初识
C:类和对象初识 前言类的引入与定义引入定义类的两种定义方法1. 声明和定义全部放在类体中2. 声明和定义分离式 类的成员变量命名规则 类的访问限定符及封装访问限定符封装 类的作用域与实例化类的作用域类实例化实例化方式: 类对象模型类对象的大小存储…...

官网下载Redis指南
1.访问官网 https://redis.io/downloads/#stack 2.点击redis图标 拉到下面点击download 在新页面拉到最下面,点击install from source 找到需要的大版本后,点击releases page 最后点击下载需要的版本号即可...

活动预告 |【Part1】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载
课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动,了解 Azure 如何为将工作负…...

【Linux系统编程】五、进程创建 -- fork()
文章目录 前言Ⅰ. 重温fork函数一、fork()的概念二、如何理解fork()有两个返回值 Ⅱ.fork的常规用法Ⅲ. fork调用失败的原因Ⅳ. 写时拷贝为什么存在写时拷贝❓❓❓ 前言 现阶段我们知道进程创建有如下两种方式,其实包括在以后的学习中这两种方式也是最常见的&#…...

深入解析 STM32 GPIO:结构、配置与应用实践
理解 GPIO 的工作原理和配置方法是掌握 STM32 开发的基础,后续的外设(如定时器、ADC、通信接口)都依赖于 GPIO 的正确配置。 目录 一、GPIO 的基本概念 二、GPIO 的主要功能 三、GPIO 的内部结构 四、GPIO 的工作模式 1. 输入模式 2. 输出模式 3. 复用功能模式 4. 模…...

深入探究 C++17 std::is_invocable
文章目录 一、引言二、std::is_invocable 概述代码示例输出结果 三、std::is_invocable 的工作原理简化实现示例 四、std::is_invocable 的相关变体1. std::is_invocable_r2. std::is_nothrow_invocable 和 std::is_nothrow_invocable_r 五、使用场景1. 模板元编程2. 泛型算法 …...

Vmware网络模式
一、Vmware虚拟网络 Vmware共支持创建20个虚拟网络,相当于现实生活的交换机,名称vmnet0-vmnet19 没创建一个虚拟网络。对应在物理机会自动生成相应的虚拟网卡 该虚拟网卡用于和对应的虚拟网络中的虚拟机通信 二、虚拟网络的工作模式 1、nat模式 …...

神经辐射场(NeRF):从2D图像到3D场景的革命性重建
神经辐射场(NeRF):从2D图像到3D场景的革命性重建 引言 在计算机视觉和图形学领域,如何从有限的2D图像中高效且准确地重建真实的3D场景,一直是一个重要的研究方向。传统的3D重建方法,如多视角几何、点云重建…...

深入解析AI技术原理
序言 在当今数字化时代,人工智能(AI)已经成为科技领域最炙手可热的话题之一。从智能家居到自动驾驶汽车,从医疗诊断到金融风险预测,AI的应用无处不在。然而,对于许多人来说,AI背后的技术原理仍然充满了神秘色彩。本文将深入探讨AI的核心技术原理,从基础理论到前…...

PDF 2.0 的新特性
近来闲来无事,就想着把PDF的新标准研究研究,略有所得,和大家分享一下。 PDF 2.0的主要新特性包括更高级的加密算法、改进的数字签名和权限管理机制、增强了对非罗马字符的支持,以及扩展了标签架构和3D建模语言“PRC”的支…...

Matlab机械手碰撞检测应用
本文包含三个部分: Matlab碰撞检测的实现URDF文件的制作机械手STL文件添加夹爪 一.Matlab碰撞检测的实现 首先上代码 %% 检测在结构环境中机器人是否与物体之间发生碰撞情况,如何避免? % https://www.mathworks.com/help/robotics/ug/che…...

(root) Additional property include:is not allowed
参考:执行docker compose命令出现 Additional property include is not allowed_(root) additional property include is not allowed-CSDN博客 原因是docker-compose的版本太低,下载最新的替换即可。 第一次2.6.x版本改成了2.19.x不够高,所…...

react 18父子组件通信
在React 18中,父子组件之间的通信方式与之前的版本基本相同,主要可以通过以下几种方式实现: 1. Props(属性) 父组件向子组件传递数据: 父组件通过属性(props)向子组件传递数据&am…...

FastReport 加载Load(Stream) 模板内包含换行符不能展示
如下代码 当以FastReport 载入streams时 当模板内包含换行符时会导致不能正常生成pdf System.Xml.XmlDocument newFrxXml new System.Xml.XmlDocument(); newFrxXml.Load(fileName);FastReport.Report report new FastReport.Report();using (var memStream new MemoryStre…...

Maven 中常用的 scope 类型及其解析
在 Maven 中,scope 属性用于指定依赖项的可见性及其在构建生命周期中的用途。不同的 scope 类型能够影响依赖项的编译和运行阶段。以下是 Maven 中常用的 scope 类型及其解析: compile(默认值): 这是默认的作用域。如果…...

vue3:点击子组件进行父子通信
问: 子组件怎么和爷爷组件通信 回答: 在Vue 3中,子组件和爷爷组件之间的通信可以通过事件冒泡和状态管理来实现。你可以使用Vue的事件系统来传递事件,或者使用全局状态管理库如Vuex或Pinia。以下是一个使用事件冒泡的示例&…...

Composo:企业级AI应用的质量守门员
在当今快速发展的科技世界中,人工智能(AI)的应用已渗透到各行各业。然而,随着AI技术的普及,如何确保其可靠性和一致性成为了企业面临的一大挑战。Composo作为一家致力于为企业提供精准AI评估服务的初创公司,通过无代码和API双模式,帮助企业监测大型语言模型(LLM)驱动的…...

Jackson扁平化处理对象
POJO对象 Data public class People {private PeopleInfo peopleInfo;private List<String> peopleIds;private Map<String, String> peopleMap;Datapublic static class PeopleInfo {private String name;private String address;} }JSON序列化处理 直接将对象进…...

Java即时编译器(JIT)的原理及在美团的实践经验
基本功 | Java即时编译器原理解析及实践 - 美团技术团队 这篇文章由美团AI平台/搜索与NLP部的珩智、昊天、薛超撰写,深入介绍了Java即时编译器(JIT)的原理及在美团的实践经验。 Java执行过程与即时编译器概述 Java执行过程:Java…...

使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南
文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来,大语言模型(LLM)的应用逐渐成为技术热点,而 DeepSeek 作为国产开…...

算法基础之八大排序
文章目录 概要1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 希尔排序(Shell Sort)5. 归并排序(Merge Sort)6. 快速排…...

使用TensorFlow和Keras构建卷积神经网络:图像分类实战指南
使用TensorFlow和Keras构建卷积神经网络:图像分类实战指南 一、前言:为什么选择CNN进行图像分类? 在人工智能领域,图像分类是计算机视觉的基础任务。传统的机器学习方法需要人工设计特征提取器,而深度学习通过卷积神经…...

音频进阶学习十一——离散傅里叶级数DFS
文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1)右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn)的释义 ∑ n 0 N − 1 e…...

20.<Spring图书管理系统①(登录+添加图书)>
PS:关于接口定义 接口定义,通常由服务器提供方来定义。 1.路径:自己定义 2.参数:根据需求考虑,我们这个接口功能完成需要哪些信息。 3.返回结果:考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…...

关于图像锐化的一份介绍
在这篇文章中,我将介绍有关图像锐化有关的知识,具体包括锐化的简单介绍、一阶锐化与二阶锐化等方面内容。 一、锐化 1.1 概念 锐化(sharpening)就是指将图象中灰度差增大的方法,一次来增强物体的轮廓与边缘。因为发…...

Django开发入门 – 0.Django基本介绍
Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释: Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …...