方法:实现一个功能。

方法声明:

访问修饰符  返回类型   方法名(参数列表){

  //方法体

}

访问修饰符: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

Java基础笔记(十二)——方法的更多相关文章

  1. Java学习笔记十二:Java中方法的重载

    Java中方法的重载 什么是方法的重载呢? 如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了.如下所示 4 个方法名称都为 s ...

  2. Java基础(十二):包(package)

    一.Java 包(package): 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间.包的作用: 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹 ...

  3. java基础(十二)常用类总结(二)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  4. java基础(十二章)

    一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同 ...

  5. Java基础(十二)IO输入输出

    一.IO 概述 1.IO 概念 IO:I 代表 Input 输入:O 代表 Output 输出. Java 中 IO 是以流为基础进行输入输出,所有的数据被串行化(保存)写入输出流,或者从输入流读入. ...

  6. 夯实Java基础(十二)——异常处理

    1.异常处理概述 在Java程序执行过程中, 总是会发生不被期望的事件, 阻止程序按照程序员预期正常运行, 这就是Java程序出现的异常. 异常处理是基于面向对象的一种运行错误处理机制,通过对异常问题 ...

  7. Java基础语法<十二> 泛型程序设计

    1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element ( ...

  8. Java 读书笔记 (十二) Java Character 类

    在实际开发过程中, 我们经常会遇到需要使用对象,而不是内置数据类型的情况. 为了解决这个问题, Java语言为内置数据类型char提供了包装类Character类. 可以使用Character的构造方 ...

  9. java基础第十二篇之集合、增强for循环、迭代器和泛型

    Collection接口中的常用方法: * 所有的子类子接口都是具有的 * 集合的方法:增删改查 * * public boolean add(E e);//添加元素 返回值表示是否添加成功 * pu ...

  10. Scanner、String(java基础知识十二)

    1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in) ...

随机推荐

  1. vscode 小笔记

    用户设置: { "git.ignoreMissingGitWarning": true, "workbench.statusBar.feedback.visible&qu ...

  2. tensorflow中常量(constant)、变量(Variable)、占位符(placeholder)和张量类型转换reshape()

    常量 constant tf.constant()函数定义: def constant(value, dtype=None, shape=None, name="Const", v ...

  3. OpenCV——非线性滤波器

    参考: PS 图像特效,非线性滤波器 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_IN ...

  4. ffmpeg处理RTMP流媒体的命令和发送流媒体的命令(UDP,RTP,RTMP)

    将文件当做直播送至live ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName     re限制输出速率, ...

  5. Arc071_F Infinite Sequence

    传送门 题目大意 给定一个数$n$,构造一个无限长的序列$A$,使得 $\forall i,j\geq n,A_i=A_j$ $\forall i<j<k\leq i+a_i,A_j=A_ ...

  6. Agc016_D XOR Replace

    传送门 题目大意 给定两个长为$n$的序列$A,B$你可以进行若干组操作,每次操作选定一各位置$x$,令$A_x$等于$A$的异或和. 问能否通过一定操作使得$A$成为$B$,如果能,求最小操作书数. ...

  7. Agc_006 E Rotate 3x3

    题目大意 给定一个$3\times N$的方阵,每个位置的数恰好是每一个$[1,3\times N]$中的数. 初始时,每个位置$[x,y]$填的是$3(y-1)+x,(1\leq x\leq N,1 ...

  8. C/C++面试题总结(1)

    首先说一下,这些东西,有的是必须掌握的,有的是面试时你讲出来就是闪光点.自己把握.把握不好的都搞懂.实在不行背下来. 由于时间关系,总结的比较随意,有的就直接贴链接了,希望理解一下. 第一篇:基础(必 ...

  9. delete操作符

    delete操作符通常用来删除对象的属性: Js代码     var o = { x: 1 }; delete o.x; // true o.x; // undefined 而不是一般的变量: Js代 ...

  10. 一. kafka 入门

    一.基本概念 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. K ...