JAVA基础

目录

1.基础语法

1.注释

2.关键字

3.标识符

4.常量

 5.数据类型

 6.变量

 7.类型转换

8.运算符

2.数据输入

3.流程控制语句

4.randon

5.数组

1.定义格式

 2.初始化

3.数组元素访问 

4.内存分配

5.数组常见的两个问题

1.索引越界

2.空指针异常

6.方法

1. 方法的定义和调用

无参数方法定义和调用

2.带返回值方法的定义和调用

3.方法的注意事项

 4.方法的重载

 5.方法的参数传递

1 方法参数传递基本类型

 2.方法参数传递引用类型


1.基础语法

1.注释

单行注释。单行注释的格式是使用//,从//开始至本行结尾的文字将作为注释文字。

// 这是单行注释文字

多行注释。多行注释的格式是使用/* 和 */将一段较长的注释括起来。

/*
  这是多行注释文字 这是多行注释文字 这是多行注释文字
*/

注意:多行注释不能嵌套使用

文档注释。文档注释以 /** 开始,以 */ 结束。

2.关键字

关键字是指被java语言赋予了特殊含义的单词。
关键字的特点:关键字的字母全部小写。
常用的代码编辑器对关键字都有高亮显示,比如public、class、static等。

3.标识符

凡是可以自己命名的地方都叫标识符。例如:包名,类名,方法等。

定义合法标识符规则

1.有26个英文字母大小写,0-9,_或$组成。

2.不能以数字开头。

3.不可以使用关键字和保留字,但能包含关键字和保留字。

4.严格区分大小写。

5.标识符不能包含空格。

java中的名称命名规范
1.包名:多单词组成时所有字母都小写:xxxyyyzzz

2.类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz

3.变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz

4.常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

java中的名称命名规范
1.包名:多单词组成时所有字母都小写:xxxyyyzzz

2.类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz

3.变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz

4.常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
 

4.常量

在程序运行过程中,其值不可以发生改变的量。
Java中的常量分类:
字符串常量 用双引号括起来的多个字符(可以包含0个、一个或多个),例如"a"、“abc”、"中国"等
整数常量 整数,例如:-10、0、88等
小数常量 小数,例如:-5.5、1.0、88.88等
字符常量 用单引号括起来的一个字符,例如:‘a’、‘5’、‘B’、'中’等
布尔常量 布尔值,表示真假,只有两个值true和false
空常量 一个特殊的值,空值,值为null
除空常量外,其他常量均可使用输出语句直接输出。
 

public class Demo {
    public static void main(String[] args) {
        System.out.println(10); // 输出一个整数
        System.out.println(5.5); // 输出一个小数
        System.out.println('a'); // 输出一个字符
        System.out.println(true); // 输出boolean值true
        System.out.println("hellow world"); // 输出字符串
    }
}

 5.数据类型

存储单位,其换算单位如下:
1B(字节) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB

Java是一个强类型语言,Java中的数据必须明确数据类型。在Java中的数据类型包括基本数据类型和引用数据类型两种。
在这里插入图片描述

 

 6.变量

变量的概念

1.内存中的一个储存区域。

2.该区域的数据可以在同一类型范围内不断变化。

3.变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值

变量的作用

用于内存中保存数据。

变量的声明

语法:<数据类型> <变量名称>

注意:java中每个变量必须要先声明,后使用。

数据类型 变量名 = 初始化值; // 声明变量并赋值
int age = 18;
System.out.println(age);

// 先声明,后赋值(使用前赋值即可) 数据类型 变量名;
变量名 = 初始化值;
double money;
money = 55.5;
System.out.println(money); 

 7.类型转换

自动类型转换(隐式)

1.特点:代码不需要进行特殊处理,自动完成

2.规则:数据范围从小到大

例如:int类型自动转化为long类型

在这里插入图片描述

强制类型转换(显示)

1.特点:代码需要进行特殊的格式处理,不能自动完成

2.规则:数据范围由小到大

int b = (int)10L;

  1. char类型的数据转换为int类型是按照码表中对应的int值进行计算的。比如在ASCII码表中,'a’对应97。
     int a = 'a';
     System.out.println(a); // 将输出97
    
  2. 整数默认是int类型,byte、short和char类型数据参与运算均会自动转换为int类型。
    byte b1 = 10;
    byte b2 = 20;
    byte b3 = b1 + b2;
    // 第三行代码会报错,b1和b2会自动转换为int类型,计算结果为int,int赋值给byte需要强制类型转换。
    // 修改为:
    int num = b1 + b2;
    // 或者:
    byte b3 = (byte) (b1 + b2);
    

    注意:java的整型常亮默认为int型,声明long型常量须后加 'l’或’L’

    浮点类型:float、double
    注意:Java 的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’

    字符类型:char
    注意:char类型是可以进行运算的。因为它都对应有Unicode码。

    布尔类型:boolean
    注意:boolean类型数据只允许取值true和false,无null。

    boolean类型不可以转换为其它的数据类型。

