Java方法
Java方法
- 概念:方法是语句的集合,它们一起执行一个功能。
-
方法是解决一类问题的步骤的有序组合
-
方法包含于类或对象中
-
方法在程序中被创建,在其他地方被引用
-
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样利于我们后期的拓展。
- 组成:
修饰符 返回值类型 方法名(参数类型 参数名,参数类型 参数名){
...
方法体
return 返回值;
}
- 参数类型:形式参数和实参
- 形式参数:在方法被调用时用于接收外界输入的数据,像一个盒子
- 实参:调用方法时实际传给方法的数据
- 方法体:方法体包含具体的语句,定义该方法的功能
方法的重载
-
概念:重载就是在类中,有相同的函数名称,但是参数形式不同
-
规则:
- 方法名称必须相同
- 参数列表必须不同(个数不同、类型不同、参数的排列顺序不同)
- 返回值可以相同也可以不同
- 仅仅返回类型不同不足以构成方法的重载
public class B { //两数相加 public static int add(int a,int b) { return a+b; } public static double add(double c,double d) { return c+d; } public static void main(String[] args) { Scanner s=new Scanner(System.in); int sun=add(1,3); System.out.println(sun); s.close(); } }
命令行传参
运行一个程序时候再给它传递参数,这就要靠命令行参数给main函数传参
这里实现不了,classpath和path配置正确但是无法实现,我也是蒙了,可能是我把工作区换了个盘,气死俺
可变参数
- 不定项参数:在方法声明中,在指定参数类型后面加一个省略号...
- 一个方法只能有一个不定项参数,它必须是方法的最后一个参数,任何普通参数必须在它声明。
- 实际就是数组
public class B {
//求最大值
public static void printmax(double...ds ) {
if(ds.length==0) {
System.out.println("无数据输入!");
return;
}
double result=ds[0];
for (int i = 0; i < ds.length; i++) {
if(ds[i]>result)
{
result=ds[i];
}
}
System.out.println("最大值为:"+result);
}
public static void main(String[] args) {
//调用可变参数
printmax(1,2.3,45,68);
}
}
递归!!!
- 递归就是A方法自己调用自己
- 递归结构包括两个部分:
- 递归头:什么时候不调用自身方法,如果没有头,将陷入死循环
- 递归体:什么时候需要调用自身方法
public class B {
//递归
public int f(int n) {
if(n==1) {
return 1;
}
else {
return n*f(n-1);
}
}
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
B b=new B();
int n=s.nextInt();
System.out.println(b.f(n));
s.close();
}
}
- 当输入n=5时,此时根据f(n)这个方法,return的是5xf(4)-->5x4xf(3)-->5x4x3xf(2)-->5x4x3x2xf(1)
- 当n=1,f(1)=1,所以最后的结果是5x4x3x2x1
- 不建议数目较大,可能会让电脑卡死。
数组
-
数组:数组是相同类型数据的有序集合
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
其中,每一个数据称作是一个数组元素,每个数组元素可以通过一个下标来访问
-
数组的声明和创建:
int[] nums;//声明一个数组 nums=new int[10];//创建一个数组 int[] nums=new int[10];
数组元素是通过索引访问的,数组索引从零开始。
获取数组长度:array.length (0--n-1)
ArrayIndexOutOfBounds--数组下标越界
-
内存分析:
- 堆:存放new 的对象和数组,可以被所有的线程共享,不会存放别的对象引用
- 栈:存放基本变量类型,包括其具体数值;引用对象的变量,包括其在堆里的具体地址
- 方法区:可以被所有的线程共享,包含所有的class和static变量
-
数组的初始化:
int[] a={1,2,3};//静态初始化 int[] b=new int[10]; b[0]=10; //动态初始化,包含了默认初始化
默认初始化组是引用类型,他的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照初始实例变量同样的方式被隐式初始化
-
数组的四个基本特点:
- 数组的长度是确定的,数组一旦被创建,大小就不可改变
- 数组的元素必须是相同类型,不允许出现混合类型
- 数组中的元素可以使任何数据类型,包括引用型和基本数据类型
- 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
- 数组本身就是对象,java中的对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身就是在堆中的
-
数组的使用:
-
数组作为参数
-
数组作为返回值
package t1_1; import java.util.Arrays; public class A02 { //反转数组 public static int[] reverse(int[] a) {//数组作为返回值 int[] re=new int[a.length]; for(int i=0,j=a.length-1;i<a.length;i++,j--) { re[i]=a[j]; } return re; } //打印数组 public static void printA(int[] a) {//把数组作为参数 for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } System.out.println(); } public static void main(String[] args) { int[] a= {1,2,3}; int[] re=reverse(a); printA(re); } }
多维数组
定义数组的两种方式:
int[][]a= {{1,2},{2,3}};
int[][]b=new int[2][5];
System.out.println(a.length);// 2
System.out.println(b.length);// 2
数组b中指的是两行五列的数组
每个数组的下表都是从0开始编号,a[0]指的是{1,2},
当然a[0] [0]指的是1,在指定输出的时候a[0]输出地址
Arrays类
//Arrays.toString()
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
这里是将数组中的元素转为String类型,直接输出为一串字符串。
参数类型为:long,int,short,char,byte,boolean,float,double,object类型的数组,不要用多维数组
,源码给的只能转化一维数组,因为一维数组的每个元素是具体的值了,而二位数组的元素还是一个数组,不能再进行转化。
Arrays.sort(a);//升序排序,无返回值
Arrays.fill(a,1,2,3);//数组a的下标1和下标2填充为3
Arrays.fill(a,3);//数组a的元素全部填充为3