变量
数据类型:Java是一种强类型编程语言
生命周期:有效范围。Java提供了垃圾回收机制
Java中的数据类型可以分为两大类型:基本类型【原生】和引用类型【复杂】
基本类型
4型8种
整型:byte 1、short 2、int 4、long 8
- Java采用补码的方式存储数据 。
- 4种不同的表示方法:十进制、0八进制、0x十六进制、0b二进制
- 在使用字面量,Java中的整数默认类型就是int,如果想表示long则在数值末尾添加l/L,一般建议使用L
浮点数:float 4、double 8
-
在Java种浮点数无法精确存放,除非使用Java提供的类BigDecimal
不允许使用等值==判断,应该使用Math.abs(a-b)<1e-6
-
字面量的表示方式:十进制123.0、科学计数法1.23e2,注意e后面只能是整数
数值末尾使用f/F表示float,使用D/d表示double
字符类型 char char c=‘中’;注意是单引号,不是双引号
- Java中字符采用的是Unicode编码字符集,2B,对应的整数为0-65535
- 字符类型的变量可以当作整数使用
- ‘0’<‘A’<‘a’
- Java中提供了转意字符,以反斜杠开头
\ddd 1-3位的8进制数对应的字符
\uxxxx 1-4位的16进制数对应的字符
\’表示单引号
\”表示双引号
\表示反斜杠字符
布尔类型 boolean
- 只有两个数值:true表示真,false表示假
- 在Java中整型数据和boolean值之间没有转换关系
//整型数的进制转换
int kk=123;
//将十进制转化为8进制
System.out.println("0"+Integer.toOctalString(kk));
//将十进制转换为16进制
System.out.println("0x"+Integer.toHexString(kk));
//将十进制转换为2进制
System.out.println("0b"+Integer.toBinaryString(kk));
常见的数学计算`
double dd = 144.d;
System.out.println(Math.sqrt(dd));//开平方
int k1= 12;
System.out.println(Math.pow(k1,2));//计算k1的2次方
System.out.println(Math.pow(k1,0.5));//对k1开方
k1=-123;
System.out.println(Math.abs(k1));//绝对值
System.out.println(Math.max(k1, dd));//求两数的较大值
System.out.println(Math.min(k1, dd));//求两数的较小值
dd = 3.45;
System.out.println(Math.ceil(dd));//天花板 4
System.out.println(Math.floor(dd));//地板 3
dd = -3.45;
System.out.println(Math.ceil(dd)); //-3
System.out.println(Math.floor(dd)); //-4
//四舍五入,注意考核中的坑在于对负数的处理
dd= -3.45;
System.out.println(Math.round(dd));//-3
dd=-3.56;
System.out.println(Math.round(dd));//-4
//取随机数
System.out.println(Math.random());
除了简单计算之外,还有指数,对数,三角和反三角函数等方法的封装。
字符类型的基本使用
char c='a';
System.out.println(c);//a
c++;//给c+1;计算结果等价于c=c+1,但这里涉及数据类型转换的问题,所以c=c+1会语法报错
System.out.println(c);//b
//将字符类型转换为整数
System.out.println((int)c);//98
c='中';
System.out.println(c+"===="+(int)c);//中====20013
//转义字符
System.out.println('\123');// s
int kk=0123;//0开头表示8进制
System.out.println((char)kk);//s
System.out.println('\u9110');
kk=0x9110;
System.out.println((char)kk);
char cc='\\';
System.out.println(cc);// \
System.out.println((int)cc);// 92
基本数据类型转换
小转大自动转,大转小需强转 窄化操作
//小转大
byte b1 = 123;//自动识别123位byte类型,但是如果超出范围则自动报错
long k = b1;
double k2 =k1;
//大转小
double d1=123.456;
long k1 = d1;//语法错误
long k2 = (long)d1;
强制类型转换的语法(目标类型)变量
注意:boolean类型和数值类型之间没有任何关系,所以进行强制类型转换会包语法错误。
浮点数的特殊处理
针对浮点数系统默认的是double型,但是变量f1声明为float,所以这里需要进行数据类型转换或进行特殊声明。
double d1 = 123.456;
//long k1 = d1;
long k1 = (long)d1;//强制类型转换
System.out.println(k1);//使用强制类型转换可能会导致精度缺失
//针对浮点数的特殊处理
//float f1=123.456;语法错误,type mismatch;cannot conver from double to float
float f1 = 123.456f;
float f2 = (float)123.456;
复合数据类型
复合数据类型包括:类class、接口interface、数组
特殊值null,在运行时并没有对应的类型,但是它可以被转换为任何复杂类型,表示没有存储数据,但是不能赋值给简单类型
复合类型的默认值就是null空指针
Object bb;//定义变量bb为复合数据类型object,object类是系统预定义
//System.out.println(bb);这里报错是因为要去临时变量必须先定义后使用,
//必须先赋初值后使用
bb = null;
System.out.println(bb);
常量
常量就是指在程序执行的期间其值不能发生变化的数据
final double PI = 3.1415;
PI=PI+1;//这里语法报错是因为PI是常量,不允许修改
表达式
表达式就是运算符、操作数以及方法的调用序列,用来说明某个计算过程并返回计算结果。
基本运算符可以分为:算术运算符、关系运算符、位运算符、条件运算符
- ·算术运算符+ - * / % ++ –
- 关系运算符> >= < <= ==等值 !=不等于
- 逻辑运算符 &&与运算,表示并且的关系,
||或运算,表示或者的关系,
!非运算,表示不是,
重点在于计算过程中支持短路操作 - 位运算 &与 |或 ^异或 ~按位取反
<<左移位 >>右移位 >>>,基本不做要求,位运算符不支持短路操作 - 赋值运算符 = += -= /= %=
- 三目运算符(表达式1?表达式2:表达式3)
算数运算符
问题:将一个任意正整数进行反转,如果数值越界则返回-1
//Integer.MAX_VALUE最大整数
int k = 2000000999;
long res = 0;
while(k>0)
{
int p=k%10;
k=k/10;
res=res*10+p;
if(res>Integer.MAX_VALUE){
res=-1;
break;
}
}
System.out.println(res);
如果这段代码需要进行多个地方使用,则需要一个方法,其中包含处理逻辑,其他地方使用时只需要通过名称就可以进行调用
public static void main(String[] args) {
int k = 2000000999;
System.out.println(reverse(k));}
public static int reverse(int x){
long res = 0;
while(x>0)
{
int p=x%10;
x=x/10;
res=res*10+p;
if(res>Integer.MAX_VALUE){
res=-1;
break;
}
}
return (int)res;//因为res声明的类型为long类型,但是返回类型为int,所以需要进行强制类型转换
}
关系运算符
用于判断两个数据之间的大小关系,计算结果就是boolean值,如果成立则返回true,则返回false
> < >= <= == !=
double d1= 10;
System.out.println(d1>3);
==和=的区别
==是比较计算,=是赋值计算
逻辑运算符
用于表达多个条件之间的关系,例如年龄大于18并且小于65 age>18 && age<65
&&与运算,表示并且
同真则真,一假则假
age>18 && age<65 age = 34两个条件同时成立,则计算结果为真
||或运算,表示或者
同假则假,其余为真
age>18 && age<65 age=98 由于满足age>18 则计算结果为true
!非运算,不是否则
非假则真 非真则假
考试重点
例如A&&B 如果计算条件为false,这里不管B的值是true还是false,则计算结果一定为false,所以计算结果和B的值没有关系,所以执行真正计算时B并不执行,而是直接返回false
A||B,如果条件A为true,则不需要计算B的结果,因为结果一定为true,计算结果和B的值没有关系
int age =100;
char cc = 'a';
System.out,println(cc+"...."+(int)cc);
System.out.println('B'+"...."+(int)'B');
if(cc>='B'&& age++<200)
System.out.println("xxxxx");
System.out.println(age);
赋值运算符
= += -= *= /= %=
k =k+7可以简化为k+=7
考点
short k=8;
k=k+8;//语法错误。因为k+3中的3倍系统识别为int类型,所以计算结果自动转换为int。但是int类型的数据不能直接赋值给短整型的变量。这里代码可以修改为k=(short)(k+3)
//另外写法
short k = 3;
k+=3;
//这里可以直接运行,不需要手动转换
结构化编程
条件分支语句
java提供了两种判断语句if和switch,这两种语句用于实现条件判断,当符合某些条件时执行某段代码
if 语句
if(条件判断语句){
代码段;
}
if(条件判断语句){
代码段1;}
else{
代码段2;}
if(条件1){
代码段1;}
else if(条件2){
代码段2;}
else if…{
代码段n;}
else{
代码段n+1;}
需求:要求输入学生性别,如果false则显示女
Scanner sc = new Scanner(System.in);
boolean bb = sc.nextBoolean();
if(bb==false){
System.out.println("性别为女");
}
需求:输入学生成绩,假设成绩都是整数,如果>60就是及格否则就是不及格
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if(score>60)
{
System.out.println("成绩及格");
}
else{
System.out.println("成绩不合格");
}
需求:输入学生成绩,假设成绩都是整数 如果>=85显示优秀,>=70成绩良好,>=60成绩及格,否则显示不及格
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if(score>=84)
System.out.println("成绩优秀");
else if(score>=70)
System.out.println("成绩良好");
else if(score>=60)
System.out.println("成绩及格");
else
System.out.println("成绩不及格");
问题:这里的判断顺序不能调换,例如不能先判断>=70,再判断>=85
开关分支语句
switch(表达式){
case 值1:
代码块1;break;
case 值1:
代码块1;break;
....
default:
代码块 }
需求:输入月份,显示对应本月的天数
System.out.println("请输入月份:");
Scanner sc = new Scanner(System.in);
int month = sc.nextInt();
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println("本月有31天");
break;
case 2:
System.out.println("请输入年份:");
int year = sc.nextInt();
if((year%4==0 && year%100!=0)||(year%400==0))
System.out.println("本月有29天");
else
System.out.println("本月有28天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println("本月有30天");
break;
}
循环结构
循环语句也叫迭代语句,在Java中存在 while 、for、do…while
while(条件){执行语句;} 当条件成立时立即反复执行语句,直到条件不成立为止
int res = 0;
int k =1;
while(k<=100){
res+=k;
k++;
}
System.out.println("1+2+3+...+100="+res);
写法1
int res = 0;
int k =0;
while(k++<100){
res+=k;
}
System.out.println("1+2+3+...+100="+res);
写法2
int res = 0;
int k =0;
while(++k<=100){
res+=k;
}
System.out.println("1+2+3+...+100="+res);
写法3
int res = 0;
int k =1;
while(true){
res+=k;
if(++k>100)
break;
}
System.out.println("1+2+3+...+100="+res);
break和continue的用法
需求:计算100以内的奇数和
最直接的思路,奇数相加,偶数跳过;
int res = 0;
int k = 0;
while(true){
if(++k>100)
break;
if(k%2==0)
continue;
res+=k;
}
System.out.println(res);
do while循环
先执行循环体,然后进行条件判断,如果结果为true。则执行下次循环;如果条件为false则终止循环,不同于while循环的特征是:do/while至少执行一次,而while循环有可能一次都不执行。
do{
循环体;
}while(条件)
实现
int res = 0;
int k =1;
do{
res+=k++;
}while(k<=100);
System.out.println(res);
for循环
基本执行流程:
执行表达式1,再执行表达式2(一般表达式是一个条件判断语句),如果值为true则执行循环体,否则终止循环,执行完循环体再执行表达式3,再次执行表达式2。以判断是否执行循环体。在此次循环过程中表达式1只执行一次。
for(表达式1;表达式2;表达式3)
{循环体;
}
int res =0;
for(int k = 0;k<=100;k++){
res+=k;
}
System.out.println(res);
特殊写法:在这里表达式1、2、3都不是必须的
写法1:
int res = 0;
int k = 0;
for(;k<=100;k++)
{
res+=k;
}
System.out.println(res);
写法2:
int res = 0;
int k = 0;
for(;k<=100;)
{
res+=k++;
}
System.out.println(res);
写法3:
int res = 0;
int k = 0;
for(;;)//死循环
{
res+=k++;
if(k>100)
break;
}
System.out.println(res);
循环的总结
实际上三种循环可以相互替换
- for循环一般用于明确次数的场景中
- while循环一般用于不能明确知道执行次数的场景中
- do/while循环一般用于不能预先明确执行次数,但同时要求玄幻提至少执行一次的场景中
系统预定义类
Java5添加了java.until.Scanner类,这是用于扫描输入文本的新实用程序
nextInt()只读取int值,就是只读取整数类型的数据,如果输入了非整型的数据(浮点型字符串等)就会报错。nextFoalt nextDouble这些也是以此类推,只能读取符合该类型的数据
Scanner sc = new Scanner(System.in);
System.out.println("你的年龄是多少:");
int age = sc.nextInt();
System.out.println("年龄:"+age);