8.运算符

1.算数运算符 

在这里插入图片描述

 自增(自减)运算符:+ +,– –

例:a++:先赋值后运算

int a = 1;
int b = a++;
System.out.print(a);//a=2
System.out.print(b);//b=1

例:++a:先运算后赋值

int a = 1;
int b = ++a;
System.out.print(a);//a=2
System.out.print(b);//b=2

2.赋值运算符

在这里插入图片描述

3.比较运算符(关系运算符)

在这里插入图片描述注意: /和%的区别:两个数注意: /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。
整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。

4.逻辑运算符

在这里插入图片描述

“&”和“&&”的区别

单&时,左边无论真假,右边都进行运算;

双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

“|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。

//定义变量
int i = 10; 
int j = 20; 
int k = 30;
//& “与”,并且的关系,只要表达式中有一个值为false,结果即为false
System.out.println((i > j) & (i> k)); //false & false,输出false 
System.out.println((i < j) & (i> k)); //true & false,输出false false 
System.out.println((i > j) & (i< k)); //false & true,输出
System.out.println((i < j) & (i< k)); //true & true,输出true
System.out.println("--------");

//| “或”,或者的关系,只要表达式中有一个值为true,结果即为true
System.out.println((i > j) | (i> k)); //false | false,输出false 
System.out.println((i < j) | (i> k)); //true | false,输出true
System.out.println((i > j) | (i< k)); //false | true,输出true
System.out.println((i < j) | (i< k)); //true | true,输出true
System.out.println("--------");


//^ “异或”,相同为false,不同为true
System.out.println((i > j) ^ (i > k)); //false ^ false,输出false
System.out.println((i < j) ^ (i > k)); //true ^ false,输出true
System.out.println((i > j) ^ (i < k)); //false ^ true,输出true
System.out.println((i < j) ^ (i < k)); //true ^ true,输出false
System.out.println("--------");
//! “非”,取反
System.out.println((i > j)); //false
System.out.println(!(i > j)); //!false,输出true
   

5.三元运算符

三元运算符语法格式:

关系表达式 ? 表达式1 : 表达式2;

 解释:问号前面的位置是判断的条件,判断结果为boolean型,为true时调用表达式1,为false时调用表达式2。其逻辑为:如果条件表达式成立或者满足则执行表达式1,否则执行第二个。

int a = 10;
int b = 20;
int c = a > b ? a : b; // 判断 a>b 是否为真,如果为真取a的值,如果为假,取b的值

2.数据输入

可以通过 Scanner 类来获取用户的输入。使用步骤如下:
1、导包。Scanner 类在java.util包下,所以需要将该类导入。导包的语句需要定义在类的上面。

 import java.util.Scanner;

 2、创建Scanner对象。

Scanner sc = new Scanner(System.in);// 创建Scanner对象,sc表示变量名,其他均不可变

3、接收数据

int i = sc.nextInt(); // 表示将键盘录入的值作为int数返回。

nextInt();   // 读取结果为一个int类型数据,返回int值
nextFloat(); // 读取结果为float类型,返回float值
next();      // 读取结果为String类型,返回string类型
nextLine();  // 读取结果为String类型,返回string类型
  1. 在使用next()、nextInt()、nextFloat()等只读取一个元素的输入时,这些函数(或者方法)会将空格符或者回车符看做是读取结束,此时不会读取回车符空格符号
  2. 第1点中的意思就是 next()、nextInt()、nextFloat()不会读取上面的回车符号。(注意,正因为不会读取回车符号,从而导致上面输入的 ‘\n’ 会保留下来,如果后面有nextLine()需要读取下一行的数据,则会自动将该回车符赋给 nextLine() 读取,从而导致错误。)
  3. 而nextLine() 则是读取下一行的输入,以回车符’\n’结尾(只能以回车符结尾,并且会读取回车符号)。
import java.util.Scanner;

public class ScannerDemo {
	public static void main(String[] args) { //创建对象
		Scanner sc = new Scanner(System.in); //接收数据
		int x = sc.nextInt();
		//输出数据
        System.out.println("x:" + x);
    }
}

