目录
开发环境
- 编译器
编译.java源文件 生成.class字节码文件
- 运行期
JVM运行,class源文件
名词
- JVM java的虚拟机 加载并运行.class字节码文件
- JRE 包含了JVM 和系统类库(小零件)是java最小运行环境
- JDK 包含了JRE 和 开发的命令工具 是开发java的最小环境
开发工具
- idea
JetBrains公司的,分为社区版(免费的)和终级版(收费的)
文档的注释
// 单行注释
/* 多行注释 */
/** 文本注释 */
运行时 不被执行
变量
int a; //声明一个整型的变量,名为a
int b,c,d; //声明三个整型的变量,名为b,c,d
//int a; //编译错误,变量不能同名
- 命名规则
- 只能是数字 _&和字母 并且不能用数字开头
- 可以始终中文但是不建议 不能使用拼音
- 建议使用英文的"见名知意"
- 建议使用小驼峰法则(第一个单词字母小写其余大写)
八大基本数据类型
- byte 短整数型 一个字节 范围 -128~127
- short 短整形型 两个字节范围-32768~32767
- int 整形 四个字节 默认数据类型 范围-2^31 - 2^31-1
//1)int:整型,4个字节,-21个多亿到21个多亿
int a = 25; //25称为整数直接量,默认int类型
//int b = 10000000000; //编译错误,100亿默认为int类型,但超出int范围了
//int c = 3.14; //编译错误,整型变量中只能装整数
System.out.println(5/2); //2
System.out.println(2/5); //0
System.out.println(5/2.0); //2.5
int d = 2147483647; //int的最大值
d = d+1;
System.out.println(d); //-2147483648(int最小值),发生溢出了,溢出是需要避免的
- long 长整形 八个字节 范围-2^61 - 2^61-1
//2)long:长整型,8个字节,很大很大很大
long a = 25L; //25L为长整型直接量
//long b = 10000000000; //编译错误,100亿默认为int类型,但超出int范围了
long c = 10000000000L; //100L为长整型直接量
//long d = 3.14; //编译错误,长整型变量只能装整数
//运算时若有可能溢出,建议在第1个数字后加L
long e = 1000000000*2*10L;
System.out.println(e); //200亿
long f = 1000000000*3*10L;
System.out.println(f); //不是300亿
long g = 1000000000L*3*10;
System.out.println(g); //300亿
- flort 单浮点数 四个字节 不能表示精确数据 运算数有误差
- duoble 双浮点数 八个字节
//3)double:浮点型,8个字节,很大很大很大
double a = 3.14; //3.14为浮点数直接量,默认double型
float b = 3.14F; //3.14F为float型直接量
double c = 1234000000000000000000000000000000.0;
System.out.println(c); //1.234E33,科学计数法表示,相当于1.234*(10的33次幂)
double d=3.0,e=2.9;
System.out.println(d-e); //0.10000000000000009,有可能会发生舍入误差,精确场合不能使用
- char 字节型 采用Unicden编码格式 一个字节 范围 65535 A-65 a-97 0-48
//4)boolean:布尔型,1个字节
boolean a = true; //true为布尔型直接量-----真
boolean b = false; //false为布尔型直接量----假
//boolean c = 250; //编译错误,布尔型只能赋值为true或false
- boolean 布尔型 一个字节 存储 true false
//5)char:字符型,2个字节
char c1 = '女'; //字符女
char c2 = 'f'; //字符f
char c3 = '6'; //字符6
char c4 = ' '; //空格符
//char c5 = 女; //编译错误,字符型直接量必须放在单引号中
//char c6 = ''; //编译错误,必须有字符
//char c7 = '女性'; //编译错误,只能有1个字符
char c8 = 65; //0到65535之间
System.out.println(c8); //println输出时会依据c8的数据类型显示
//若c8为char型,则显示字符
//若c8为int型,则显示数字
char c9 = '\\';
System.out.println(c9); //\
数据类型的转换
- byte----short( char----)----int----long----float----double
- 从大到小 自动转(隐式转换)
从小到大强转 在数据类型前面加(数据类型) 强转时 发生精度丢失 预防溢出问题
int a = 5;
long b = a; //自动类型转换
int c = (int)b; //强制类型转换
long d = 5; //自动类型转换
double e = 5; //自动类型转换
long f = 10000000000L;
int g = (int)f; //强制类型转换
System.out.println(g); //1410065408,强转有可能发生溢出
double h = 25.987;
int i = (int)h; //强制类型转换
System.out.println(i); //25,强转有可能丢失精度
- 两点规则
整数直接量可以直接赋值给byte,short,char,但不能超出范围
byte,short,char型数据参与运算时,系统会将其自动转换为int
byte b1 = 5; //byte的范围为-128到127之间
byte b2 = 6;
byte b3 = (byte)(b1+b2);
System.out.println(2+2); //4
System.out.println(2+'2'); //52,2加上'2'的码50
System.out.println('2'+'2'); //100,'2'的码50,加上'2'的码50
运算符号
- 算术:+、-、*、/、%、++、--
//%的演示
System.out.println(8%2); //0,商4余0----整除
System.out.println(5%2); //1,商2余1
System.out.println(2%8); //2,商0余2
//++单独使用:
int a=5,b=5;
a++; //相当于a=a+1
++b; //相当于b=b+1
System.out.println(a); //6
System.out.println(b); //6
//++被使用:
int a=5,b=5;
int c = a++; //1)保存a++的值5 2)a自增1变为6 3)将第1步保存的值5赋值给c--底层运算过程
//---粗暴记法:a++的值为5,c就是5
int d = ++b; //1)保存++b的值6 2)b自增1变为6 3)将第1步保存的值6赋值给d--底层运算过程
//---粗暴记法:++b的值为6,d就是6
System.out.println(a); //6
System.out.println(b); //6
System.out.println(c); //5
System.out.println(d); //6
//--单独使用:
int a=5,b=5;
a--; //相当于a=a-1
--b; //相当于b=b-1
System.out.println(a); //4
System.out.println(b); //4
//--被使用:
int a=5,b=5;
int c = a--; //a--的值为5,所以c的值为5
int d = --b; //--b的值为4,所以d的值为4
System.out.println(a); //4
System.out.println(b); //4
System.out.println(c); //5
System.out.println(d); //4
- 关系:>、<、>=、<=、==、!=
int a=5,b=10,c=5;
boolean b1 = a>b;
System.out.println(b1); //false
System.out.println(c<b); //true
System.out.println(a>=c); //true
System.out.println(a<=b); //true
System.out.println(a==c); //true
System.out.println(a!=c); //false
System.out.println(a+c>b); //false
System.out.println(a%2==0); //false
System.out.println(c++>5); //false-------c自增1变为6
System.out.println(c++>5); //true--------c自增1变为7
- 逻辑:&&、||、!
int a=5,b=10,c=5;
//&&的演示:
boolean b1 = b>=a && b<c;
System.out.println(b1); //true&&false=false
System.out.println(b<=c && b>a); //false&&true=false
System.out.println(a==b && c>b); //false&&false=false
System.out.println(b!=c && a<b); //true&&true=true
int age = 25;
System.out.println(age>=18 && age<=50); //看age是否在18到50之间
//||的演示:
System.out.println(b>=a || b<c); //true||false=true
System.out.println(b<=c || b>a); //false||true=true
System.out.println(b!=c || a<b); //true||true=true
System.out.println(a==b || c>b); //false||false=false
int score = 89;
System.out.println(score<0 || score>100); //看score是否不合法
//!的演示
boolean b2 = !(a<b);
System.out.println(b2); //!true=false
System.out.println(!(a>b)); //!false=true
//短路的演示
int a=5,b=10,c=5;
boolean b3 = a>b && c++>2;
System.out.println(b3); //false
System.out.println(c); //5,发生短路了
boolean b4 = a<b || c++>2;
System.out.println(b4); //true
System.out.println(c); //5,发生短路了
- 赋值:=、+=、-=、*=、/=、%=
int a = 5;
a += 10; //相当于a=(int)(a+10)
System.out.println(a); //15
a *= 2; //相当于a=(int)(a*2)
System.out.println(a); //30
a /= 6; //相当于a=(int)(a/6)
System.out.println(a); //5
//小面试题:
short s = 5;
//s = s+10; //编译错误,需强转: s=(short)(s+10);
s += 10; //相当于s=(short)(s+10)
- 字符串连接:+
//字符串拼接演示
int age = 38;
System.out.println("age="); //age=
System.out.println(age); //38
System.out.println("age="+age); //age=38
System.out.println("我的年龄是"+age); //我的年龄是38
System.out.println("我今年"+age+"岁了"); //我今年38岁了
String name = "WKJ";
System.out.println("name="+name); //name=WKJ
System.out.println("大家好,我叫"+name); //大家好,我叫WKJ
System.out.println("大家好,我叫"+name+",今年"+age+"岁了"); //大家好,我叫WKJ,今年38岁了
//同化作用演示
System.out.println(10+20+30+""); //60---------String
System.out.println(10+20+""+30); //3030-------String
System.out.println(""+10+20+30); //102030-----String
- 条件:boolean?数1:数2
int num = 5;
int flag = num>0?1:-1;
System.out.println(flag); //1
int a=8,b=55;
int max = a>b?a:b;
System.out.println("max="+max);
分支结构
if(){}else{} --------多条路结构
//1)偶数的判断:
int num = 5; //带数(6,5)
if(num%2==0){
System.out.println(num+"是偶数");
}
System.out.println("继续执行...");
//2)满500打8折:
double price = 300.0; //消费金额 带数(600.0,300.0)
if(price>=500){ //满500
price *= 0.8; //打8折
}
System.out.println("最终结算金额为:"+price);
//3)判断年龄是否在18到50之间,若满足则输出:"满足条件"
int age = 88; //带数(25,5,88)
if(age>=18 && age<=50){
System.out.println("年龄满足条件");
}
System.out.println("继续执行...");
switch-case-------结构简单 只能判断整数相等--- 必须搭配 break:跳出switch
public class CommandBySwitch {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请选择功能: 1.取款 2.存款 3.查询余额 0.退卡");
int command = scan.nextInt();
switch(command){
case 1:
System.out.println("取款操作...");
break;
case 2:
System.out.println("存款操作...");
break;
case 3:
System.out.println("查询余额操作...");
break;
case 0:
System.out.println("退卡操作...");
break;
default:
System.out.println("输入错误");
}
}
}
循环结构
while(boolean){}------结果为true则执行条件
//1)输出5次"行动是成功的阶梯":
int times = 0; //1)循环变量的初始化
while(times<5){ //2)循环的条件
System.out.println("行动是成功的阶梯");
times++; //3)循环变量的改变
}
System.out.println("继续执行...");
/*
执行过程:----带数
times=0
true 输出 times=1
true 输出 times=2
true 输出 times=3
true 输出 times=4
true 输出 times=5
false while循环结束
输出继续执行...
*/
//2)输出9的乘法表:
int num = 1; //3*9=27
while(num<=9){
System.out.println(num+"*9="+num*9);
num++; //num+=2;
}
System.out.println("继续执行...");
do{}while()-------------先执行一次语句块再去判断
public class Guessing {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = (int)(Math.random()*1000+1); //1到1000之内的随机数
System.out.println(num); //作弊
//假设num=250
//300(大),200(小),250(对)
int guess;
do{
System.out.println("猜吧!");
guess = scan.nextInt(); //1+3
if(guess>num){
System.out.println("太大了");
}else if(guess<num){
System.out.println("太小了");
}else{
System.out.println("恭喜你猜对了");
}
}while(guess!=num); //2
}
}
for(){}------------------给定循环条件再去判断
//for循环中的循环变量i,作用域仅在当前for中
for(int i=1;i<=9;i++){
System.out.println(i+"*9="+i*9);
}
for(int i=1;i<=9;i+=2){
System.out.println(i+"*9="+i*9);
}
for(int i=9;i>=1;i--){
System.out.println(i+"*9="+i*9);
}
for(int times=0;times<5;times++){
System.out.println("行动是成功的阶梯");
}
System.out.println("继续执行...");
/*
执行过程:
times=0 true 输出
times=1 true 输出
times=2 true 输出
times=3 true 输出
times=4 true 输出
times=5 false for循环结束
输出继续执行...
*/
//for的特殊格式:----------了解
int i=1;
for(;i<=9;i++){
System.out.println(i+"*9="+i*9);
}
for(int i=1;i<=9;){
System.out.println(i+"*9="+i*9);
i++;
}
for(;;){ //没有条件的循环就是一个死循环
System.out.println("我要学习...");
}
for(int i=1,j=5;i<=5;i+=2,j-=2){
}
/*
i=1,j=5 true
i=3,j=3 true
i=5,j=1 true
i=7,j=-1 false
*/
若循环条件跟次数有关 用for
若无关 第一要素跟第三要素不相同用 while若不相同用do while
跳出循环
break 跳出循环 前面加关键字 能指定跳出位置
for(int i=1;i<=9;i++){
if(i==4){ //在某种特定条件下,提前结束循环
break;
}
System.out.println(i+"*9="+i*9);
}
/*
i=1 true 1*9=9
i=2 true 2*9=18
i=3 true 3*9=27
i=4 true
*/
continue 跳过循环体中剩余语句而进入下一次循环
//输出9的乘法表,只要不能被3整除的
for(int i=1;i<=9;i++){
if(i%3!=0){
System.out.println(i+"*9="+i*9);
}
}
//输出9的乘法表,跳过能被3整除的
for(int i=1;i<=9;i++){
if(i%3==0){
continue; //跳过循环体中剩余语句而进入下一次循环
}
System.out.println(i+"*9="+i*9);
}
/*
i=1 1*9=9
i=2 2*9=18
i=3
i=4 4*9=36
i=5 5*9=45
i=6
i=7 7*9=63
i=8 8*9=72
i=9
i=10
*/
数组
- 是一种主句引用的集合 是一组相同的数据
- 数组名.legth是用来访问数组的长度
int[] arr = new int[3];
System.out.println(arr.length); //3
- 访问数组的元素同过元素的下标来进行访问
- 数组的赋值
-
System.arraycopy(a,2,b,3,2);
//7)数组的复制:
int[] a = {10,20,30,40,50};
int[] b = new int[6]; //0,0,0,0,0,0
//a:源数组
//1:源数组的起始下标
//b:目标数组
//0:目标数组的起始下标
//4:要复制的元素个数
System.arraycopy(a,1,b,0,4); //灵活性好
for(int i=0;i<b.length;i++){
System.out.println(b[i]);
}
-
a=Arrays.copyOf(a,3);
//常规复制
int[] a = {10,20,30,40,50};
//a:源数组
//b:目标数组
//6:目标数组的长度(元素个数)
//---若目标数组长度>源数组长度,则末尾补默认值
//---若目标数组长度<源数组长度,则将末尾的截掉
int[] b = Arrays.copyOf(a,6); //灵活性差
for(int i=0;i<b.length;i++){
System.out.println(b[i]);
}
//数组的扩容
int[] a = {10,20,30,40,50};
//数组扩容(创建了一个更大的新的数组,并将源数组数据复制进去了)
a = Arrays.copyOf(a,a.length+1);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
- 数组的排序
-
Arrays.sort(arr);
//8)数组的排序:
int[] arr = new int[10];
for(int i=0;i<arr.length;i++){
arr[i] = (int)(Math.random()*100);
System.out.println(arr[i]);
}
Arrays.sort(arr); //对arr进行升序排列
System.out.println("数组排序后的数据:");
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
System.out.println("倒序输出:");
for(int i=arr.length-1;i>=0;i--){
System.out.println(arr[i]);
}
- 倒序
for (int i=arr.length-1;i>=0;i--){ System.out.print(arr[i]+"\t"); }
方法函数过程
- 封装一段特定的业务逻辑功能
- 尽可能的独立,一个方法只干一件事
- 方法可以被反复多次调用
- 减少代码重复,有利于代码复用,有利于代码维护
-
定义方法:五要素
修饰词 返回值类型 方法名(参数列表) {
方法体--------------具体的业务逻辑功能实现
}
//无参无返回值
public static void say(){
System.out.println("大家好,我叫WKJ,今年38岁了");
}
//有参无返回值
public static void sayHi(String name){ //---------形参
System.out.println("大家好,我叫"+name+",今年38岁了");
}
//有参无返回值
public static void sayHello(String name,int age){
if(age>=35){ //在某种特定条件下,提前结束方法
return; //结束方法
}
System.out.println("大家好,我叫"+name+",今年"+age+"岁了");
}
//无参有返回值
public static double getNum(){
//在有返回值的方法中:
//--必须得通过return来返回一个值,并且这个值的类型必须与返回值类型匹配
//return "abc"; //编译错误,返回的值必须与返回值类型匹配
return 8.88; //1)结束方法的执行 2)返回一个结果给调用方
}
//有参有返回值
public static int plus(int num1,int num2){
int num = num1+num2;
return num; //返回的是num里面的那个数
//return num1+num2; //返回的是num1与num2的和
}
//获取指定整型数组元素的最小值
public static int getMinOfArray(int[] arr){
int min = arr[0]; //假设第1个元素为最小值
for(int i=1;i<arr.length;i++){
if(arr[i]<min){
min = arr[i];
}
}
return min;
}
调用方法:
- 无返回值:方法名(有参传参);
- 有返回值:数据类型 变量 = 方法名(有参传参);
-
//say(); //sayHi(); //编译错误,有参则必须传参 //sayHi(250); //编译错误,参数类型必须匹配 sayHi("zhangsan"); //String name="zhangsan" //-------实参 sayHi("lisi"); //String name="lisi" //---------------实参 sayHi("wangwu"); //String name="wangwu" //-----------实参 sayHello("zhangsan",25); //实参 sayHello("WKJ",38); //实参 double a = getNum(); //getNum()的值就是8.88 System.out.println(a); //8.88----模拟对返回值的后续操作 int b = plus(5,6); System.out.println(b); //11----模拟对返回值的后续操作 int m=5,n=6; int c = plus(m,n); //传递的是m和n里面的那个数 System.out.println(c); //11----模拟对返回值的后续操作 int[] arr = {13,45,1,35}; int min = getMinOfArray(arr); System.out.println(min); //1----模拟对返回值的后续操作 int[] a = new int[10]; for(int i=0;i<a.length;i++){ a[i] = (int)(Math.random()*100); } int b = getMinOfArray(a); System.out.println(b);