基础阶段:
1、何谓方法
何谓方法?
◆System.out.println(),那么它是什么呢?
◆Java方法是语句的集合,它们在- -起执行一个功能。
◆方法是解决一类问题的步骤的有序组合
◆方法包含于类或对象中
◆方法在程序中被创建,在其他地方被引用
◆设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的
时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
◆回顾:方法的命名规则?
1 package com.zhexuejia.www.method; 2 3 public class Demo01 { 4 //main方法 5 public static void main(String[] args) { 6 // int sum = add(1, 2); 7 //// System.out.println(sum); 8 test(); 9 } 10 11 //加法 12 public static int add(int a,int b){ 13 return a+b; 14 } 15 public static void test(){ 16 //用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个 17 for (int i = 0; i <= 1000; i++) { 18 if(i % 5==0){ 19 System.out.print(i+"\t"); 20 } 21 if(i%(5*3)==0){ 22 System.out.println(); 23 } 24 } 25 } 26 }
2、方法的定义及调用
◆Java的方法类似于其它语言的函数,是-段用来完成特定功能的代码片段,-般情况下,定义
一个方法包含以下语法:
◆方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
◆修饰符: 修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
◆返回值类型:方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有
返回值。在这种情况下,returnValueType 是关键字void。
◆方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
◆参数类型:参数像是-个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的
参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
◆形式参数: 在方法被调用时用于接收外界输入的数据。
◆实参:调用方法时实际传给方法的数据。
◆方法体:方法体包含具体的语句,定义该方法的功能。
修饰符返回值类型方法名(参数类型参数名){
方法体
return返回值;
}
方法调用:
◆调用方法:对象名.方法名(实参列表)
◆Java 支持两种调用方法的方式,根据方法是否返回值来选择。
◆当方法返回一个值的时候,方法调用通常被当做一个值。例如:
int larger = max(30,40);
◆如果方法返回值是void,方法调用- -定是一条语句。
System. out . println( "Hello, kuangshen!");
◆课后拓展了解:值传递和引用传递
值传递(pass by value):在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数;
引用传递(pass by reference):在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;
3、方法重载
◆重载就是在一个类中,有相同的函数名称,但形参不同的函数。
◆方法的重载的规则:
◆方法名称必须相同。
◆参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
◆方法的返回类型可以相同也可以不相同。
◆仅仅返回类型不同不足以成为方法的重载。
实现理论:
◆方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对
应的方法,如果匹配失败,则编译器报错。
4、命令行传参
◆有时候你希望运行一-个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
1 public class CommandLine { 2 public static void main(String args[]){ 3 for(int i=0; i<args.length; i++){ 4 System. out . println("args["+ i + "]:”+ args[i]); 5 } 6 } 7 }
5、 可变参数
JDK 1.5开始,Java支持传递同类型的可变参数给一个方法。
在方法声明中,在指定参数类型后加一个省略(..))。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它
之前声明。
6、递归
A方法调用B方法,我们很容易理解!
◆递归就是: A方法调用A方法!就是自己调用自己
◆利用递归可以用简单的程序来解决- -些复杂的问题。它通常把一个大型复杂的问题层层转化为
一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所
需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象
的无限集合。
◆递归结构包括两个部分:
◆递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
◆递归体:什么时候需要调用自身方法。
1 public class Demo05 { 2 public static void main(String[] args) { 3 System.out.println(f(5)); 4 } 5 //阶乘 6 //1! 1 7 //2! 2*1 8 9 public static int f(int n){ 10 if(n==1){ 11 return 1; 12 }else { 13 return n * f(n-1); 14 } 15 } 16 }
数组:
1、数组概述
数组是相同类型数据的有序集合.
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
其中,每一个数据称作一个数组元素每个数组元素可以通过一个下标来访问它们.
2、数组声明创建
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType[] arrayRefVar; t// 首选的方法中
或
dataType arrayRefVar[]; // 效果相同,但不是首选方法
◆Java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRefVar = new dataType [arraySize];
数组的元素是通过索引访问的,数组索引从0开始。
获取数组长度:
arrays . length
数组的四个基本特点
◆其长度是确定的。数组一旦被创建, 它的大小就是不可以改变的。
◆其元素必须是相同类型,不允许出现混合类型。
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
◆数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,
数组对象本身是在堆中的。
Java内存分析:
1 public class ArrayDemo02 { 2 public static void main(String[] args) { 3 //静态初始化 4 5 int[] a = {1,2,3,4,5,6,7}; 6 7 System.out.println(a[0]); 8 9 //动态初始化:包含默认初始化 10 int[] b = new int[10]; 11 12 b[0]= 10; 13 System.out.println(b[0]); 14 } 15 }
数组边界:
◆下标的合法区间: [0, length-1],如果越界就会报错;
1 public static void main(String[] args) { 2 int[] a=new int [2] ; 3 System. out. println(a[2]); 4 }
◆ArrayIndexOutOfBoundsException :数组下标越界异常!
◆小结:
数组是相同数据类型(数据类型可以为任意类型)的有序集合
数组也是对象。数组元素相当于对象的成员变量
数组长度的确定的,不可变的。如果越界,则报: ArrayIndexOutofBounds
3、数组使用
For- Each循环
数组作方法入参.
数组作返回值
1 package com.zhexuejia.www.array; 2 3 public class ArrayDemo04 { 4 public static void main(String[] args) { 5 int[] arrays = {1, 2, 3, 4, 5, 6, 7, 8}; 6 7 //遍历数组。打印数组所有的元素,取不到下标 8 // for (int array : arrays) { 9 // System.out.println(array); 10 // } 11 int[] resver = rverseArray(arrays); 12 printArrays(resver); 13 14 } 15 16 //数组反转 17 public static int[] rverseArray(int[] arrays){ 18 int[] result = new int[arrays.length]; 19 //反转 20 for (int i = 0,j=result.length-1 ; i < arrays.length; i++,j--) { 21 result[j] = arrays[i]; 22 } 23 24 25 return result; 26 27 } 28 29 //打印数组元素 30 public static void printArrays(int[] arrays){ 31 for (int i = 0; i < arrays.length; i++) { 32 System.out.println(arrays[i]+ " "); 33 } 34 } 35 }
4、多维数组
多维数组可以看成是数组的数组,比如二维数组就是-个特殊的一维数组,其每一个元素都是
一个-维数组。
◆二维数组
int a[][] = new int[2][5];
◆解析:以上二维数组a可以看成一个两行五列的数组。
思考:多维数组的使用?
num[1] [0];
5、Arrays 类
◆数组的工具类java.util.Arrays
◆由于数组对象本身并没有什么方法可以供我们调用,但API中提供了-个工具类Arrays供我们使
用,从而可以对数据对象进行一些基本的操作。
查看JDK帮助文档
◆Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不
用"使用对象来调用(注意:是"不用"而不是"不能")
◆具有以下常用功能:
◆给数组赋值:通过fill方法。
◆对数组排序:通过sort方法,按升序。
◆比较数组:通过equals方法比较数组中元素值是否相等。
◆查找数组元素: 通过binarySearch方法能对排序好的数组进行二分查找法操作。
冒泡排序:
◆冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。
◆我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为0(n2)。
6、稀疏数组
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现