优秀是一种习惯
Java语言 一次编译到处运行
Java开发
编写Java
编译Java
运行Java
JDK 是Java语言你的软件开发工具包,包含代码的编译工具和运行工具
JDK =JRE +开发工具
JRE=JVM+核心类库
为了使用Javac和Java命令
public class HelloWrold{
public static void main(String[] args){
System.out.println("helloworld");
}
}
给程序员看的 并不会给JVM看
Java赋予了特殊含义的单词
作用:在代码运行期间 其值不会发生变化的数据
整数常量
例如:1,2,3,11,33,212
小数常量
例如:1.22,12.13
字符常量
例如:‘A’,‘a’,‘1’
字符串常量
例如:“黑马”,“abc”
布尔常量
例如:true,false
空常量
只有一个:null
不能单独打印
作用:使用变量记录一些经常发生变化的数据
变量是什么:内存中一小块存储区域 这个区域中的值经常发生变化
变量的定义格式: 数据类型 变量名=初始化值;
变量的使用:拿变量名使用 拿变量名获取这个变量对应的值
注意事项:
变量名不可以重名
一行上可以定义同类型的数据
例如:int a,b,c;
? int a=11,b=22,c=33;
变量使用前,必须要有一个初始化
定义float与long 对应初始化值后面加上F/f和L/l;
变量的作用范围 变量所在的大括号中
分为基本数据类型和引用数据类型。
基本数据类型 四类八种:
引用数据类型:
整数类型:
字节Byte 范围
byte 1B -128~127
short 2B -2^15~2^15-1
int 4B -2^31~2^31-1 默认
long 8B
浮点类型
float 4B
double 8B 默认
字符
char 2B
布尔类型
boolean 1B
定义float类型变量时 后面必须加上F或f;
定义double类型变量时 后面可以不加D或d;
定义long类型变量时 后面必须加上L或l;
int类型和float类型所占都是4个字符,那种数据类型所储存的数据大呢?
float在数据结构中存在的方式是用指数表示的 采用科学技术法
所以float表示的数据范围要比int大
要求:
将数据范围小的 赋予一个数据范围大的
一个小的和一个大的计算时 小的提升为大的 然后计算
byte–>short–>int–>long–>float–>double
char–>int–>long–>float–>double
byte、short、char 参与计算时 会提升为int 记
例如:将数据范围小的 赋予一个数据范围大的
int a=222;
long b=a;
例如:一个小的和一个大的计算时 小的提升为大的 然后计算
int a=222;
double b=10.2;
double c=a+b; //a int自动提升为double
例如:byte、short、char计算时 会提升为int
byte a=10;
short b=20;
int c=a+b; //byte、short、char计算时提升为int
byte d=(byte)(a+b) //强转
byte f=10+20; //常量的优化机制 相当于byte f=30,将一个这个数复制个欸一个类型时,jvm会判断当前值是否在范围内;
要求:
将数据范围大的 赋予一个数据范围小的
小数转为整数 只保留整数位
例如: 将数据范围大的 赋予一个数据范围小的
int a=222;
byte b=(byte)a;
例如:小数转为整数 只保留整数位
double a=10.95;
int b=(int)a;
sout(b); //10
键盘录入一个小数,输出一个四舍五入的整数
方法1:键盘录入一个小数,输出一个四舍五入的整数
Scanner sc= new Scanner(System.in);
double num=sc.nextDouble();
int result=(int)(num+0.5);
sout(result);
方法2:键盘录入一个小数,输出一个四舍五入的整数
Scanner sc= new Scanner(System.in);
double num=sc.nextDouble();
sout(Math.round(num));
拓展:
向下取整
Math.floor(num);
例如:
Math.floor(11.7)=11;
Math.floor(-11.2)=-12;
向上取整
Math.ceil(num)
例如:
Math.ceil(11.4)=12;
Math.ceil(-11.6)=-11;
用键盘录入数据 为了让我们的数据更加灵活
例如:
import java.util.Scanner;
public class Demo{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
Sysyem.out.println(i);
}
}
用来给变量 类 方法取名的符号
硬性规范
江湖规矩
运算符 用来连接常量或者变量的符号
表达式 使用运算符连接常量或者变量的一种符合Java语法的式子
算术运算符
赋值运算符
比较(关系)运算符
逻辑运算符
三元运算符
算数运算符包括: | 作用 |
---|---|
+ | 加法运算,字符串连接运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 取模运算,两个数字相除取余数 |
例如:求三位数的各位数字,十位数字,百位数字是多少?
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位的整数");
int num = sc.nextInt();
int ge=num%10;
int shi=num/10%10;
int bai=num/100%10;
// int qian = num / 1000 % 10;
// int wan = num / 10000 % 10;
System.out.println(ge+" "+shi+" "+bai);
}
}
作用:字符和byte对应关系 为了让我们方便使用字符
byte、short、char 参与计算时 会提升为int
字符 | 数值 |
---|---|
0 | 48 |
9 | 57 |
A | 65 |
Z | 90 |
a | 97 |
z | 122 |
例如:
int a=1;
char b='a';
sout(a+b); //b默认提升为int类型 1+97=98
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
– | 自减 | 变量的值减1 |
单独使用时,a++,++a,a–,--a相同。
参与运算时,a++ 先拿值在++,++a先++再拿值。
? a-- 先拿值在–,--a先–再拿值。
例如:
int a=5;
int b=a++ + ++a +5; // 5 7 5 // 6
sout(b); //17
字符串参与加法运算得到的结果 也是一个字符串 也叫字符串拼接
从左往右执行 如果有括号先算括号内的
加号两边只要有字符串 结果就是字符串 例如:“你好” + 3 + 4 要考虑到 “你好” + 3结果是一个字符串 所以第二个加号两边存在字符串
sout(2+"你好"); //2你好
sout("你好"+3); //你好3
sout(2+3+"你好"); //5你好
sout(2+"你好"+3); //2你好3
sout("你好"+2+3); //你好23
sout("你好"+(2+3); //你好5
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值给a |
-= | 减后赋值 | a-=b,将a-b的值给a |
*= | 乘后赋值 | a*=b,将a×b的值给a |
/= | 除后赋值 | a/=b,将a÷b的商给a |
%= | 取余后赋值 | a%=b,将a÷b的余数给a |
扩展的赋值运算隐含了强制类型转换 记
例如:
short s = 1;
s+=1; //一次运算 相当于 s=(short)(s+1)
sout(s);
关系运算符就是用来描述两个变量或者常量之间的关系的。
符号 | 说明 |
---|---|
== | a==b,判断a和b的值是否相等,成立为true,不成立为false |
!= | a!=b,判断a和b的值是否不相等,成立为true,不成立为false |
> | a>b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于等于b,成立为true,不成立为false |
< | a |
<= | a<=b,判断a是否小于等于b,成立为true,不成立为false |
注意: 假设下表中的a和b, 都是boolean类型的值。
符号 | 作用 | 说明 |
---|---|---|
& | 逻辑与 | a&b,并且的意思. 有false则整体为false, 都为true, 则整体为true. |
| | 逻辑或 | a|b,或者的意思, 有true则整体为true, 都为false, 则整体为false. |
! | 逻辑非 | !a,取反的意思, 以前为true, 取反后为false, 以前为false, 取反后为true. |
^ | 逻辑异或 | a^b,异同的意思, 相同为false, 不同为true. |
在实际开发中, 并且, 或者这样的操作是非常多的, 但是上述的&(逻辑与), !(逻辑或)运算符没有短路效应, 所以效率相对较低, 针对这种情况, 我们可以使用&&(短路与), ||(短路或)来优化.
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 作用和&相同,但是有短路效果, 前边出现false, 后边不执行. |
|| | 短路或 | 作用和|相同,但是有短路效果, 前边出现true, 后边不执行. |
解释
在短路与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都计算出来,短路与运算符就有这样的效果,可以提高效率。
同理在短路或运算中,一旦发现值为true,右边的表达式将不再参与运算。
– 逻辑与&(也叫单与): 无论左边真假,右边都要执行。
– 短路与&&(也叫双与): 如果左边为真,右边执行;如果左边为假,右边不执行。
– 逻辑或|(也叫单或): 无论左边真假,右边都要执行。
– 短路或||(也叫双或): 如果左边为假,右边执行;如果左边为真,右边不执行。
记忆: 在实际开发中, 我们用的最多的逻辑运算符就是: &&, ||, ! 记
例如:
public class Demo {
public static void main(String[] args) {
boolean x = true;
boolean y = false;
short z = 42; //真 假 42
if ((z++ == 42) && (y = true)) //真 真 43
z++; //真 真 44
if ((x = false) || (++z == 45)) //假 真 45
z++; //假 真 46
System.out.println("z=" + z);
}
}
三元运算符也叫三目运算符,即由三部分组成,格式如下:
(关系表达式) ? 表达式1:表达式2;
执行流程:
先执行关系表达式, 看其结果是true还是false.
如果是true, 则执行表达式1
如果是false, 则执行表达式2
例如:三个数字找出最大值
int num1=100;
int num2=111;
int num3=222;
int temp=num1>num2?num1:num2;
int max= temp?num3?temp:num3;
sout(max);
或://可嵌套 不推荐
int max= (num1>num2?num1:num2)?num3?(num1>num2?num1:num2):num3;
? 顺序结构
? 选择结构(if语句, switch.case语句)
? 循环结构(for循环, while循环, do.while循环)
顺序结构指的是代码是按照从上往下,从左往右的顺序,,依次逐行执行的,,且顺序结构也是Java程序的默认结构。
例如:
public class Demo {
public static void main(String[] args) {
sout("a");
sout("b");
sout("c");
sout("d");
sout("e"); // abcde
}
}
主要分为以下三种:
if语句(也叫: 单分支)
if…else语句(也叫: 双分支)
if…else if语句(也叫: 多分支)
结构一般用来判断一种情况, 格式如下:
格式
if(关系表达式) {
//语句体;
}
执行流程:
先执行关系表达式,看其结果是true还是false。
如果是true,则执行大括号中的语句体。
如果是false, 则大括号中的语句体不执行。
例如:
public class Demo {
public static void main(String[] args) {
sout("开始了");
int time = 5;
if(time >= 0 && time <= 8) {
sout("早上好");
}
sout("其他语句");
}
}
双分支结构指的是if. else语句, 一般用来判断两种情况, 格式如下:
if(关系表达式) { //if的意思: 如果
//语句体1;
} else { //否则…
//语句体2;
}
执行流程:
先执行关系表达式, 看其结果是true还是false。
如果是true,则执行语句体1。
如果是false,则执行语句体2。
例如:
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入一个整数: ");
int num = sc.nextInt();
if (num % 2 == 0) {
System.out.println(num + "是偶数");
} else {
System.out.println(num + "是奇数");
}
}
}
多分支结构指的是if. else if语句, 一般用来判断多种情况, 格式如下:
if(关系表达式1) {
//语句体1;
} else if(关系表达式2){
//语句体2;
} else if(关系表达式3){ //这里可以根据需求, 有多个else if语句
//语句体3;
} else {
//语句体n;
}
执行流程
先执行关系表达式1,看其结果是true还是false。
如果是true, 则执行语句体1, 整个if语句结束。
如果是false,则判断关系表达式2, 看其结果是true还是false。
如果是true, 则执行语句体2, 整个if语句结束。
如果是false, 则判断关系表达式3, …以此类推。
如果所有的关系表达式都不成立,,则执行else语句的语句体n,整个if语句结束。
例如:键盘输入小明考试成绩,
如果小明考试成绩为95~100奖励山地自行车一辆。
如果小明考试成绩为90~94奖励去游乐园一次。
如果小明考试成绩为80~89奖励变形金刚玩具一个。
如果小明考试成绩为0~79男女混合双打。
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请录入小明的考试成绩: ");
int score = sc.nextInt();
if (score >= 95 && score <= 100) {
System.out.println("奖励小明: 山地自行车一辆");
} else if(score >= 90 && score <95) {
System.out.println("奖励小明: 游乐场玩儿一次");
} else if(score >= 80 && score <90) {
System.out.println("奖励小明: 变形金刚玩具一个");
} else if(score >= 0 && score <80){
System.out.println("奖励小明: 男女双混组合拳 + 扫帚棒法");
} else {
System.out.println("考试成绩录入有误.");
}
}
}
例如:键盘输入狗子年龄,狗子前两年每年相当于人类10.5年,之后每增加一年就增加四岁,那么狗子五岁相当于人类多少年龄?
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入狗狗的年龄:");
int dogAge = sc.nextInt();
if (dogAge==1){
System.out.println("相当于人类10.5岁");
}else if (dogAge==2){
System.out.println("相当于人类"+(int)(10.5*2)+"岁");
}else if (dogAge>2){
int temp=dogAge-2;
double age=temp*4+(int)(10.5*2);
System.out.println("相当于人类"+age+"岁");
}else {
System.out.println("输入有误,请重新上输入");
}
}
}
格式:
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
…
default:
语句体n+1;
[break;]
}
执行流程:
首先计算表达式的值。
依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后程序结束掉。
例如:键盘录入星期数,显示今天的减肥活动。
周一:跑步
周二:游泳
周三:慢走
周四:动感单车
周五:拳击
周六:爬山
周日:好好吃一顿
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
System.out.println("请输入星期数,显示今天的减肥活动");
Scanner sc = new Scanner(System.in);
int day = sc.nextInt();
switch (day) {
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("输入有误,请重新输入");
}
}
}
解决什么问题: 当一些需要重复执行的代码 可以循环
格式:
for(①初始化语句;②条件语句,③循环控制语句){
④循环语句体;
}
执行顺序:
1. 初始化语句①
2. 条件语句② 为true 继续往下执行,false循环结束
3. 循环语句体④
4. 循环控制语句③
5. 条件语句② 返回顺序第2步执行
例如:打印输出所有水仙花数。
public class Demo {
public static void main(String[] args) {
for (int i = 100; i <= 999; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
//int qian = num / 1000 % 10;
//int wan = num / 10000 % 10;
if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai) {System.out.println(i);
}
}
}
}
需求:在控制台输出所有的“水仙花数”,要求每行打印2个
public class Demo1 {
public static void main(String[] args) {
int count=0;
for (int i = 100; i <= 999; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
//int qian = num / 1000 % 10;
//int wan = num / 10000 % 10;
if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai) {System.out.print(i+" "); //print 不换行输出count++;if (count%2==0){ System.out.println(); //printlin 不换行输出}
}
}
}
}
需求:求1-5之间的数据和,并把求和结果在控制台输出
public class Demo {
public static void main(String[] args) {
int sum=0;
for (int i = 1; i <= 5; i++) {
sum+=i;
}
System.out.println(sum);
}
}
需求:求1-100之间的偶数和,并把求和结果在控制台输出
public class Demo1 {
public static void main(String[] args) {
int sum=0;
for (int i = 1; i <= 100; i++) {
if (i%2==0){sum+=i;
}
}
System.out.println(sum);
}
}
完整格式:
初始化语句①;
while (条件判断语句②) {
循环体语句③;
条件控制语句④;
}
执行流程:
1. 执行初始化语句①
2. 执行条件判断语句②,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
3. 执行循环体语句③
4. 执行条件控制语句思
5. 回到2继续
例如:需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
public class Demo {
public static void main(String[] args) {
int zf = 8844430;
double paper = 0.1;
int count = 0;
while (paper
count++;
}
System.out.println(count);
}
}
在控制台打印10次HelloWorld
public class Demo {
public static void main(String[] args) {
int i = 0;
while(i <10) {
System.out.println("Hello World!");
i++;
}
}
}
完整格式:
初始化语句①;
do {
循环体语句②;
条件控制语句③;
}while(条件判断语句④);
执行流程:
1. 执行初始化语句①
2. 执行循环体语句②
3. 执行条件控制语句③
4. 执行条件判断语句④,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
5. 回到2继续
例如:需求 通过do.while循环, 在控制台打印10次Hello World!
public class Demo {
public static void main(String[] args) {
int i = 1;
do{
System.out.println("Hello World! " + i);
i++;
}while(i <= 10);
}
}
do…while循环和其他两个循环之间的区别
do…while循环是先执行一次, 后判断。
而其他两个循环都是先执行判断条件, 然后决定是否执行循环体。
for循环和其他两个循环之间的区别
for(;