3.流程控制语句

结构化程序设计中规定的三种基本流程结构,分别为:顺序结构,分支结构,循环结构。

顺序结构

程序由上向下执行。

分支语句if-else在这里插入图片描述

import java.util.Scanner;

public class IfDemo03 {
	public static void main(String[] args) {
		System.out.println("开始");

		//需求:键盘录入一个星期数(1,2,...7),输出对应的星期一,星期二,...星期日
		Scanner sc = new Scanner(System.in);

		System.out.println("请输入一个星期数(1-7):");
		int week = sc.nextInt();

		if(week == 1) {
			System.out.println("星期一");
		} else if(week == 2) {
			System.out.println("星期二");
		} else if(week == 3) {
			System.out.println("星期三");
		} else if(week == 4) {
			System.out.println("星期四");
		} else if(week == 5) {
			System.out.println("星期五");
		} else if(week == 6) {
			System.out.println("星期六");
		} else {
			System.out.println("星期日");
		}

		System.out.println("结束");
	}
}

分支语句switch-case

  • 需求:一年有12个月,分属于春夏秋冬4个季节,键盘录入一个月份,请用程序实现判断该月份属于哪个季节,并输出。
  • 运行结果:

春:3、4、5
夏:6、7、8
秋:9、10、11
冬:1、2、12 

import java.util.Scanner;

public class SwitchTest {
	public static void main(String[] args) {
		//键盘录入月份数据,使用变量接收
		Scanner sc = new Scanner(System.in);

		System.out.println("请输入一个月份:");
		int month = sc.nextInt();

		//多情况判断,这里采用switch语句实现
		//在每种情况中,完成输出对应的季节
		/*
		switch(month) {
			case 1:
				System.out.println("冬季");
				break;
			case 2:
				System.out.println("冬季");
				//break;
			case 3:
				System.out.println("春季");
				break;
			case 4:
				System.out.println("春季");
				break;
			case 5:
				System.out.println("春季");
				break;
			case 6:
				System.out.println("夏季");
				break;
			case 7:
				System.out.println("夏季");
				break;
			case 8:
				System.out.println("夏季");
				break;
			case 9:
				System.out.println("秋季");
				break;
			case 10:
				System.out.println("秋季");
				break;
			case 11:
				System.out.println("秋季");
				break;
			case 12:
				System.out.println("冬季");
				break;
			default:
				System.out.println("你输入的月份有误");
				//break;
		}
		*/

		//case穿透
		switch(month) {
			case 1:
			case 2:
			case 12:
				System.out.println("冬季");
				break;
			case 3:
			case 4:
			case 5:
				System.out.println("春季");
				break;
			case 6:
			case 7:
			case 8:
				System.out.println("夏季");
				break;
			case 9:
			case 10:
			case 11:
				System.out.println("秋季");
				break;
			default:
				System.out.println("你输入的月份有误");
		}
	}
}
  • 注意:如果switch中得case,没有对应break的话,则会出现case穿透的现象。

 循环结构:for循环

public class ForLoop {
    public static void main(String args[]) {
        int result = 0;
        for (int i = 1; i <= 100; i++) {//1.初始化部分 2.循环条件部分 3.迭代部分
            result += i;//循环体部分
        }
        System.out.println("result=" + result);
    }
}

循环结构:while循环

public class WhileLoop {
    public static void main(String args[]) {
        int result = 0;
        int i = 1;//1.初始化部分
        while (i <= 100) {//循环条件
            result += i;//循环体部分
            i++;//迭代部分
        }
        System.out.println("result=" + result);
    }
}

循环结构:do-while循环

public class DoWhileLoop {
    public static void main(String args[]) {
        int result = 0, i = 1;//初始化部分
        do {
            result += i;//循环体部分
            i++;//迭代部分
        } while (i <= 100);//循环条件部分
            System.out.println("result=" + result);
        }
}

注意:while与do…while的区别

  1. while: 先判断 再执行 条件不成立 循环体 一遍都不执行
  2. do…while: 先执行 再判断 条件不成立 循环体 至少执行一遍

4.randon

Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能

使用步骤:

导入包

import java.util.Random;

创建对象

Random r = new Random();

产生随机数

int num = r.nextInt(10);

解释: 10代表的是一个范围,如果括号写10,产生的随机数就是0-9,括号写20,参数的随机数则是0-19
 

import java.util.Random;

