之前在校学习java,学习各种框架,虽然学到了很多,但是长时间没有复习,多数知识有点遗忘了。近期假期在家无聊,打算将java系统的复习一遍,复习的过程中,发现了一些以前没有在意过,却实实在在存在的知识点,因为在写项目或平时的程序代码中几乎没有用到过,反而觉得很有意思。因此打算边复习边整理,本文不针对所有的java基础知识,而是对日常少见、缺乏思考、或疑难知识的探讨。
1.可变参数列表
1)demo1: 以求和为例
package com.susu;
public class ArgsDemo {
//求和
public void sum(int...n) {
//使用增强for循环
int sum = 0;
for(int a:n) {
sum +=a;
}
System.out.println("sum="+sum);
}
public static void main(String[] args) {
ArgsDemo argsDemo = new ArgsDemo();
argsDemo.sum(1); //1个参数
argsDemo.sum(1,2); //2个参数
argsDemo.sum(1,2,3); //多个参数
}
}
2)demo2: 以查找为例
注:a.可变参数列表可以与数组进行兼容,即可以把数组传递给可变参数列表(如以下代码中,方法2)
b. 以下代码,会认为当前的两个search方法重复定义,而不是重载。会报错
/*public void search(int a1, int[] a) {
//数组作为参数时,是不能将多个值传递给数组的。
//即在主方法中,argsDemo1.search(2,1,2,3,4,)就会报错了
}*/
c.一个方法中只能有一个可变参数。
package com.susu;
public class ArgsDemo1 {
//查找
public void search(int a1, int... a) { //可变参数放到最后一个位置,否则报错
boolean flag = false; //默认没有找到
//使用增强for循环
for(int n:a) {
if(a1==n) {
flag = true;
break;
}
}
if(flag) {
System.out.println("已经找到");
}else {
System.out.println("没有找到");
}
}
//注:以下代码,会认为当前的两个search方法重复定义,而不是重载。会报错
/*public void search(int a1, int[] a) {
//数组作为参数时,是不能将多个值传递给数组的。
//即在主方法中,argsDemo1.search(2,1,2,3,4,)就会报错了
}*/
public static void main(String[] args) {
ArgsDemo1 argsDemo1 = new ArgsDemo1();
//方法一:输入多个参数
argsDemo1.search(2, 1,2,3,4); //控制台:已经找到
//方法二:将多个参数看作一个数组
int[] arr = {1,2,3,4};
argsDemo1.search(2, arr); //控制台:已经找到
}
}
2.调试
1)debug中,设置断点,按F6 可以进行单步调试。
2)按F5可以跳到方法内部执行,结合F6单步执行。
3)F7作用:由方法内部返回调用处。如:按F5跳到方法内部,F6单步执行。如果此时方法中语句较长,想要跳到主方法中,按F7。
ps: 大家可任意选择程序进行调试,程序中最好包含主方法和普通方法,熟悉调试按键,感受调试流程。
3.方法的传值问题
1)基本数据类型传值
方法中对参数的修改,会对主方法中传来的数组产生影响
2)引用数据类型传值
方法中对数组的改变,会影响主方法中传来的数组
下面用三个例子进行演示:
eg. demo1: 方法中对a,b值有交换,可是主方法中没有。==》普通变量传值,传递的只是值,不是变量的地址
m,n只是传值给a和b, a和b所作的操作与m,n无关。
package com.susu;
public class ExchangeDemo {
//交换方法
public void swap(int a,int b) {
int temp;
System.out.println("交换前:a="+a+",b="+b);
temp = a;
a = b;
b = temp;
System.out.println("交换后:a="+a+",b="+b);
}
public static void main(String[] args) {
int m= 4, n=3;
ExchangeDemo ed = new ExchangeDemo();
System.out.println("交换前:m="+m+",n="+n);
ed.swap(m, n);
System.out.println("交换后:m="+m+",n="+n);
}
/**
* 控制台输出
* 交换前:m=4,n=3
交换前:a=4,b=3
交换后:a=3,b=4
交换后:m=4,n=3
*/
}
eg. demo2: n的值在方法内部发生改变,主方法中的n值没有改变。
package com.susu;
public class ExchangeDemo1 {
public void add(int n) {
n++;
System.out.println("方法中n="+n);
}
public static void main(String[] args) {
int n = 10;
System.out.println("方法调用前n的值"+n);
ExchangeDemo1 ed1 = new ExchangeDemo1();
ed1.add(n);
System.out.println("方法调用后n的值:"+n);
/**控制台输出:
* 方法调用前n的值10
方法中n=11
方法调用后n的值:10
*/
}
}
eg. demo3: 数组作为方法参数的传值问题
调用方法进行数组传值的时候,是把方法中的参数,即名字为a的数组,也指向了a1数组的第一个元素1,所以此时a和a1数组指向了同一片内存空间,即指向了同一个数组,所以当在方法中对数组中的某个元素值进行修改的时候,也影响到了主方法中a1数组。最终最后的结果是:两个数组中的值都进行了影响。
(ps:大家要区分普通变量传值和数组传值的不同,数组是引用数据类型。包括后面我们将学习的面向对象当中:对象作为方法参数时,也会对对象内容进行影响。因为对象是用类来声明,本身也属于引用数据类型。)
package com.susu;
public class ArrayDemo {
//定义一个用于修改某个数组元素值的方法
public void updateArray(int[] a) {
a[3] = 15;
System.out.println("数组a的元素为:");
for(int n:a) {
System.out.print(n+" ");
}
System.out.println();
}
public static void main(String[] args) {
ArrayDemo ad = new ArrayDemo();
int[] a1 = {1,2,3,4,5};
System.out.println("方法调用前数组a1的元素为:");
for(int n:a1) {
System.out.print(n+" ");
}
System.out.println();
ad.updateArray(a1);
System.out.println("方法调用后数组a1的元素为:");
for(int n:a1) {
System.out.print(n+" ");
}
// 控制台的输出:
// 方法调用前数组a1的元素为:
// 1 2 3 4 5
// 数组a的元素为:
// 1 2 3 15 5
// 方法调用后数组a1的元素为:
// 1 2 3 15 5
}
}