Java基础语法
计算机基础
1.什么是二进制?
2.什么是字节?
3.命令提示符
Java语言基础
JRE和JDK、JVM
关键字和标识符
常量和变量
数据类型转换
运算符
程序流程
方法
Java基础语法
计算机基础
1.什么是二进制?
二进制数只包含0和1,每一个0或者1都是一个bit(位)。
我们常用的十进制如何转换成二进制:
2.什么是字节?
我们知道计算机中的数据都是由1或者0组成,每个0或1都是一个bit,每8个bit就是一个字节(byte)。
字节是数据存储的最小单位。
1 TB = 1024 GB---->1 GB = 1024 MB ---->1 MB = 1024 KB---->1 KB = 1024 B
3.命令提示符
启动:win+R
切换盘符: 盘符:
退出:exit
进入文件夹:cd+文件夹名称
查看目录:dir
清屏:cls
进入多级文件夹: cd+\IdeaProjects\javaBasic\java
返回上一层:cd…
返回根目录:cd </br>
Java语言基础
JRE和JDK、JVM
JRE(Java Runtime Enviroment),Java运行环境,如果只是需要在该计算机上运行Java应用,那么只需要安装JRE即可。
JDK(Java Development Kit),如果想要开发,就必须安装JDK。
特别注意:JDK安装路径最好不要有空格或者中文。
关键字和标识符
关键字的特点:
- 完全小写的字母
- 在增强版的记事本或者IDE中有特殊的颜色
标识符:自己命名的类名,方法名等。
命名规则:
- 由字母、数字、下划线、美元符号组成
- 不能由数字开头
- 不能是Java保留字
常量和变量
常量
什么是常量?
常量就是在程序运行期间,不会改变的量。
常量的分类
字符串常量:凡是用双引号括起来的都是字符串常量,例如:“abc”,“110”,“Hello”…
字符常量:凡是用单引号括起来的单个字符,就叫字符常量。例如:‘A’,‘a’,‘1’,‘张’
整型常量:直接写上的数字,没有小数点。例如:123,200,-23
浮点型常量:直接写上的数字,有小数点。例如:3.14,0.0
布尔常量:true或false
空常量:null。代表没有任何数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Demo01Const{ public static void main(String[] args){ // 字符串常量 System.out.println( "ABC" ); System.out.println( "" ); System.out.println( "XYZ" ); // 整数常量 System.out.println( 50 ); System.out.println(- 30 ); // 浮点常量 System.out.println( 3.14 ); System.out.println( 0.0 ); System.out.println(- 24.0 ); // 字符常量 System.out.println( 'A' ); System.out.println( 'a' ); //System.out.println('');单引号中间有且仅有一个字符,没有不行,编译出错 // 布尔常量 System.out.println( true ); System.out.println( false ); //空常量 null,不能直接打印 } } |
数据类型
数据类型分为两类:
- 基本数据类型:整型,浮点型,布尔型,字符型
- 引用数据类型:字符串,数组,类,接口,Lamda
基本数据类型:
整型:byte,short,int,long
浮点型:float,double
字符型:char
布尔型:boolean
基本数据类型注意事项:
1.字符串不是基本数据类型,而是引用类型。
2.浮点型可能是一个近似值,而不是精确值。
3.数据范围不一定与字节数相关,例如float的范围比long要广,但是它只占4个字节。
4.浮点数默认是double类型,要使用float类型,需要加上后缀F/f,但是建议使用F。
5.整数默认为int类型,要使用long类型,需要加上后缀L/l,但是建议使用L。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Demo01DataType{ public static void main(String[] args){ System.out.println( 1024 ); //默认是int类型 System.out.println( 3.14 ); //默认是double类型 //左边是long类型,右边是int类型,数据类型不一致,会发生数据转换, //int类型数据范围比long类型数据范围小,可以发生自动类型转换 long num1 = 10 ; System.out.println(num1); //左边是double类型,右边是float类型,数据类型不一致,可以发生数据类型转换 //float---->double float数据范围比double小,可以是发生自动类型转换 double num2 = 2 .5F; System.out.println(num2); //左边是float类型,右边是long类型,数据类型不一致,可以发生数据类型转换 //long---->float long类型数据范围比float类型小,可以发生自动类型转换 float num3 = 30L; System.out.println(num3); //30.0 } } |
变量
什么是变量?
就是在程序运行期间,会发生改变的量。
创建一个变量的格式
① 数据类型 变量名称;//创建一个变量
变量名称 = 数据值;//赋值,将右边的数据值,赋值给左边的变量
② 数据类型 变量名称 = 数据值;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | public class Demo02Variable{ public static void main(String[] args){ //使用格式①创建变量 int num1; num1= 1 ; System.out.println(num1); //改变变量当中的值 num1= 20 ; System.out.println(num1); //使用格式② int num2 = 5 ; System.out.println(num2); //byte num3 = 129; //System.out.println(num3); byte num3 = 64 ; System.out.println(num3); //64 short num4 = 400 ; System.out.println(num4); //400 long num5 = 3000000000L; System.out.println(num5); //3000000000 float num6 = 3 .2444F; System.out.println(num6); //3.2444 double num7 = 3.14 ; System.out.println(num7); //3.14 char ch1 = 'A' ; System.out.println(ch1); //A char ch2 = '2' ; System.out.println(ch2); //2 char ch3 = '我' ; System.out.println(ch3); //我 boolean b1 = true ; System.out.println(b1); //true b1 = false ; System.out.println(b1); //false boolean b2 = b1; System.out.println(b2); //false } } |
使用变量的注意事项
- 变量的命名不能重复。
- 在使用byte和short的时候要注意它们的范围,如果超出范围会编译错误。
- 在使用float和long类型时,注意要加后缀。
- 变量的使用不能超出其作用域。(作用域:就是从变量命名的地方开始,直到该变量直接所属的大括号结束为止)
- 没有进行赋值的变量不能直接使用。
- 可以直接定义多个变量,但是不建议使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Demo03VariableNotice{ public static void main(String[] args){ int num1 = 10 ; System.out.println(num1); //int num1 = 20;错误,变量名不能重复。 float num2 = 3 .14F; //如果不加F会产生错误。 System.out.println(num2); long num3 = 30000000000L; System.out.println(num3); //byte num4 = 128; 注意byte的范围是-128~127,不能超出范围 byte num4 = 12 ; System.out.println(num4); short num5 = 400 ; System.out.println(num5); //没有赋值的变量不能使用 //int num6; //System.out.println(num6); //此时还没有命名变量,无法使用。 //System.out.println(num6); int num6 = 2 ; System.out.println(num6); //可以这么使用,但是不建议。 int a = 10 ,b = 20 ,c = 30 ; System.out.println(a); System.out.println(b); System.out.println(c); } } |
数据类型转换
什么是数据类型转换?
当数据类型不一样时,就会发生数据类型转换。
数据类型转换的分类:
- 自动类型转换(隐式):
①特点:代码不需要进行处理,自动完成
②规则:数据范围由小到大
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Demo01DataType{ public static void main(String[] args){ System.out.println( 1024 ); //默认是int类型 System.out.println( 3.14 ); //默认是double类型 //左边是long类型,右边是int类型,数据类型不一致,会发生数据转换, //int类型数据范围比long类型数据范围小,可以发生自动类型转换 long num1 = 10 ; System.out.println(num1); //左边是double类型,右边是float类型,数据类型不一致,可以发生数据类型转换 //float---->double float数据范围比double小,可以是发生自动类型转换 double num2 = 2 .5F; System.out.println(num2); //左边是float类型,右边是long类型,数据类型不一致,可以发生数据类型转换 //long---->float long类型数据范围比float类型小,可以发生自动类型转换 float num3 = 30L; System.out.println(num3); //30.0 } } |
2.强制类型转换(显式):
①特点:代码需要进行格式处理,不能自动完成
②格式:数据类型 变量名称 = (范围小的类型)原本范围大的数据
注意事项:
- 强制类型转换有可能导致精度丢失、数据溢出等。
- byte、short、char类型都可以进行数学运算。
- byte、short、char类型在进行数学运算时,都被提升成了int类型,再进行计算。
- boolean类型不能进行数据转换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Demo02DataType{ public static void main(String[] args){ //左边是int类型,右边是long类型,会发生数据类型转换 //long---->int ,long类型范围比int类型大,不能发生自动类型转换,需要强制类型转换 //进行格式处理: 范围小的数据类型 范围小的变量名 = (范围小的数据类型)原本范围大的数据; int num =( int )100L; System.out.println(num); //左边是int类型,右边是long类型,会发生数据类型转换 //long--->int long比int范围要大,所以发生强制类型转换 //但是发生了数据溢出,因为int类型装不下6000000000 int num1 = ( int ) 6000000000L; System.out.println(num1); //1705032704 //float---->int 强制转换,发生精度丢失,这里不是四舍五入 int num2 = ( int ) 3 .99F; System.out.println(num2); //3 //我们都知道计算机底层都是二进制数,所以A也是以二进制数的形式来存储, char ch1 = 'A' ; System.out.println(ch1+ 1 ); //66 证明这里的'A'被当做65来进行运算 byte b1 = 40 ; byte b2 = 50 ; int result1 = b1+b2; //会报错,不兼容的类型。原因:就是第三个注意事项,当进行数学运算时,b1和b2都已经被提升成了int类型,左右两边类型不一致 //需要发生强制类型转换,所以把result1的类型转换成int System.out.println(result1); short s1 = 60 ; //short result2 = b1+s1; 同上,会报错,如果想要的结果是short类型,那么必须进行强制类型转换 short result2 =( short )(b1+s1); System.out.println(result2); } } |
ASCII码表
什么是ASCII码表?
ASCII:American Standard Code of Information Inchange 美国信息交换标准代码
还有Unicode表,就是数字和字符的对照关系表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Demo03DataTypeChar{ public static void main(String[] args){ char ch1 = '1' ; System.out.println(ch1+ 0 ); char ch2 = 'A' ; System.out.println(ch2+ 2 ); //67 //左边是int类型,右边是char类型,左右不一致,发生数据类型转换 //char---->int 范围小向范围大转换,自动转换,不需要强制类型转换 int num = 'c' ; System.out.println(num); //99 int ch3 = '中' ; System.out.println(ch3); //20013 } } |
运算符
什么是运算符?
就是进行特定操作的符号。
什么是表达式?
就是用运算符连接起来的式子。
四则运算符和加号的特定用法
四则运算符,+,-,*,/,%;其中包括加,减,乘,除,%代表取模,即取余数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Demo04Operator{ public static void main(String[] args){ System.out.println( 20 + 30 ); //50 int a = 10 ; int b = 20 ; //会先计算表达式的值,再进行打印 System.out.println(a-b); //-10 System.out.println(a* 10 ); //100 //除法,只看商 int result1 = 10 / 3 ; System.out.println(result1); //3 //如果想要获得余数,用取模运算 int x = 14 ; int y = 3 ; int result2 = x%y; System.out.println(result2); //2 //int + double ---->double + double ----->double double result3 = x + 2.5 ; System.out.println(result3); //16.5 } } |
"+"常见的三种用法:
- 正常的加法运算
- 对于char类型来说,在计算前会被提升为int类型
- 用于连接字符串(注意事项:任何数据类型和字符串相连接,都会变成字符串)
1 2 3 4 5 6 7 8 9 10 11 12 | public class Demo05Plus{ public static void main(String[] args){ String str1 = "Hello" ; System.out.println( "Hello" ); System.out.println( "Hello" + "World" ); //HelloWorld String str2 = "Java" ; //String + int --->String + String ---->String System.out.println(str1+ 20 ); //Java20 System.out.println(str1+ 20 + 30 ); //Java2030 System.out.println(str1+( 20 + 30 )); //Java50 } } |
自增、自减运算符
使用方式:++可以在前,也可以在后,例如:++n或者n++。
使用区别:
1.单独使用:++在前和在后没有任何区别,独自形成一个步骤(前提是不与任何其他操作混合)
2.混合使用:当混合使用时,++在前和在后有【重大区别】:
a.++在前时,变量立刻+1,然后再参与其他运算 【先加后用】
b.++在后时,变量首先按照原来的值参与其他运算,然后再+1 【先用后加】
注意事项:只有是变量才能使用自增、自减符号,常量无法使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public class Demo06Operator{ public static void main(String[] args){ //单独使用的情况,没有区别 int num1 = 10 ; ++num1; System.out.println(num1); //11 int num2 = 20 ; num2++; System.out.println(num2); //21 System.out.println( "==============================================================" ); //混合使用,例如与打印操作混合 int num3 = 30 ; System.out.println(++num3); //31 System.out.println(num3); //31 int num4 = 40 ; System.out.println(num4++); //40 System.out.println(num4); //41 System.out.println( "==============================================================" ); //和赋值操作混合 int num5 = 50 ; int result1 = num5++; System.out.println(result1); //50 System.out.println(num5); //51 int num6 = 60 ; int reuslt2 = --num6; System.out.println(reuslt2); //59 System.out.println(num6); //59 System.out.println( "==============================================================" ); int x = 10 ; int y = 20 ; int result = --x + y++; System.out.println(result); //29 System.out.println(x); //9 System.out.println(y); //21 //30++; //只有变量才能自增或自减,常量使用会编译报错。 } } |
赋值运算符
1.基本赋值运算符
就是=,代表把右边的数据值赋值给左边的变量
2.复合赋值运算符
+=: a += 5 相当于 a = a + 5;
-=: a -= 5 相当于 a = a - 5;
*=: a *= 5 相当于 a = a * 5;
/=: a /= 5 相当于 a = a / 5;
%=: a += 5 相当于 a = a % 5;
注意事项:
1.只有变量可以使用复合赋值运算,常量不可以使用。
2.复合赋值运算实际含有一个隐式的数据类型转换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Demo07Operator{ public static void main(String[] args){ int a = 10 ; a += 5 ; System.out.println(a); //15 int b = 13 ; b %= 4 ; System.out.println(b); //1 //复合赋值运算中隐含了一个强制类型转换 byte x = 12 ; //x += 5; //相当于 x = x + 5; // byte = byte + int ; //byte = int + int ; //byte = int ; //byte = (byte)int; x += 5 ; System.out.println(x); //17 } } |
比较运算符
比较运算符: > , < , >= , <= , == ,!=;
注意事项:
1.比较运算符的结果一定是boolean类型。
2.如果进行多次判断,不能像数学中连写,如1<x<3,这样会编译报错。
1 2 3 4 5 6 7 8 9 10 11 12 | public class Demo08Operator{ public static void main(String[] args){ int x = 10 ; int y = 20 ; System.out.println(x > y); //false System.out.println(x < y); //true; System.out.println(x >= 100 ); //false System.out.println(x <= 10 ); //true; System.out.println( 10 == 10 ); //true System.out.println( 20 != 20 ); //false } } |
逻辑运算符
与:&&;
或:||;
非:!;
与、或具有短路效果:就是根据左边的表达式已经能够判断出结果,那么后边的表达式将不再运行,节省性能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Demo09Logic{ public static void main(String[] args){ System.out.println( true && true ); //true System.out.println( true && false ); //false System.out.println( 3 < 4 && 10 < 100 ); //true System.out.println( true || true ); //true System.out.println( true || false ); //true System.out.println( false || false ); //false System.out.println(! true ); //false System.out.println(! false ); //true System.out.println( "======================" ); //短路效果: int a = 10 ; System.out.println( 3 > 4 && ++a > 1 ); //false System.out.println(a); //10 int b = 20 ; System.out.println( 3 < 4 || b++ > 1 ); //true System.out.println(b); //20 } } |
三元运算符
格式:
数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;
注意事项:
1.表达式A和表达式B必须同时满足左边的数据类型,否则编译报错。
2.三元运算符的结果必须被使用,要么赋值,要么打印等,不能独立存在
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Demo10Operator{ public static void main(String[] args){ int a = 10 ; int b = 20 ; int max = a > b ? a : b; System.out.println( "最大值是:" + max); //20 //注意事项1: //int max = 3 > 4 ? 2.5 : 10;//错误写法,必须同时满足左边的int类型 //注意事项2: System.out.println(a > b ? a : b); //正确写法 将会打印20 //a > b ? a : b;错误写法,编译报错 } } |
程序流程
顺序结构
1 2 3 4 5 6 7 8 9 10 | public class Demo02If{ public static void main(String[] args){ System.out.println( "今天我准备去网吧" ); int age = 17 ; if (age >= 18 ){ System.out.println( "年龄满18才能进入网吧" ); } System.out.println( "回家" ); } } |
1 2 3 4 5 6 7 8 9 10 | public class Demo03IfElse{ public static void main(String[] args){ int age = 20 ; if (age >= 18 ){ System.out.println( "可以进入网吧" ); } else { System.out.println( "不能进入网吧" ); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Demo04IfElseExt{ public static void main(String[] args){ int x = 15 ; int y; if (x >= 3 ){ y = 2 *x+ 1 ; } else if (- 1 < x && x < 3 ){ y = 2 *x; } else { y = 2 *x- 1 ; } System.out.println( "结果是" + y); } } |
4.标准的switch语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public class Demo07Switch{ public static void main(String[] args){ int num = 4 ; switch (num){ 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 ; default : System.out.println( "数据不合理" ); break ; //不写这个break不会报错,但是强烈建议写上。 } } } |
switch case注意事项:
①case后面的数值不能重复
②case后面可以是基本类型也可以是引用类型:
基本类型:byte,short,char,int
引用类型: String,enum
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Demo08SwitchNotice{ public static void main(String[] args){ int num = 3 ; switch (num){ case 2 : System.out.println( "BBB" ); break ; case 3 : System.out.println( "AAA" ); case 1 : System.out.println( "CCC" ); break ; default : System.out.println( "DDD" ); break ; } System.out.println( "具有穿透功能的switch" ); } } |
循环结构
1.for循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* 循环结构: for循环 for(初始化语句①;条件判断②;步进语句④){ 循环体③ } */ public class Demo09For{ public static void main(String[] args){ for ( int i= 1 ;i<= 100 ;i++){ System.out.println( "我错了!请原谅我把!" +i); } } } |
2.while循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /* while循环: 标准格式: while(条件判断){ 循环体 } 扩展格式: 初始化语句; while(条件判断){ 循环体; 步进语句; } */ public class Demo10While{ public static void main(String[] args){ int i = 1 ; while (i<= 10 ){ System.out.println( "我错了!" + i ); i++; } } } |
3.do-while循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /* doWhile循环 do{ 循环体 步进语句 }while(条件判断) dowhile循环一上来就先执行一次do里面的内容,再进行条件判断是否继续循环 */ public class Demo11DoWhile{ public static void main(String[] args){ int i = 1 ; do { System.out.println( "起来吧,原谅你了" ); i++; } while (i <= 10 ); } } |
4.条件控制语句
break:
①在switch语句中使用,一旦执行,整个switch将被打断
②在循环中使用,一旦执行,整个循环被打断
1 2 3 4 5 6 7 8 9 10 | public class Demo13Break{ public static void main(String[] args){ for ( int i= 1 ;i<= 10 ;i++){ if (i== 4 ){ break ; } System.out.println( "hello" +i); } } } |
continue:
在循环中使用,一旦执行,表示跳出当次循环,继续下一次循环
1 2 3 4 5 6 7 8 9 | public class Demo14Continue{ public static void main(String[] args){ for ( int i = 1 ;i <= 10 ;i++){ if (i == 4 ){ continue ; } System.out.println(i+ "层到了" ); } } |
break和continue的区别:
break是打断,终止整个循环结构,执行break后将不再执行任何循环体内容。
continue是跳出当次循环,继续下一次循环,执行continue后,循环还可以继续。
5.死循环
1 2 3 4 5 6 7 8 | public class Demo15DeadLoop{ public static void main(String[] args){ while ( true ){ System.out.println( "I love Java!" ); } //System.out.println("hello");这是错误写法,循环不结束,这句话不会执行,会编译报错 } } |
6.循环嵌套
1 2 3 4 5 6 7 8 9 | public class Demo16LoopHourAndMinute { public static void main(String[] args){ for ( int hour = 0 ;hour < 24 ;hour++){ for ( int minute = 1 ;minute < 60 ;minute++){ System.out.println( hour + "点" + minute + "分" ); } } } } |
方法
1.方法的定义
定义格式:
public static void 方法名称() {
方法体
}
调用格式:方法名称();
注意事项:
- 方法定义的先后顺序无所谓。
- 方法定义必须是挨着的,不能在一个方法的内部定义另外一个方法。
- 方法定义之后,自己不会执行的;如果希望执行,一定要进行方法的调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Demo01Method { public static void main(String[] args) { printMethod(); } public static void printMethod() { for ( int j = 0 ; j < 5 ; j++) { for ( int i = 0 ; i < 20 ; i++) { System.out.print( "*" ); } System.out.println(); } } } |
2.方法
方法其实就是若干语句的功能集合。
方法好比是一个工厂。
蒙牛工厂 原料:奶牛、饲料、水
产出物:奶制品
钢铁工厂 原料:铁矿石、煤炭
产出物:钢铁建材
参数(原料):就是进入方法的数据。
返回值(产出物):就是从方法中出来的数据。
定义方法的完整格式:
修饰符 返回值类型 方法名称(参数类型 参数名称, …) {
方法体
return 返回值;
}
修饰符:现阶段的固定写法,public static
返回值类型:也就是方法最终产生的数据结果是什么类型
方法名称:方法的名字,规则和变量一样,小驼峰
参数类型:进入方法的数据是什么类型
参数名称:进入方法的数据对应的变量名称
PS:参数如果有多个,使用逗号进行分隔
方法体:方法需要做的事情,若干行代码
return:两个作用,第一停止当前方法,第二将后面的返回值还给调用处
返回值:也就是方法执行后最终产生的数据结果
注意:return后面的“返回值”,必须和方法名称前面的“返回值类型”,保持对应。
定义一个两个int数字相加的方法。三要素:
返回值类型:int
方法名称:sum
参数列表:int a, int b
方法的三种调用格式。
- 单独调用:方法名称(参数);
- 打印调用:System.out.println(方法名称(参数));
- 赋值调用:数据类型 变量名称 = 方法名称(参数);
注意:此前学习的方法,返回值类型固定写为void,这种方法只能够单独调用,不能进行打印调用或者赋值调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Demo02MethodDefine { public static void main(String[] args) { // 单独调用 sum( 10 , 20 ); System.out.println( "===========" ); // 打印调用 System.out.println(sum( 10 , 20 )); // 30 System.out.println( "===========" ); // 赋值调用 int number = sum( 15 , 25 ); number += 100 ; System.out.println( "变量的值:" + number); // 140 } public static int sum( int a, int b) { System.out.println( "方法执行啦!" ); int result = a + b; return result; } } |
3.方法的参数
有参数:小括号当中有内容,当一个方法需要一些数据条件,才能完成任务的时候,就是有参数。
例如两个数字相加,必须知道两个数字是各自多少,才能相加。
无参数:小括号当中留空。一个方法不需要任何数据条件,自己就能独立完成任务,就是无参数。
例如定义一个方法,打印固定10次HelloWorld。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Demo03MethodParam { public static void main(String[] args) { method1( 10 , 20 ); System.out.println( "==============" ); method2(); } // 两个数字相乘,做乘法,必须知道两个数字各自是多少,否则无法进行计算 // 有参数 public static void method1( int a, int b) { int result = a * b; System.out.println( "结果是:" + result); } // 例如打印输出固定10次文本字符串 public static void method2() { for ( int i = 0 ; i < 10 ; i++) { System.out.println( "Hello, World!" + i); } } } |
4.return语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | /* 题目要求:定义一个方法,用来【求出】两个数字之和。(你帮我算,算完之后把结果告诉我。) 题目变形:定义一个方法,用来【打印】两个数字之和。(你来计算,算完之后你自己负责显示结果,不用告诉我。) 注意事项: 对于有返回值的方法,可以使用单独调用、打印调用或者赋值调用。 但是对于无返回值的方法,只能使用单独调用,不能使用打印调用或者赋值调用。 */ public class Demo04MethodReturn { public static void main(String[] args) { // 我是main方法,我来调用你。 // 我调用你,你来帮我计算一下,算完了之后,把结果告诉我的num变量 int num = getSum( 10 , 20 ); System.out.println( "返回值是:" + num); System.out.println( "==============" ); printSum( 100 , 200 ); System.out.println( "==============" ); System.out.println(getSum( 2 , 3 )); // 正确写法 getSum( 3 , 5 ); // 正确写法,但是返回值没有用到 System.out.println( "==============" ); // 对于void没有返回值的方法,只能单独,不能打印或者赋值 // System.out.println(printSum(2, 3)); // 错误写法! // System.out.println(void); // int num2 = printSum(10, 20); // 错误写法! // int num3 = void; // void num4 = void; } // 我是一个方法,我负责两个数字相加。 // 我有返回值int,谁调用我,我就把计算结果告诉谁 public static int getSum( int a, int b) { int result = a + b; return result; } // 我是一个方法,我负责两个数字相加。 // 我没有返回值,不会把结果告诉任何人,而是我自己进行打印输出。 public static void printSum( int a, int b) { int result = a + b; System.out.println( "结果是:" + result); } } |
5.使用方法时注意事项
- 方法应该定义在类当中,但是不能在方法当中再定义方法。不能嵌套。
- 方法定义的前后顺序无所谓。
- 方法定义之后不会执行,如果希望执行,一定要调用:单独调用、打印调用、赋值调用。
- 如果方法有返回值,那么必须写上“return 返回值;”,不能没有。
- return后面的返回值数据,必须和方法的返回值类型,对应起来。
- 对于一个void没有返回值的方法,不能写return后面的返回值,只能写return自己。
- 对于void方法当中最后一行的return可以省略不写。
- 一个方法当中可以有多个return语句,但是必须保证同时只有一个会被执行到,两个return不能连写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Demo04MethodNotice { public static int method1() { return 10 ; } public static void method2() { // return 10; // 错误的写法!方法没有返回值,return后面就不能写返回值。 return ; // 没有返回值,只是结束方法的执行而已。 } public static void method3() { System.out.println( "AAA" ); System.out.println( "BBB" ); // return; // 最后一行的return可以省略不写。 } public static int getMax( int a, int b) { /*int max; if (a > b) { max = a; } else { max = b; } return max;*/ if (a > b) { return a; } else { return b; } } } |
方法的重载
什么是方法的重载?
多个方法的名称一样,但是数据列表不一样。
方法的重载和下列因素有关:
1.和参数个数有关。
2.和多种参数的顺序有关。
3.和参数类型有关。
方法的重载和下列因数无关:
1.和参数的名称无关。
2.和返回值类型无关。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public class Demo01MethodOverload { public static void main(String[] args) { System.out.println(sum( 10 , 20 )); System.out.println(sum( 10 , 20 , 30 )); System.out.println(sum( 10 , 20 , 30 , 40 )); } public static int sum( int a, int b){ return a + b; } //与参数的名称无关 // public static int sum(int x , int y){ // return x + y; // } //与返回值类型无关 // public static double sum(double a , double b){ // return a + b; // } //与参数类型有关 public static int sum( double a , double b){ return ( int )(a + b); } //与多个不同类型参数的顺序有关 public static int sum( double a, int b){ return ( int )(a + b); } public static int sum( int a , double b){ return ( int )(a + b); } public static int sum( int a, int b, int c){ return a + b + c; } public static int sum( int a, int b, int c, int d){ return a + b + c + d; } } |
数组
什么是数组?
数组是一个容器,用来存储同一类型的数据。
数组的特点:
1.数组是一种引用类型数据。
2.数组中的数据是属于同一种类型。
3.数组的长度不可改变。
定义一个数组有两种常见的方式:
1.动态初始化数组(指定长度):
数据类型[] 数组名称 = new 数据类型[数组长度];
1 2 3 4 5 6 7 8 9 10 | public class Demo01Array { public static void main(String[] args) { //创建一个长度为10的int类型数组 int [] arr1 = new int [ 10 ]; //创建一个长度为20的double类型数组 double [] arr2 = new double [ 20 ]; //创建一个长度为5的String类型数组 String[] arr3 = new String[ 5 ]; } } |
2.静态初始化数组(指定内容):
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,…};
1 2 3 4 5 6 7 8 | public class Demo02Array { public static void main(String[] args) { //创建一个数组,是int类型数据,里面装 5,10,15 int [] arr1 = new int []{ 5 , 10 , 15 }; //创建一个数组,里面装String类型数据,里面装"Hello" ,"World" ,"Java" String[] arr2 = new String[]{ "Hello" , "World" , "Java" }; } } |
静态初始化数组的省略格式:
数据类型[] 数组名称 = {元素1,元素2,…};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Demo03Array { public static void main(String[] args) { //省略格式创建一个给int数组,使用省略格式,里面是5,6,7 int [] arr1 = { 5 , 6 , 7 }; //静态初始化的标准格式可以拆分为两个步骤 int [] arr2; arr2 = new int []{ 5 , 6 , 7 }; //动态初始化也可以拆分为两个步骤 int [] arr3; arr3 = new int [ 10 ]; //静态初始化一旦使用省略格式,不能再拆分为两个步骤 // int[] arr4; // arr4 = {5,6,7};//编译报错,这种格式不被允许 } } |
Java中内存划分为5个部分:
1.栈(Stack):存储局部变量,方法的运行在栈中。
2.堆(Heap):凡是new出来的东西,都在堆中。
3.方法区:存储.class文件中的信息,包含方法信息。
4.本地方法栈:和操作系统有关。
5.寄存器:和CPU有关。
Java中数组的内存图:
1.一个数组的内存图:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Demo01ArrayOne { public static void main(String[] args) { int [] arr1 = new int [ 3 ]; System.out.println(arr1[ 0 ]); System.out.println(arr1[ 1 ]); System.out.println(arr1[ 2 ]); arr1[ 1 ] = 10 ; arr1[ 2 ] = 20 ; System.out.println(arr1[ 0 ]); System.out.println(arr1[ 1 ]); System.out.println(arr1[ 2 ]); } } |
2.两个数组的内存图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Demo02ArrayTwo { public static void main(String[] args) { int [] arrA = new int [ 3 ]; System.out.println(arrA[ 0 ]); System.out.println(arrA[ 1 ]); System.out.println(arrA[ 2 ]); arrA[ 1 ] = 10 ; arrA[ 2 ] = 20 ; System.out.println(arrA[ 0 ]); System.out.println(arrA[ 1 ]); System.out.println(arrA[ 2 ]); System.out.println( "==================" ); int [] arrB = new int [ 3 ]; System.out.println(arrB[ 0 ]); System.out.println(arrB[ 1 ]); System.out.println(arrB[ 2 ]); arrB[ 1 ] = 10 ; arrB[ 2 ] = 20 ; System.out.println(arrB[ 0 ]); System.out.println(arrB[ 1 ]); System.out.println(arrB[ 2 ]); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class Demo03ArraySame { public static void main(String[] args) { int [] arrA = new int [ 3 ]; System.out.println(arrA[ 0 ]); //0 System.out.println(arrA[ 1 ]); //0 System.out.println(arrA[ 2 ]); //0 arrA[ 1 ] = 10 ; arrA[ 2 ] = 20 ; System.out.println(arrA[ 0 ]); //0 System.out.println(arrA[ 1 ]); //10 System.out.println(arrA[ 2 ]); //20 System.out.println( "==============" ); int [] arrB = arrA; System.out.println(arrB[ 0 ]); //0 System.out.println(arrB[ 1 ]); //10 System.out.println(arrB[ 2 ]); //20 arrB[ 1 ] = 100 ; arrB[ 2 ] = 200 ; System.out.println(arrB[ 0 ]); //0 System.out.println(arrB[ 1 ]); //100 System.out.println(arrB[ 2 ]); //200 System.out.println( "==============" ); } } |
数组的两种常见问题:
1.数组索引越界异常:访问数组元素时,索引编号不存在,那么将会发生数据索引越界异常。ArrayIdexOutOfBoundsException
原因:索引值不正确。
解决办法:修改索引值。
1 2 3 4 5 6 7 8 9 10 | public class Demo01ArrayIndexOutOfBoundsException { public static void main(String[] args) { int [] arr = { 15 , 25 , 35 }; System.out.println(arr[ 0 ]); System.out.println(arr[ 1 ]); System.out.println(arr[ 2 ]); //错误写法,会引发数组索引越界异常 System.out.println(arr[ 3 ]); } } |
2.空指针异常:如果没有对数组进行初始化,访问元素的时候,会产生空指针异常。NullPointerException
原因:没有对数组进行初始化,数组是null值。
解决办法:对数组进行初始化。
1 2 3 4 5 6 7 | public class Demo02NullPointerException { public static void main(String[] args) { int [] arr = null ; //arr = new int[3]; System.out.println(arr[ 0 ]); } } |
数组的长度:
获取数组的长度通过其length属性,即可获得。
int length = arr.length;
注意事项:
数组一旦创建,其长度是不可变的。
1 2 3 4 5 6 7 8 9 10 11 | public class Demo03ArrayLength { public static void main(String[] args) { //创建一个长度为3的数组 int [] arr = new int [ 3 ]; System.out.println(arr.length); //这里并不是数组的长度由3变成5,而是又创建了一个 // 长度为5的数组,变量arr的地址值发生了改变。 arr = new int [ 5 ]; System.out.println(arr.length); } } |
遍历数组:对数组中每一个元素进行逐个处理。
1 2 3 4 5 6 7 8 | public class Demo04Array { public static void main(String[] args) { int [] arr = { 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 14 , 15 , 123 , 144 , 234 , 56 , 43 , 21 , 78 , 82 , 22 }; for ( int i = 0 ; i < arr.length; i++) { System.out.println(arr[i]); } } } |
练习:
1.求出数组中的最大值:
1 2 3 4 5 6 7 8 9 10 11 12 | public class Demo05ArrayMax { public static void main(String[] args) { int [] arr = { 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 14 , 15 , 123 , 144 , 234 , 56 , 43 , 21 , 78 , 82 , 22 }; int max = arr[ 0 ]; for ( int i = 1 ; i < arr.length; i++) { if (arr[i]>max){ max = arr[i]; } } System.out.println( "最大值是:" + max ); } } |
2.求出数组中的最小值:
1 2 3 4 5 6 7 8 9 10 11 12 | public class Demo06ArrayMin { public static void main(String[] args) { int [] arr = { 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 14 , 15 , 123 , 144 , 234 , 56 , 43 , 21 , 78 , 82 , 22 }; int min = arr[ 0 ]; for ( int i = 1 ; i < arr.length; i++) { if (arr[i]<min){ min = arr[i]; } } System.out.println( "最小值是:" + min ); } } |
3.数组的反转:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /* * 数组的反转: * 本来的样子:[1,2,3,4] * 反转的样子:[4,3,2,1] * 不能使用新的数组 * * 思路: * 1.数组的反转是两个对称位置的数据交换 * 2.需要两个索引,min和max * 3.需要一个临时变量 * 4.条件判断,当min小于max时才交换,否则不交换 * */ public class Demo07ArrayReverse { public static void main(String[] args) { int [] arr = { 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 14 , 15 , 123 , 144 , 234 , 56 , 43 , 21 , 78 , 82 , 22 }; //遍历原来的数组 for ( int i = 0 ; i < arr.length; i++) { System.out.print(arr[i]+ " " ); } System.out.println(); //反转 for ( int min= 0 ,max = arr.length- 1 ; min < max ; min++ , max-- ){ int temp = arr[min]; arr[min] = arr[max]; arr[max] = temp; } //遍历新的数组 for ( int i = 0 ; i < arr.length; i++) { System.out.print(arr[i]+ " " ); } } } |
数组也可以作为方法的参数:
当调用方法的时候,向小括号传参,事实上传递的是数组在堆内存中的地址值。
数组也可以作为方法的返回值:
其实返回的也是数组在堆内存中的地址值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class Demo01ArrayParam { public static void main(String[] args) { int [] arr = { 10 , 20 , 30 }; myPrint(arr); int [] result = sumAndAvg(arr); System.out.println(result); myPrint(result); } public static void myPrint( int [] arr){ //事实上传递的是地址值 System.out.println(arr); for ( int i = 0 ; i < arr.length; i++) { System.out.println(arr[i]); } } public static int [] sumAndAvg( int [] arr){ int [] arr1 = null ; int sum = 0 ; for ( int i = 0 ; i < arr.length; i++) { sum += arr[i]; } int avg = sum / arr.length; arr1 = new int []{sum , avg}; return arr1; } } |