public class RandomDemo {
	public static void main(String[] args) {
		//创建对象
		Random r = new Random();

		//用循环获取10个随机数
		for(int i=0; i<10; i++) {
			//获取随机数
			int number = r.nextInt(10);
			System.out.println("number:" + number);
		}

		//需求:获取一个1-100之间的随机数
		int x = r.nextInt(100) + 1;
		System.out.println(x);
	}
}

练习:猜数字

需求:

程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少?

当猜错的时候根据不同情况给出相应的提示

A. 如果猜的数字比真实数字大,提示你猜的数据大了

B. 如果猜的数字比真实数字小,提示你猜的数据小了

C. 如果猜的数字与真实数字相等,提示恭喜你猜中了

import java.util.Random;
import java.util.Scanner;

public class RandomTest {
	public static void main(String[] args) {
		//要完成猜数字的游戏,首先需要有一个要猜的数字,使用随机数生成该数字,范围1到100
		Random r = new Random();
		int number = r.nextInt(100) + 1;

		while(true) {
			//使用程序实现猜数字,每次均要输入猜测的数字值,需要使用键盘录入实现
			Scanner sc = new Scanner(System.in);

			System.out.println("请输入你要猜的数字:");
			int guessNumber = sc.nextInt();

			//比较输入的数字和系统产生的数据,需要使用分支语句。这里使用if..else..if..格式,根据不同情况进行猜测结果显示
			if(guessNumber > number) {
				System.out.println("你猜的数字" + guessNumber + "大了");
			} else if(guessNumber < number) {
				System.out.println("你猜的数字" + guessNumber + "小了");
			} else {
				System.out.println("恭喜你猜中了");
				break;
			}
		}
	}
}

5.数组

1.定义格式

​ 数据类型[] 数组名

int[] arr;        
double[] arr;      
char[] arr;

 2.初始化

1.静态初始化

  • 格式:

    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};

int[] arr = new int[]{1,2,3,4,5}; 
// 可以拆分 
int[] arr;
arr = new int[]{1,2,3,4,5};

 静态初始化省略格式(不能拆分)

数据类型[] 数组名 = {元素1,元素2,元素3…};

int[] arr = {1,2,3,4,5};

 2.动态初始化

 数组动态初始化就是只给定数组的长度,由系统给出默认初始化值

数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
  • new:为数组开辟内存空间

  • 3:代表数组的长度

  • 注意:数组有定长特性,长度一旦指定,不可更改。

二维数组初始化 

同一维数组一样,共有4总不同形式的定义方法:

int[][] array1 = new int[10][10];
int array2[][] = new int[10][10];
int array3[][] = { { 1, 1, 1 }, { 2, 2, 2 } };
int array4[][] = new int[][] { { 1, 1, 1 }, { 2, 2, 2 } };

 不定长二维数组

int[][] array = new int[3][];
array[0] = new int[1];
array[1] = new int[2];
array[2] = new int[3];

获取二维数组的长度

int length1 = array.length;
int length2 = array[0].length;
// 获取二维数组的第一维长度(3)
System.out.println(length1);
// 获取二维数组的第一维的第一个数组长度(1)
System.out.println(length2);

3.数组元素访问 

​ 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。

​ 这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[3];

        //输出数组名
        System.out.println(arr); //[I@880ec60

        //输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

4.内存分配

区域名称作用
寄存器给CPU使用,和我们开发无关。
本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区存储可以运行的class文件。
堆内存存储对象或者数组,new来创建的,都存储在堆内存。
方法栈方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

  单个数组的内存图

在这里插入图片描述

  多个数组的内存图

在这里插入图片描述

 多个数组指向相同内存图

在这里插入图片描述

5.数组常见的两个问题

1.索引越界

出现原因

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[3];
		System.out.println(arr[3]);
    }
}

数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。

程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。

  • 解决方案

    将错误的索引修改为正确的索引范围即可!

2.空指针异常

  • 出现原因
  • public class ArrayDemo {
        public static void main(String[] args) {
            int[] arr = new int[3];
    		//把null赋值给数组
            arr = null;
            System.out.println(arr[0]);
        }
    }
    

    arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

  • 解决方案

    给数组一个真正的堆内存空间引用即可!

练习:数组最值

  • 最大值获取:从数组的所有元素中找出最大值。

  • 实现思路:

    • 定义变量,保存数组0索引上的元素
    • 遍历数组,获取出数组中的每个元素
    • 将遍历到的元素和保存数组0索引上值的变量进行比较
    • 如果数组元素的值大于了变量的值,变量记录住新的值
    • 数组循环遍历结束,变量保存的就是数组中的最大值

