Java基础笔记(十二)——方法
方法:实现一个功能。
方法声明:
访问修饰符 返回类型 方法名(参数列表){
//方法体
}
访问修饰符:public、private、protect、default
返回类型:void——无返回值 任何数据类型:基本数据类型、String类
0,...,n个参数 (类型 名)
方法的定义有四种类型:
无参无返回值 void 方法名(){ }
无参带返回值 如:Scanner类提供的next()方法,返回值是String类型 public int area(){ return int 型值}
带参带返回值 public void max(float a,float b){ }
带参带返回值 public int fac(int n){ }
定义的方法,在类的内部,与主方法并列,主方法是程序的入口,主方法若需要调用其它方法,需要创建类的对象,使用对象名.方法名()去调用其它方法。除了主方法的其它方法之间可以直接互相调用,可以不创建对象去调用。 (因为一个类的成员属性和成员方法是属于实例化对象去拥有的。)
方法不能嵌套定义,不能把定义的方法写在主方法里。
数组作为方法参数
输出数组元素的值
public class ArrayMethod {
public void printArray(int[] arr){ //输出数组元素的值
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]+" ");
}
System.out.println();
}
public static void main(String[] args){
int[] arr={1,2,3,4,5};
ArrayMethod a=new ArrayMethod();
a.printArray(arr);
}
}
查找数组元素的值 ——方法参数为:数组,要查找的元素 ——返回值 boolean类型
import java.util.Scanner; public class ArraySearch {
//查找数组元素值的方法
public boolean search(int n,int[] arr){
boolean flag=true; //默认是没找到
for(int i=0;i<arr.length;i++){
if(arr[i]==n){
flag=true; //找到了
break; //提高程序查询效率
}
}
return flag;
}
public static void main(String[] args){
int[] arr1={1,2,3,4,5};
System.out.println("请输入要查找的数据:");
Scanner sc=new Scanner(System.in);
int n1=sc.nextInt();
ArraySearch as=new ArraySearch();
boolean flag=as.search(n1,arr1);
if(flag)
System.out.println("找到了");
else
System.out.println("没找到");
}
}
方法重载
方法名相同,参数列表不同(个数、类型、顺序),与返回值类型无关。
public class MathDemo {
//求两个int类型数的和
public int plus(int m,int n){
return m+n;
}
//求两个double类型数的和
public double plus(double m,double n){
return m+n;
}
//求数组元素的累加和
public int plus(int[] arr){
int sum=0;
for(int i=0;i<arr.length;i++){
sum=sum+arr[i];
}
return sum;
}
public static void main(String[] args){
int m=5,n=10;
int[] arr={1,2,3,4,5};
MathDemo mathDemo=new MathDemo();
System.out.println("int类型的和:"+mathDemo.plus(m,n));
System.out.println("double类型的和:"+mathDemo.plus(1.2,3.4));
System.out.println("数组元素的和:"+mathDemo.plus(arr));
}
}
参数的传值问题
Java中处理8种基本的数据类型用的是值传递,其它所有类型都用的是引用传递。8种基本数据类型的包装类型都是不可变量。
1.值传递
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=5;
ExchangeDemo ed=new ExchangeDemo();
System.out.println("交换前:m="+m+",n="+n);
ed.swap(m,n);
System.out.println("交换后:m="+m+",n="+n);
}
public void swapTest(){
int m=4,n=5;
System.out.println("交换前:m="+m+"n="+n);
swap(m,n);
System.out.println("交换后:m="+m+"n="+n);
}
} //运行结果
交换前:m=4,n=5
交换前:a=4,b=5
交换后:a=5,b=4
交换后:m=4,n=5
主方法中调用方法必须要通过对象调用,与方法同类下的其它方法,无需创建对象,可直接调用。
2.引用传递(数组作为方法参数)
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); //数组传值,a1和a指向了同一块内存空间(即同一数组)形参的改变影响了实参的值
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
引用传递:传递的是地址,形参和实参指向同一块存储单元。
值传递:基本类型传递的是值,形参用实参的值初始化了一个临时的存储单元,值虽相同,但存储单元不同,因此形参的改变不影响实参的值。
即:基本数据类型变量传值无影响,引用数据类型(数组、对象)传值有影响。
public class Test {
public static void changeStringBuffer(StringBuffer ss1,StringBuffer ss2){
ss1.append("World");
ss2=ss1;
}
public static void main(String[] args){
Integer a=1;
Integer b=a; //(1)
b++;
System.out.println(a);
System.out.println(b);
StringBuffer s1=new StringBuffer("Hello");
StringBuffer s2=new StringBuffer("Hello");
changeStringBuffer(s1,s2);
System.out.println(s1);
System.out.println(s2); //(2)
}
}
(1)Integer类型是按引用传递,不是值传递,既然是引用传递,为什么b的改变没有带来a的改变?因为Integer是不可变类,创建一个新值为2的Integer赋值给b,b与a已经无关系。
(2)
可变参数列表
public void sum(int... n){ }
public class ArgsDemo {
//求和
public void sum(int... n){
int sum=0;
for(int i:n){
sum=sum+i;
}
System.out.println("sum="+sum);
}
public static void main(String[] args){
ArgsDemo ad=new ArgsDemo();
ad.sum(1);
ad.sum(1,2);
ad.sum(1,2,3);
}
} //运行结果
sum=1
sum=3
sum=6
1.参数列表中如果有两个以上的参数,可变参数一定是在最后的(前面的参数都匹配完了,剩下的都是可变参数类型,如果把可变参数放在前面,无法判断到底应用有几个参数)。
2.一个方法中只能有一个可变参数。
3.可以将数组传递给可变参数列表。但数组作为参数时,是不能将多个值传递给数组的。
public class ArgsDemo1 {
//查找
public void search(int n,int... a){
boolean flag=false;
for(int a1:a){
if(a1==n){
flag=true;
break;
}
}
if(flag){
System.out.println("找到了!"+n);
}else{
System.out.println("没找到!"+n);
}
}
public static void main(String[] args){
ArgsDemo1 ad1=new ArgsDemo1();
ad1.search(3,1,2,3,4,5); //找到了!3
int[] a={1,2,3,4,5};
ad1.search(3,a); //找到了!3
}
public void search(int n,int[] a){ //报错 }
}
//运行结果
找到了!3
找到了!3
上述最后一段代码报错原因:在方法定义中,认为当前的两个search方法重复定义,而不是重载。
数组作为参数时,是不能将多个值传递给数组的。
public void search(int n,int[ ] a){ }
ad1.search(3,1,2,3,4,5); //报错
4.可变参数列表所在的方法是最后被访问的,只要有其它相关方法,它就不会被执行。
public class ArgsDemo2 {
public int plus(int a,int b){
System.out.println("不带可变参数的方法被调用");
return a+b;
}
public int plus(int... a){
int sum=0;
for(int n:a){
sum=sum+n;
}
System.out.println("带可变参数的方法被调用");
return sum;
}
public static void main(String[] args){
ArgsDemo2 ad=new ArgsDemo2();
System.out.println("和为:"+ad.plus(1,2));
}
} //运行结果
不带可变参数的方法被调用
和为:3
最新文章
- JS隐形数据类型转换注意事项
- 读取 java.nio.ByteBuffer 中的字符串(String) 写入方式flash.utils.ByteArray.writeUTF
- php学习日志(5)-解决Windows Live Writer错误:WindowsLive.Writer.CoreServices.HttpRequestHelper的类型初始值设定发生异常
- diamond专题(三)—— diamond架构
- sql 判断表是否存在
- JavaScript的DOM编程--01--js代码的写入位置
- 企业内部DNS跨国配置案例
- 彻底弄懂python编码
- 解决web资源跨域请求问题
- JQuery中数组的创建与使用
- mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点
- 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)
- git学习——Git 基础要点【转】
- 【docker】 VI/VIM 无法使用系统剪贴板(clipboard)
- 配置Mac漂亮的Shell--Iterm2+OhMyZSH+Agnoster
- mysql主服务器 binlog_format 的 statement,row, mixed 三种格式对比。
- 修复CentOS文件系统
- java 在Excel中插入图片 POI实现
- 吐血分享:QQ群霸屏技术教程之霸屏实施细则
- Alternating Least Squares(ASL) for Implicit Feedback Datasets的数学推导以及用Python实现
热门文章
- Mule ESB学习【转-结合了网络上的一些资源】
- ffpanel --ffmpeg的GUI,让ffmpeg离开黑黑的命令行
- bzoj 4540: [Hnoi2016]序列 莫队
- MongoDB优化之二:常见优化方法
- HTTP 协议入门(转载)
- ES6学习之let和const
- Qt弹出消息对话框
- BLUETOOTH_DEVICE_INFO 函数
- [cf687c]The Values You Can Make(01背包变形)
- Flask11 Session、CSRF、注销session、利用端点自动跳转