今天学习了新的知识
变量
数据类型:Java是一种强类型编程语言
生命周期:有效范围。Java提供了垃圾回收机制
`int kk=100;
Java中的数据类型可以分为两大类型:基本类型【原生】和引用类型【复杂】
基本类型
4型八种
1.整型:byte 1、short 2、int 4、long 8
Java采用补码的方式存储数据
4种不同的表示方法:十进制、0八进制、0x十六进制、0b二进制
在使用字面量,Java中的整数默认类型就是int,如果想表示long则在数值末尾添加l/L,一般建议使用L
2.浮点数: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.to0ctalstring(kk));//在控制台上输出参数内容
//将十进制数转换成16进制
System.out.println("0X"+Integer.toHexString(kk));
//将十进制转换成2进制
System.out.println("0b"+Integer.toBinaryString(kk));
常见的数学计算
Java提供了一个Math类,其中包含了基本运算的属性和方法
Math.sqrt()计算平方根
Math.pow(a,b)计算a的b次方
Math.abs()求绝对值
Math.max/min获取最大值/最小值
Math.ceil获取距离目标值最近的最小的整数型值,floor取距离目标值最近的最大的整形数值
Math.round四舍五入的计算
Math.random获取一个大于或者等于0.0小于1.0的随机数
double dd=144.d;
System.out.println(Math.sprt(dd));//开平方
int k1=12;
System.out.println(Math.pow(k1,2));//计算K1的2次方
System.out.println(Math.pow(dd.0.5));
k1=-123;
除了简单计算之外,还有指数、对数、三角和反三角函数等方法的封装。
字符类型的基本使用
char c='a';
System.out.println(c);
c++;//给C+1,计算结果等价于c=c+1,但是这里涉及数据类型转换的问题,所以c=c+1会报语法错误
System.out.println(c);
//将字符类型转换成整数
System.out.println((int)c);
c='中';
System.out.println(c+"==="+(int)c);
//转义字符
System.out.println('/123');
int kk=0123;//0开头的表示8进制数
基本数据类型转换
小转大 自动转 大专小需强转 窄化操作
//小转大
byte b1=123;//自动识别123为byte类型,但是如果超出范围就会主动报错
long k1=b1;
double k2=k1;
//大转小
double d1=123.456;
long k1=d1;//语法错误Type mismatch:cannot convert from double to long
long k2=(long)d1;
强制类型转换的语法(目标类型)变量
注意:boolean 类型和数值类型之间没有任何对应关系,所以进行强制类型转换会报语法错误
boolean bb=true;
System.out.println((int)bb);
int kk=123;
System.out.println((boolean)kk)
浮点数的特殊处理
针对浮点数系统默认的是double类型,所以123.456系统识别为double类型但是变量f1声明为float,所以这里需要进行数据类型转换或者进行特殊声明
double d1=123.456;
//long k1=d1;
long k1=((long)d1);//强制类型转换
System.out.pirntln(k1);//使用强制类型转换可能会导致精度丢失等问题
//针对浮点数的特殊处理
//float f1=123.456;语法报错
float
float f1=123.456f;//f/F表示单精度浮点数 D/d表示双精度浮点数
float f2=(float)123.456;
复合数据类型
复合数据类型包括:类class 接口interface 数组
特殊值null 在运行时并没有对应的类型 但是它可以被转换为任何复杂类型 表示没有存储数据 但是不能赋值给简单类型
复合类型的默认值就是null空指针
public class Test5{
public static void main(string[] args){
object bb;//定义变量bb为复合类型object,object类是系统预定义
bb=null;
System.out.println(bb);
}
}
常量
常量就是指在程序执行的期间其值不能发生变化的数据
表达式
表达式就是运算符、操作数以及方法的调用序列,用来说明某个计算过程并返回计算结果。
基本运算符可以分为:算数运算符、关系运算符、位运算符、条件运算符
算数运算符 + - * / ++ –
关系运算符 > >= < <= == !=
逻辑运算符 && || !
位运算 & | ^ ~ << >> >>>
赋值运算符 = += *= /= %=
三目运算符 (表达式1?表达式2:表达式3)
+-*/
特殊:整除运算,参与计算的双方都是整数,则计算为整除运算,结果不会有小数部分,例如
10/3=3,不是3.3333.如果10./3返回值就是3.333...因为10.表示是浮点数,不是整除
%取余【取模】
10%3=1 实际上是10除以三的余数
double k=10.12;
System.out.println(k%3);//输出结果为1.12 小数部分不参与除法计算
++和--都是单目运算符
i++是先获取i的值 任何针对i执行+1操作
int age=99;
System.out.prinln(age++);//输出值是99
System.out,prinln(age);//没有任何运算符 但是输出值是100
++i是先对i执行+1操作 然后再获取i存储的数据
int age=99;
System.out.println(++age);//输出值为100,是因为先执行加1再获取数据
System.out.println(age);//100
问题:将一个任意正整数进行反转,如果数值越界则返回-1
最大整数Integer.MAX_VALUE,最小整数Integer.MIN_VALUE—常量
public class Test7{
public static void main(string[] args){
int k=2000009999;
long res=0;
while(k=0){
int p=k%10;
k=k/10;
res=res*10+p:
if(res>Integer.MAX_VALUE){
res=-1;
bresk;立即终止循环的执行
}
}
System.out.println(res);
}
}
如果这段代码需要多个地方使用,则需要定义一个方法,其中包含处理逻辑,其他地方使用时只需要通过名称就可以调用
public class A1{
public static void main(string[] args){
int k=200009999;
System.out.println(reserve(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;
bresk;
}
}
return(int)res;//因为res声明的类型是long类型 但是返回类型应该是int类型,所以要强制类型转换
}
}
关系运算符
用于判断两个数据之间的大小关系,计算结果就是boolean值,如果成立则返回true,否则返回false
大于 <小于 >=大于等于 <=小于等于 ==等于 !=不等于
double d1=10;
System.out.println(d1>3);//返回true
==和=的区别
k=100;这是一个赋值运算 就是将=右边的计算结果赋值给=左边的变量
k==100;这是比较运算 判断K值是否值为100,如果是返回true 否则false
由于浮点数无法精确存放 所以判断k==1.0写法是错误的,正确写法应该是Math.abs(a-b)<1e-6
逻辑运算符
用于表达多个条件之间的关系,例如年龄大于18并且小于65:
age>18&&age<65
考试重点:短路运算
例如A&&B,如果条件A为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)//第一个表达式为false 所以第二个表达式必须进行运算
system.out.println("xxxxxx");
System.out.println(age);//或运算结果值为101,与运算结果为100,因为与运算进行了短路操作
条件分支语句
Java提供了两种判断语句if和switch,这两种语句用于实现条件判断,当符合某些条件时执行某段代码
否则不执行
if(条件判断语句){
代码段;
}
当条件成立时执行代码段1,如果条件不成立执行代码段2,无论如何至少有一个代码段执行
if(条件判断句){
代码段1;
}else{
代码段2;
}
允许if/else结构进行嵌套
if(条件1){
代码段1;
}else if(条件2){//隐含条件实际上是条件1不成立并且条件2成立
代码段2;
}else if...{
代码段N;
}else{
代码段n+1;
}
需求:要求输入学生性别,如果false则显示女
Scanner sc=new Scanner(System.in);
boolean bb=sc.nextBollean();//接受boolean类型的数据
if (bb==false){
System.out.println("性别为女");
}
开关分支语句
switch(表达式1){
case 值1://计算表达式的值是否等于1,如果相等则执行代码块1
代码块1;berak;//执行完毕后,如果没有break则继续向下执行,但是不做判断。如果有break语句则立即终止switch的执行,跳转到switch结构后的下一句开始执行
case 值2:
代码块2;break;
......
default:当所有的case都不能成立时,则执行代码块n
代码块n;[break;]
}
需求:输入月份、显示对应的本月天数
1、3、5、7、8、10、12是31天
4、6、9、11是30天
2月闰年29天,平年28天
如果一个年份值可以被4整除,同时不被100整除,或者能够被400整除就是闰年
System.out.println("请输入月份");
Scanner sc=new Scanner(system.in);
int month=sc.nextInt();//读取用户键盘录入的月份值
switch(month){
case 1;
case 3;//如果输入为3 首次判断是否为1,如果不是继续二次判断,是否为3,如果等于3则不会再进行判断,注意3这里没有break语句,所以继续执行,但是执行并不是判断,直到执行sysout控制台输出break为止
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;
default:
system.out.println("月份输入错误!");
break;
}
循环结构
循环就是重复做某一件事情,在Java程序中,循环控制就是某一条件下,控制程序重复执行某一代码段,知道遇到终止条件为止。
循环语句也可以成为迭代语句,在Java语言中存在while、for和do…while三种循环语句
需求:计算1+2+3+…+100=5050
while循环
while循环是Java中最基本的循环结构,满足条件才执行循环体,如果不满足则不执行,所以有可能循环体执行多次,也有可能一次都不执行
while(条件){执行语句:}
当条件成立时反复执行语句,直到条件不成立为止
int res=0;//累加器用于存放每次循环体的执行结果
int k=1;//控制循环次数
while(k<=100){//k<101
res+=k++;//res=res+k; k++; 这里的循环体因为只有一条语句,所以外面的{}可以省略
}
system.out.println("1+2+3+...+100="+res);
写法一:
int res=0;
int k=0;
while(k++<100)
res+=k;//使用0进行比对,累加的值是1
system.out.println(res);
写法二:
int res=0;
int k=0;
while(++k<=100)
res+=k;
system.out.println(k);
写法三
int res=0;
int k=1;
while(true){//因为表达式的值一直为true 表示一直执行下去,就是死循环,永远不能退出循环,所以需要人为退出循环体
res+=k;
//人为控制退出循环体,如果没有这个break就是死循环
if(++k>100)
break;//break表示终止循环的执行,跳出循环体
}
system.out.println(res);
break和continue的用法
需求:计算100以内的奇数和
最直接的思路:奇数相加 偶数跳过
int res=0;
int k=0;
while(true){
if(++k>100)
break;//避免死循环
if(k%2==0)
continue;//终止本次循环,直接进入下次循环,不会执行后续代码,直接返回到语句3
}
res+=k;
}
system.out.println(res);//输出累加结果值
break是立即终止循环,进入循环结构的后续代码继续执行,循环体结束
continue是终止本次循环 进入下一次循环,循环并没有结束
do/while循环
先执行循环体,然后进行条件判断,如果条件为true,则执行下次循环;如果条件为false则终止循环。
不同于while循环的特征:do/while循环至少需要执行循环体一次;而while循环有可能一次都不执行循环体
do{
循环体
}while(条件);
实现
int res=0;
int k=1;
do{
res+=k++;//res=res+k;k++
}while(k<=100);
system.out.println(res);
for循环
基本执行流程:1.执行表达式1. 2.执行表达式2。一般表达式2是一个条件判断,如果值为true则执行循环体,否则终止循环体的进行。3.执行完循环体后执行表达式3. 4.再次执行表达式2以判断是否执行循环体。在整个循环的执行过程中表达式1执行且只执行1次
for(表达式1;表达式2;表达式3){
循环体;
}
实现
int res=0;
for(int k=1;k<=100;k++){
res+=k;
}
system.out.println(res);
特殊写法:这里的表达式1、2、3都不是必须的
int res=0;
int k=1;
for(;k<=100;k++)
res+=k;
写法2
int res=0;
int k=1;
for(;k<=100;)
res+=k++;
写法3
int res=0;
int k=1;
for(; ;){//死循环
res+=k++;
if(k>100)
break;
}
循环的总结
实际上三种循环可以互相替代
for循环一般用于可以明确循环次数的场景中
while循环一般用于不能明确知道循环执行次数的场景中
do/while循环一般用于不能预先明确循环次数,但是同时要求循环体至少执行一次的场景中
系统预定义类
nextInt()只读取Int值,就是只能读取整数类型的数据,如果输入了非整型的数据(浮点型字符串等)就会报错。nextFloat、nextDouble这些也是以此类推,只能读取符合该类型的数据
Scanner sc=new Scanner(System.in);//可以理解为获取标准输入设备的引用,用于接受用户的键盘录入
//为了针对用户优化,所以一般输入之前需要对用户进行提示
System.out.println("您的年龄是多少岁?");//在控制台上输出提示信息
int age=sc.nextInt();//这里需要接收一个Int类型的数据,如果不能转为Int类型,则会报错
System.out.println("年龄:"+age);
注意在class类定义的上方应该添加import java.until.scanner;