public class ArrayTest02 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {12, 45, 98, 73, 60};

        //定义一个变量,用于保存最大值
        //取数组中第一个数据作为变量的初始值
        int max = arr[0];

        //与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中
        for(int x=1; x<arr.length; x++) {
            if(arr[x] > max) {
                max = arr[x];
            }
        }

        //循环结束后打印变量的值
        System.out.println("max:" + max);

    }
}

6.方法

​ 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集

  • 注意:
    • 方法必须先创建才可以使用,该过程成为方法定义
    • 方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用

1. 方法的定义和调用

方法名要见名知意。(驼峰命名方式)
方法名在标识符命名规范当中,要求首字母小写,后面每个单词首字母大写

无参数方法定义和调用

定义格式:

public static void 方法名 (   ) {
	// 方法体;
}

调用格式:

方法名();
  • 注意:

    ​ 方法必须先定义,后调用,否则程序将报错

在这里插入图片描述

  • 总结:每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间,方法内部代码调用完毕之后,会从栈内存中弹栈消失。

 无参数方法的练习

  • 需求:设计一个方法用于打印两个数中的较大数
  • 思路:
    • ①定义一个方法,用于打印两个数字中的较大数,例如getMax()
    • ②方法中定义两个变量,用于保存两个数字
    • ③使用分支语句分两种情况对两个数字的大小关系进行处理
    • ④在main()方法中调用定义好的方法 

public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法
        getMax();
    }

    //定义一个方法,用于打印两个数字中的较大数,例如getMax()
    public static void getMax() {
        //方法中定义两个变量,用于保存两个数字
        int a = 10;
        int b = 20;

        //使用分支语句分两种情况对两个数字的大小关系进行处理
        if(a > b) {
            System.out.println(a);
        } else {
            System.out.println(b);
        }
    }
}

 带参数方法定义和调用

定义格式:

参数:由数据类型和变量名组成 - 数据类型 变量名

参数范例:int a

public static void isEvenNumber(int number){
    ...
}
public static void getMax(int num1, int num2){
    ...
}

 注意:

方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错

方法定义时,多个参数之间使用逗号( ,)分隔

调用格式:

方法名(参数);

方法名(参数1,参数2);
isEvenNumber(10);

getMax(10,20);
  • 方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错

 形参和实参

  1. 形参:方法定义中的参数

​ 等同于变量定义格式,例如:int number

注意:形式参数列表中的每一个参数都是“局部变量”,方法结束之后内存释放

      2.实参:方法调用中的参数

​ 等同于使用变量或常量,例如: 10 number

带参数方法练习

需求:设计一个方法用于打印两个数中的较大数,数据来自于方法参数 
思路:
①定义一个方法,用于打印两个数字中的较大数,例如getMax()
②为方法定义两个参数,用于接收两个数字
③使用分支语句分两种情况对两个数字的大小关系进行处理
④在main()方法中调用定义好的方法(使用常量)
⑤在main()方法中调用定义好的方法(使用变量)

public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法(使用常量)
        getMax(10,20);
        //调用方法的时候,人家要几个,你就给几个,人家要什么类型的,你就给什么类型的
        //getMax(30);
        //getMax(10.0,20.0);

        //在main()方法中调用定义好的方法(使用变量)
        int a = 10;
        int b = 20;
        getMax(a, b);
    }

    //定义一个方法,用于打印两个数字中的较大数,例如getMax()
    //为方法定义两个参数,用于接收两个数字
    public static void getMax(int a, int b) {
        //使用分支语句分两种情况对两个数字的大小关系进行处理
        if(a > b) {
            System.out.println(a);
        } else {
            System.out.println(b);
        }
    }
}

2.带返回值方法的定义和调用

定义格式

public static 数据类型 方法名 ( 参数 ) { 
	return 数据 ;
}
public static boolean isEvenNumber( int number ) {           
	return true ;
}
public static int getMax( int a, int b ) {
	return  100 ;
}
  • 注意:
    • 方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错

调用格式

方法名 ( 参数 ) ;
数据类型 变量名 = 方法名 ( 参数 ) ;

isEvenNumber ( 5 ) ;
boolean  flag =  isEvenNumber ( 5 ); 
  • 注意:
    • 方法的返回值通常会使用变量接收,否则该返回值将无意义

带返回值方法练习 

需求:设计一个方法可以获取两个数的较大值,数据来自于参数

思路:

