今天学习了新的知识
变量
数据类型: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;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)