今日内容-方法
- 方法概念:在类中定义的具有特定功能的代码块
- 方法关键字:{}
- 方法格式:
修饰符 返回值类型 方法名(参数列表){ 方法体; return 返回值; }
- 方法作用:提高代码的复用性 可以多次使用
- 方法别名:小程序、函数
- 方法命名规则:
- 方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。
- 下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。一个典型的模式是:test<MethodUnderTest>_<state>,例如 testPop_emptyStack。
/* 程序(软件):计算机命令和数据的集合 通过计算机命令对数据进行处理 通过计算机命令对数据按指定的算法进行转换 */
/* 把洗衣机写成一个方法 洗衣机使用:全家人使用 洗衣机原始数据:水类型 水名字、电类型 电名、衣服类型 脏衣服名 洗衣过程:注水 搅拌 甩干 洗衣结果数据:净衣服 */ public static 衣服类型 小天鹅1号(水类型 水名字、电类型 电名、衣服类型 脏衣服名){ 注水; 搅拌; 甩干; return 净衣服; }
/* 方法格式: 修饰符 返回值类型 方法名(参数列表){ 方法体; return 返回值; } 方法格式详解: 修饰符:让被修饰者具有一些本来不具有的特征 返回值:方法运行完后得到的结果数据 方法名:给此代码块起的名字 和同类以区分、方便调用 参数列表:定义的多个变量用于接收方法需要的原始数据 方法体:两个大括号之间的代码块 把原始数据转换为结果数据的代码 功能实现的具体代码 return:把返回值返还给调用者 结束方法
- 方法使用
- 注意1:方法必须先定义再使用
- 注意2:方法必须定义在类中 主方法外
public class Function01 { public static void main(String[] args) { //方法 /* 格式: * 修饰符 返回值类型 方法名(参数列表){ * 方法体; * return 返回值; * } */ Scanner sc = new Scanner(System.in); System.out.println("输入第一个数"); int num1 = sc.nextInt(); System.out.println("输入第二个数"); int num2 = sc.nextInt(); System.out.println("输出两个数的最大值"); //调用方法:在主方法中调用方法 int max1 = max(num1,num2); //调用方法并接受返回值 System.out.println(max1); System.out.println("输出两个数的和"); int sum1 = add(num1,num2); System.out.println(sum1); } //求两个数的最大值 public static int max(int num1,int num2){ int result; if(num1 > num2) result = num1; else result = num2; return result; } //求两个数的和 //定义方法明确1:方法参数列表:方法运行需要的原始数据:两个int //定义方法明确2:方法返回值:方法运行后的结果数据:int类型的和 //public static:可以被主方法调用 //int:返回值和类型 //addInt:方法名--标识符---遵守命名规范(可读性、除了第一个单词其余单词首字母大写) //int a,int b:参数列表:有感于接收元素数据而定义的多个变量 public static int add(int num1,int num2){ //方法体:实现方法具体功能的代码块 int sum = 0; sum = num1 + num2; return sum; } }
public class Function02 { public static void main(String[] args) { // 修饰符 返回值类型 方法名(参数列表){ // 方法体; // return 返回值; // } //求一个int和一个double的和 //参数列表:int,double //明确返回值:和:double类型 double sum = addIntDouble(2, 4); System.out.println(sum); //打印一个int和一个double的和 printIntDouble(2,4); //求1到100的和 int sum1 = getSum(); System.out.println(sum1); //打印5个星 printXing(); } // 求一个int和一个double的和 // 参数列表:int,double // 明确返回值:和:double类型 // 打印一个int和一个double的和 public static double addIntDouble(int a,double d){ //定义一个sum,用于接收参数a,d两个数据的和 double sum = a+d; return sum; } //打印一个int和一个double的和 //明确参数列表:int,double //明确返回值:无,额米有返回值就用关键字void表示 public static void printIntDouble(int a,double d){ double sum=a+d; System.out.println(a+"+"+d+"="+sum); return;//无返回值时可以省略 } //求1到100的和 //明确参数列表:无 //明确返回值:和(int类型) public static int getSum(){ int sum=0; for (int i = 0; i <= 100; i++) { sum +=i; } return sum; } //打印5个星 //明确参数列表:无 //明确返回值:无 用void来标示 public static void printXing(){ for (int i = 0; i <= 5; i++) { System.out.print("*"); } System.out.println(); return;//可以省略 } }
二.基本数据类型和数据类型做参数的区别
public class Function03 {
public static void main(String[] args) {
int b=1;
int a=b;
b++;
System.out.println(a);
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
//new每次都创建一个新的对象
System.out.println(arr1);//打印对象名 打印的是对象类型@16进制内存对象
System.out.println(arr1);//打印对象名 打印的是对象类型@16进制内存对象
//通过内存地址 判断是否是同一个对象
//也可以通过== 判断是否是同一个对象
System.out.println(arr1 == arr2);//false
int[] arr3 = arr1;//让arr3指向arr1指向的数组对象:
arr1[1]=0;
System.out.println(arr3[1]);//可以通过arr1和arr3操作同一个对象
int aa = 11;
show(aa); //完全等价于:int a = aa;a++
//把main方法中的变量aa的值复制一份 给了show方法中的变量a
System.out.println(aa);//11
int[] array ={1,2,3,4};
show2(array); //完全等价于:int[] arr = array;arr[0]++;
//show2方法中的对象名arr和main方法中对象名arr指向同一个对象
//在main方法中通过array来操作此对象
//在show2方法中通过arr来操作此对象
System.out.println(array[0]);
sort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+(i==array.length-1?"\n":","));
}
}
private static void sort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = 1; j < arr.length; j++) {
if(arr[i]>arr[j]){
int temp = arr[i];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
//引用数据类型作为方法参数 传递的是对象的内存地址:两个对象名指向同一个对象
private static void show2(int[] arr) {
arr[0]++;
}
//基本数据类型作为方法参数 传递的是常量值
private static void show(int a) {
a++;
}
}
基本数据类型作为参数只是把值复制一份给了形参 更改形参的值,如果不返回,则不会影响实参的值
而数据类型作为参数,方法中的对象名和main方法中的对象名指向同一个对象
练习
- 求n的阶乘
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
System.out.println("输入一个数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = multsum(n);
System.out.println(n+"的阶乘是:"+sum);
}
//1.求n的阶乘
//参数列表:int n
//返回值:阶乘 int
//返回值类型int 方法名multsum 参数 int n
public static int multsum(int n){
//定义一个结果变量
int result = 1;
//for循环 从1到n逐步相乘
for (int i = 1; i <=n; i++) {
result = result*i;
}
return result;
}
}
2.求一个int数组的最大值
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {1,2,3,4,5,6};
int max = maxArr(arr);
System.out.println("arr数组的最大值是"+max);
}
//2.求一个int数组的最大值
//返回值类型int[] 方法名maxArr 参数 int n
public static int maxArr(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
max = max>arr[i]?max:arr[i];
}
return max;
}
}
3.对int数组进行排序
import java.util.Scanner;
public class Test03 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {1,3,3,4,56,34};
maxArr(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+(i==arr.length-1?"\n":","));
}
}
//3.对int数组进行排序
//返回值类型int[] 方法名maxArr 参数 int n
public static void maxArr(int[] arr){
for (int i = 0; i < arr.length; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i]<arr[j]){//依次进行比较 如果数组中前一个比后一个大,进行调换
int temp = arr[i];
arr[i]=arr[j]; //用临时值来存放,进行转换
arr[j]=temp;
}
}
}
}
}
4.百钱买百鸡 公鸡:3 母鸡 2 小鸡 1/3 打印几种买法
返回值类型int 方法名BaiQian 参数 int n
import java.util.Scanner;
public class Test04 {
public static void main(String[] args) {
//调用方法
BaiQian();
}
//4.百钱买百鸡 公鸡:3 母鸡 2 小鸡 1/3 打印几种买法
//返回值类型int 方法名BaiQian 参数 int n
public static void BaiQian(){
int x;//公鸡数
int y;//母鸡数
//100-x-y; //小鸡数
int count = 0; //符合条件的次数
for ( x = 0; x < 34; x++) {
for ( y = 0; y <=50; y++) {//判断钱数是否满足和小鸡的数量
if(3*x + 2*y+(100-x-y)/3 == 100 && (100-x-y)%3 == 0){
count = count+1;
}
}
}
System.out.println("符合条件的情况有"+count+"种");
}
}
5.对一个double数据 四舍五入变量指定位数的小数
public static double siSheWuRu(double a,int n)
返回值类型int 方法名BaiQian 参数 int n
public class Test05 {
public static void main(String[] args) {
double d = siSheWuRu(3.265342344, 4);
System.out.println(d);
//int arr1[] = { 1, 5, 2, 6, 8, 5, 4, 6, 8, 5, 4, };
//int []arr1 = { 1, 5, 2, 6, 8, 5, 4, 6, 8, 5, 4, };
}
//5.对一个double数据 四舍五入变量指定位数的小数
//public static double siSheWuRu(double a,int n)
//返回值类型int 方法名BaiQian 参数 int n
public static double siSheWuRu(double a,int n){
double d1;//定义一个double类型的变量,用来接收四舍五入后的数
double d2 = a * Math.pow(10, n);
int d=(int)d2;//把d2强制转换为int
if(d2 % d >=0.5){
d++;
}else{
d =d;
}
d1 = d / Math.pow(10, n);
return d1;
}
}
6.祖冲之计算圆周率:3.1415926-3.14159267
计算PI=4/1-4/3+4/5+4/7+4/9+…
问一共经历了几次加或减法运算
public class Test06 {
public static void main(String[] args) {
qiuCiShu();
}
/*
* 6.祖冲之计算圆周率:3.1415926-3.14159267
* 计算PI=4/1-4/3+4/5+4/7+4/9+......
* 问一共经历了几次加或减法运算
*/
private static void qiuCiShu() {
//方法一:
double PI = 0;
int count = 0;
int i = 1;
int k=1;
for(;PI<3.1415926 || PI>3.1415927;){
PI += 4.0/i*k;
i=(i+2);
k*=-1;
count++;
}
System.out.println("count="+count+",次数"+(count-1));
/*
* 获取每次加入pi的数的规律
* 1.正负交替
* 2.分子固定为4
* 3.分母从1开始 每次加2
* 结束循环的条件是:pi进入3.1415926-2.14159267
* 继续循环的条件是:pi>3.1415926 || pi<3.14159267
*
*/
//方法二:
double pi=0;
int ciShu;
for(ciShu = 1;pi<3.1415926 || pi>3.1415927;ciShu++){
//求每次加入pi中的那个数
//ciShu=1 分母=1
//ciShu=2 分母=3
//ciShu=3 分母=5
//ciShu=4 分母=7
double num = 4.0/(2*ciShu-1);
if(ciShu%2==0){
pi -= num;
}else{
pi += num;
}
}
System.out.println("pi="+pi+",次数"+(ciShu-1));
}
}
}
7.获取一个int数组中所有但不重复的元素构成一个数组
/*
1.创建一个空的数组arrNew 长度为arr.length 定义一个变量记录装入新数组的元素的个数count
2.遍历arr 获取当前元素arr[i] 判断0到i-1是否出现或arr[i] 如果没有出现过,就把arr[i]加入到arrNew中
3.再创建一个新的数组arr2:长度是count 把arrnew中的前count个元素加入arr2中
*/
public class Test07 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {1,3,4,23,23,245,2151}
int[] newArr = changeArr(arr);
print(newArr);//打印
}
//写一个打印函数
public staic void print(int[] arr){
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i]+(i==arr.length-1?"\t":","));
}
}
//编写一个函数 changeArr
public static int[] changeArr(int[] arr){
int[] newArr = new int[arr.length];
int count = 0;
//遍历数组
for(int i = 0;i < newArr.length;i++){
if(i == 0){
newArr[count] = arr[i];
count++;
}else{
boolean b =false;
for(int j = 0;j<i;j++){
if(arr[i] == arr[j])//判断arr数组中是否有相同的元素
b = true;//如果有,设置为true
}
}
if(b == false){ //如果标签值没有更改证明没有重复的值
newArr[count] = arr[i]; //把数组元素值添加进去
count++;
}
}
}
//创建一个新的数组 长度是count
int[] array = new int[count];
//把newArr中的前count个元素加入array中
for(int i = 0; i<array.length;i++){
array[i] = newArr[i];
}
return array;
}
}
if(arr[i] == arr[j])//判断arr数组中是否有相同的元素
b = true;//如果有,设置为true
}
}
if(b == false){ //如果标签值没有更改证明没有重复的值
newArr[count] = arr[i]; //把数组元素值添加进去
count++;
}
}
}
//创建一个新的数组 长度是count
int[] array = new int[count];
//把newArr中的前count个元素加入array中
for(int i = 0; i<array.length;i++){
array[i] = newArr[i];
}
return array;
}
}