①定义一个方法,用于获取两个数字中的较大数
②使用分支语句分两种情况对两个数字的大小关系进行处理
③根据题设分别设置两种情况下对应的返回结果
④在main()方法中调用定义好的方法并使用变量保存
⑤在main()方法中调用定义好的方法并直接打印结果
 

public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法并使用变量保存
        int result = getMax(10,20);
        System.out.println(result);

        //在main()方法中调用定义好的方法并直接打印结果
        System.out.println(getMax(10,20));
    }

    //定义一个方法,用于获取两个数字中的较大数
    public static int getMax(int a, int b) {
        //使用分支语句分两种情况对两个数字的大小关系进行处理
        //根据题设分别设置两种情况下对应的返回结果
        if(a > b) {
            return a;
        } else {
            return b;
        }
    }
}

3.方法的注意事项

方法不能嵌套定义  

public class MethodDemo {
    public static void main(String[] args) {

    }

    public static void methodOne() {
		public static void methodTwo() {
       		// 这里会引发编译错误!!!
    	}
    }
}

void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据

public class MethodDemo {
    public static void main(String[] args) {

    }
    public static void methodTwo() {
        //return 100; 编译错误,因为没有具体返回值类型
        return;	
        //System.out.println(100); return语句后面不能跟数据或代码
    }
}

方法的通用格式

public static 返回值类型 方法名(参数) {
   方法体; 
   return 数据 ;
}

 4.方法的重载

方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载

  • 多个方法在同一个类中
  • 多个方法具有相同的方法名
  • 多个方法的参数不相同,类型不同或者数量不同
  • 注意:

    • 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
    • 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载

 正确范例:

public class MethodDemo {
	public static void fn(int a) {
    	//方法体
    }
    public static int fn(double a) {
    	//方法体
    }
}

public class MethodDemo {
	public static float fn(int a) {
    	//方法体
    }
    public static int fn(int a , int b) {
    	//方法体
    }
}

 错误范例:

public class MethodDemo {
	public static void fn(int a) {
    	//方法体
    }
    public static int fn(int a) { 	/*错误原因:重载与返回值无关*/
    	//方法体
    }
}

public class MethodDemo01 {
    public static void fn(int a) {
        //方法体
    }
} 
public class MethodDemo02 {
    public static int fn(double a) { /*错误原因:这是两个类的两个fn方法*/
        //方法体
    }
}

 方法重载练习

需求:使用方法重载的思想,设计比较两个整数是否相同的方法,兼容全整数类型(byte,short,int,long)

思路:

①定义比较两个数字的是否相同的方法compare()方法,参数选择两个int型参数
②定义对应的重载方法,变更对应的参数类型,参数变更为两个long型参数
③定义所有的重载方法,两个byte类型与两个short类型参数
④完成方法的调用,测试运行结果

public class MethodTest {
    public static void main(String[] args) {
        //调用方法
        System.out.println(compare(10, 20));
        System.out.println(compare((byte) 10, (byte) 20));
        System.out.println(compare((short) 10, (short) 20));
        System.out.println(compare(10L, 20L));
    }

    //int
    public static boolean compare(int a, int b) {
        System.out.println("int");
        return a == b;
    }

    //byte
    public static boolean compare(byte a, byte b) {
        System.out.println("byte");
        return a == b;
    }

    //short
    public static boolean compare(short a, short b) {
        System.out.println("short");
        return a == b;
    }

    //long
    public static boolean compare(long a, long b) {
        System.out.println("long");
        return a == b;
    }

}

 5.方法的参数传递

1 方法参数传递基本类型

public class ArgsDemo01 {
    public static void main(String[] args) {
        int number = 100;
        System.out.println("调用change方法前:" + number);//100
        change(number);
        System.out.println("调用change方法后:" + number);//100
    }

    public static void change(int number) {
        number = 200;
    }
}

  • 结论:

    • 基本数据类型的参数,形式参数的改变,不影响实际参数
  • 结论依据:

    • 每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失在这里插入图片描述

 2.方法参数传递引用类型

public class ArgsDemo02 {
    public static void main(String[] args) {
        int[] arr = {10, 20, 30};
        System.out.println("调用change方法前:" + arr[1]);
        change(arr);
        System.out.println("调用change方法后:" + arr[1]);
    }

    public static void change(int[] arr) {
        arr[1] = 200;
    }
}

  • 结论:

    • 对于引用类型的参数,形式参数的改变,影响实际参数的值
  • 结论依据:

    • 引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据也已经是改变后的结果

 在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值