目录
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;
- char类型的数据转换为int类型是按照码表中对应的int值进行计算的。比如在ASCII码表中,'a’对应97。
int a = 'a'; System.out.println(a); // 将输出97
- 整数默认是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.赋值运算符
注意: /和%的区别:两个数注意: /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。
整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
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类型
- 在使用next()、nextInt()、nextFloat()等只读取一个元素的输入时,这些函数(或者方法)会将空格符或者回车符看做是读取结束,此时不会读取回车符和空格符号。
- 第1点中的意思就是 next()、nextInt()、nextFloat()不会读取上面的回车符号。(注意,正因为不会读取回车符号,从而导致上面输入的 ‘\n’ 会保留下来,如果后面有nextLine()需要读取下一行的数据,则会自动将该回车符赋给 nextLine() 读取,从而导致错误。)
- 而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的区别
- while: 先判断 再执行 条件不成立 循环体 一遍都不执行
- 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);
- 方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错
形参和实参
- 形参:方法定义中的参数
等同于变量定义格式,例如: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;
}
}
-
结论:
- 对于引用类型的参数,形式参数的改变,影响实际参数的值
-
结论依据:
- 引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据也已经是改变后的结果