1.变量
定义:在程序执行的过程中,在某个范围内其值可以发生改变的量 变量定义方式 :数据类型 变量名 = 初始化值;
2. 数据类型
2.1 基本数据类型
整数类型: 所占字节数 可表示的范围
byte 1 -2^7~2^7-1
short 2 -2^15~2^15-1
int 4 -2^31~2^31-1
long 8 -2^63~2^63-1
浮点类型:
float 4
double 8
字符类型:
char 在不同的编码下,char字符类型所占的字节数是不一样的,
java默认是以Unicode编码(一个字符所占2个字节)进行运行的
布尔类型:
boolean 1
注意事项:
1、在java语言中整数默认是int类型,小数默认是double类型 2、byte,short,char类型进行运算时,会先转为int类型进行运算。 3、要想定义一个long类型的数据,在值的末尾处添加一个l或者L,表示这是一个long类型的数据,推荐使用L 4、要想定义一个float类型的数据,在值的末尾处添加一个f或者F,表示这是一个float类型的数据,推荐使用F
2.2 引用数据类型
注:强制类型转换是一个截取的过程,有可能会把有用的数据进行截掉,造成精度损失
2.3 变量使用特点
作用域 变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。 初始化值 没有初始化值不能直接使用 定义变量的两种格式: 1、数据类型 变量名 = 初始化值; (推荐使用) 2、数据类型 变量名; 变量名 = 初始化值; 在一行上建议只定义一个变量 可以定义多个,但是不建议
2.4 变量和常量参与运算的差异性
1、变量参与数据运算会先按照默认的转换方式提升数据类型,然后在做运算 2、常量参与运算的时候,先做运算,做完运算后再看一看结果在不在目标的范围内,如果在,就能够被接收。
2.5 ASCII码表
记住三个特殊的ASCII码
'a': 97 'A': 65 '0': 48
2.6 字符(串)与数值做运算
1.当字符串做加法的时候,这里+号,不是数值运算意义上的加法,而是字符串拼接的意思 2.加号两边,只要有一边是字符串类型,运算的过程就单纯的是字符串拼接,不做数值的转换和运算,得到的结果是一个新的字符串 3.可以使用小括号来改变运算的顺序
示例:
public class Variabletest{
public static void main(String[] args){
System.out.println("hello"+118); //直接显示字符串
System.out.println('a'+1+"哇哦"); //先计算'a'+1=98,然后输出'98哇哦'
System.out.println("bye"+12+'s'); //直接输出bye12s
System.out.println("5+5="+(5+5)); //先进行括号中的运算
}
}
执行结果:
3.运算符
3.1 算数运算符
public class Operatortest1 {
public static void main(String[] args) {
int a=2;
int b=3;
float c=6.0f;
System.out.println("a:"+a+"\tb:"+b+"\tc:"+c);
System.out.println("a+b="+(a+b)); //加
System.out.println("a-b="+(a-b)); //减
System.out.println("a*b="+(a*b)); //乘
System.out.println("a/b="+(a/b)); //整除
System.out.println("c/b="+(c/b)); //除
System.out.println("a%b="+(a%b)); //取余
}
运行结果:
++,-- 自加,自减
++ 自加1: 对变量单独使用的时候,无论是放在变量的后面还是前面,都不影响最终的结果, 不是单独使用的时候,++放在了后面表示先取值再自加1,++放在前面是先自加1,再取值 -- 自减1
3.2 赋值运算符
注意:
s+=1 等价于具备强制类型转换的式子 s=(s的数据类型)(s+1)
3.3 比较运算符
3.4 逻辑运算符
public class Logictest {
public static void main(String[] args) {
boolean a1 = true;
boolean b1 = false;
System.out.println(a1 & b1); //有一个为false即为false
System.out.println(a1 | b1); //有一个为true即为true
System.out.println(a1 ^ b1); //只有俩个不同才为true
System.out.println(!a1); //true变为false,false变为true
}
}
运行结果 :
3.5 位运算符
<< 左移: 参与运算的数值对应的二进制补码向左移动若干位,左边多出来的位数丢掉,右边空出的位置用0补齐 >> 右移: 参与运算的数值对应的二进制补码向右移动若干位,右边多出来的位数丢掉,左边空出来的位置,原本最高位是1就用1补齐,原本最高位是0就用0补齐 >>> 无符号右移: 右移的步骤和正常右移是一样的,但是左边空出来的位置,无论最高位是1还是0,都用0补齐
public class Weitest {
public static void main(String[] args) {
System.out.println(24 << 2); // 96 24*2^2=96
System.out.println(3 << 3); // 3*2^3=24
System.out.println(24 >> 2); //6 24/4=6 24/2^2=6
System.out.println(100 >> 2); // 100/2^2=25
System.out.println(-24 >>> 2);
}
}
运行结果:
3.6 三目运算符
需要注意的是:
在使用三目运算符时尽量保证两个返回值的类型相同,否则会触发强制类型转换。
1)如果返回值1和返回值2都是同种类型,那么三目运算符最终的返回类型就是这种类型
2)如果返回值1和返回值2不是同种类型,那么三目最终的返回类型是这两种类型的相同最小父类(最接近的父类,如果没有则返回Object,例如Integer和String最终返回的将是Object)。
3)对于基本数据类型,有点特殊。如果一个返回值类型为T(T为byte,char或short),另一个为int的常数,那么如果这个常数值在T的取值范围内,则三目最终的返回类型为T,如果常数值不在T的取值范围内,则返回发生自动类型转换。
简单来说:三目运算符返回值的类型与最大的那个相同,比如都是数字类型的float和int,最终返回值就是float类型,如果类型不同就会尝试转换,无法转换就会返回Object()。(见3)
public class Threetest {
public static void main(String[] args) {
//获取a b中的最大值
int a = 3;
int b=20;
int max1=(a>b)?a:b;
System.out.println("a b中最大值为:"+max1);
//获取 a b c 中的最大值
int c=88;
int max2=(a>b)?((a>c)?a:c):((b>c)?b:c);
System.out.println("a b c中最大值为:"+max2);
}
}
运行结果:
4.键盘录入
5.流程控制语句
5.1 顺序结构
程序的执行顺序按照我们写代码的顺序从上往下依次执行
5.2 选择结构
也叫分支结构。包括if选择语句和switch选择语句。
5.2.1 if选择语句
三种形式:
1)第一种语句定义格式: if(条件表达式){ 语句体; } 注意事项: a. 大括号能不能去掉? 如果语句体中只有一条语句的话是可以去掉的,如果有多条语句,那么if结构只针对第一条语句生效。 建议永远不要省略大括号。 b. 小括号后面能不能写分号? 可以加,但是后续的大括号中的内容与if语句本身没有关系。 c. 条件表达式中的逻辑可以很复杂,但是要确保最终的结果要是boolean类型。 2) 第二种语句定义格式: if(条件表达式){ 语句体1; }else{ 语句体2; } 3) 第三种语句定义格式: if(条件表达式1){ 语句体1; }else if(条件表达式2){ 语句体2; }else if(条件表达式3){ 语句体3; }else if(条件表达式4){ 语句体4; }else if(条件表达式n){ 语句体n; }else{ //最后一个else可以加也可以不加,语法上不报错,根据实际情况来 语句体n+1; }
5.2.2 switch选择结构
语句定义格式
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
...
default:
语句体n+1;
break;
}
注意事项:
1、表达式的值的类型可以是哪些?可以是byte,short,int,char,jdk1.5之后可以是枚举,jdk1.7之后可以是字符串String类型 2、执行流程: 1)计算表达式中的值 2)拿着这个值匹配对应的case 3)当有匹配的case的时候,执行对应case中的语句体 4)执行完语句体后,如果遇到了break,结束整个switch语句 5)如果没有匹配到对应的case,那么default中的语句体,遇到break结束 3、switch语句结束的条件: 1)遇到了break,跳出整个switch语句 2)正常执行到末尾 3)没有default语句且没有对应的case匹配 4)非正常情况,比如执行到一半断电了 4、break语句可以不加上,语法上是允许不会报错,但是从执行逻辑上来看,可能结果不是我们想要的结果 5、case 后面匹配的内容必须是一个常量 6、default语句能不能没有,或者随便放在case的之间,顺序不保证,行不行? default不加从语法层面上说是没有问题,但是从逻辑严谨性上面来说,是有问题的,用户体验不太好 default语句完整写法在哪里都可以,因为switch语句执行的时候严格按照先匹配case,当没有case的时候,再去执行default,跟default在哪无关。
实例:
//用switch语句实现键盘录入月份,输出对应的季节
import java.util.Scanner;
public class Switchpratice1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入月份:");
int month =sc.nextInt();
switch (month){
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;
case 12: case 1: case 2:
System.out.println("冬天");
break;
default:
System.out.println("输入错误");
break;
}
}
}
输出结果:
5.3 循环结构
5.3.1 for循环语句
语句定义格式
for( 初始化语句 ; 判断条件语句 ; 控制条件语句 ) { 循环体语句; }
注意事项
1、初始化语句能不能写在循环的外部 能写。如果写在for循环中,在循环的内部是可以找到的,如果写在了外部,循环内部可以找到,并且出了循环也可以找到 2、判断条件语句能否不写? 从语法正确性来说可以不写,但是不写的后果是会造成死循环 3、控制条件语句能否不写? 从语法正确性来说可以不写,但是不写的后果是会造成死循环 如果写,写在循环体中行不行呢? 可以,只要最终让条件变化就可以了。
实例:
//统计”水仙花数”共有多少个 所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
import java.lang.Math;
public class Fortest1 {
public static void main(String[] args) {
int num=0;
for (int i = 100; i < 1000; i++) {
int baiwei = i / 100;
int shiwei = i % 100 / 10;
int gewei = i % 100 % 10;
if (Math.pow(baiwei, 3) + Math.pow(shiwei, 3) + Math.pow(gewei, 3) == i) {
System.out.println(i);
num+=1;
}
}
}
}
运行结果:
5.3.2 while循环语句
while语句定义格式:
基本格式 while(判断条件语句) { 循环体语句; } 扩展格式 (今后工作中常用的扩展格式) 初始化语句; while(判断条件语句) { 循环体语句; 控制条件语句; }
do....while语句定义格式:
基本格式 do { 循环体语句; }while((判断条件语句); 扩展格式 (开发常用的是扩展格式) 初始化语句; do { 循环体语句; 控制条件语句; } while((判断条件语句);
注意: while循环与do...while循环的区别: 1、while循环执行的逻辑是先判断是否满足循环条件,如果满足,才会执行循环体内容 2、do...while循环执行的逻辑是先执行一次循环体内容,再去判断是否满足循环条件,如果满足才会执行循环体内容
实例:
//我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
public class Whiletest1 {
public static void main(String[] args) {
float height=0.01f;
int fre=0;
while(height<8848){
height*=2;
fre+=1;
}
System.out.println("折叠"+fre+"次");
}
}
运行结果:
5.4 跳转控制语句