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。以下是一个使用事件冒泡的示例&…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...