目录
变量
基本类型
4型8种
1.整形:byte 占1字节 short 占2字节 int 占4字节 long 占8字节
-
Java采用补码的方式存储数据
-
4中不同的表示方式:十进制、0八进制、0x十六进制、0b二进制
-
在使用字面量,Java中整形默认类型是int,如果想表示long则在数值末尾添加
2.浮点数:float 占4字节 double 占8字节
-
在Java中浮点数无法精确存放,除非使用Java提供的类BigDecimal
-
不允许使用等值判断(==),应使用Math.abs(a-b)<le-6
-
-
字面量的表示方式:十进制 123.0 、科学计数法1.23e2,注意e后面只能是整数
-
数值末尾使用f/F表示float,d/D表示double
3.字符类型 char
-
Java中字符采用的是Unicode编码字符集,2B,对应的整数位0-65535
-
字符类型的变量可以当作整数使用
-
优先级 ‘0’<‘A’<‘a’
-
Java提供了转义字符,以反斜杠开头
** \ddd 1-3位的8进制数对应的字符
** \uxxxx 1-4位的16进制数对应的字符
** \'表示单引号,注意不允许使用 ’‘’
** \''表示双引号
** \\表示反斜杠字符
4.布尔类型 boolean
-
只有两个数值:true表示真,false表示假
-
在Java中整型数据和boolean之间没有转换
整形数的进制转换
int kk = 123;
//将十进制数转换为八进制
System.out.println("0"+Integer.toOctalString(kk));
//将十进制数转换为十六进制
System.out.println("0x"+Integer.toHexString(kk));
//将十进制数转换为二进制
System.out.println("0b"+Integer.toBinaryString(kk));
常见的数学计算
Java提供了一个Math类,其中包含了基本运算的属性和方法
-
Math.sqrt()计平方根
-
Math.pow(a,b)计算a的b次方
-
Math.abs()求绝对值
-
Math.max/min(a,b) 获取最大值/最小值
-
Math.ceil 获取距离目标最近的最小的整形数值,floor取距离目标值最近的最大的整形数值
-
Math.round 四舍五入的计算
-
Math.random() 获取一个大于或等于0.0小于1.0的随机数
int dd = 144; //开平方 System.out.println(Math.sqrt(dd)); int k1 = 12; int k2 = 3; //计算k1的k2次方 System.out.println(Math.pow(k1, k2)); int k3 = -11; //求k3的绝对值 System.out.println(Math.abs(k3)); //求最大值 System.out.println(Math.max(k2, k3)); //求最小值 System.out.println(Math.min(k2, k3)); double k4 = 5.3d ; //获取距离目标值最近的最小的整形数值 System.out.println(Math.ceil(k4)); //结果为6.0 //获取距离目标值最近的最大的整形数值 System.out.println(Math.floor(k4)); //结果为5.0 //四舍五入 System.out.println(Math.round(k4)); //获取一个大于或等于0.0小于1.0的随机数 System.out.println(Math.random());
除了简单计算以外,还有指数、对数、三角和反三角函数等方法的封装
字符类型的基本使用
char c = 'a';
System.out.println(c);
//将字符类型转换为整形
System.out.println(c+"===="+(int)c);
//转义字符
System.out.println("\123");
int k5 =0123;
System.out.println((char)k5);
int k6 = 0x0981;
System.out.println("\u0981");
System.out.println((char)k6);
char c1 = '\\';
System.out.println((int)c1);
System.out.println(c1);
基本数据类型转换
小转大自动转 大转小需强转 窄化操作
//小转大
byte b = 123;
int k = b;
long kkk = k;
double k7 = kkk;
//大转小
double a = 123;
// long b = a; 报错 Type mismatch: cannot convert from double
long cc =(long)a;
强制类型转换语法
注意:boolean类型和数值类型之间没有任何对应关系,所以进行强制类型转换会报语法错误
针对浮点数系统默认为是double,所以定义变量时识别为double,如果要变量声明为float,这里需要进行数据类型转换或者进行特殊声明
double d = 123.123
long d1 = (long)d; //强制转换
System.out.println(d1); //使用强制数据类型转换是可能导致精度丢失问题
//针对浮点数的特殊处理
float f1 = 123.46; //报错 Type mismatch: cannot convert from double to float
float f2 = 123.46; //后缀f/F表示单精度浮点数
float f3 = (float) f1;
复合数据类型
复合数据类型包括:类calss、接口interface、数组
特殊值null,在运行时并没有对应的类型,但是它可以被转化为任何复杂类型,表示没有存储数据,但是不能赋值给简单类型
复合类型的默认值就是null空指针
public class Typora {
public static void main(String[] args) {
//复合类型
Object bb; //定义bb为复合类型Object,Object类是系统预定义
// System.out.println(bb); 报错:局部变量没有被初始化
bb = null;
System.out.println(bb);
}
}
常量
常量就是指在程序执行期间值不发生变化的数据
//常量
final double PI = 3.1415926;
// PI = PI+1; 报错:PI定义为常量 其值不可以修改
System.out.println(PI);
表达式
表达式就是运算符、操作数以及方法的调用序列,用来所明某个计算过程并返回计算结果
基本运算符可以分为:算数运算符、关系运算符、位运算符、条件运算符
-
算术运算符: + - * / % ++ --
-
关系运算符: > >= < <= == 等值 != 不等于
-
逻辑运算符: &&与运算,表示并且的关系, ||或运算,表示或者的关系, !非运算,表示不是, 重点在于计算过程中支持短路操作
-
位运算:&与 |或 ^异或 ~按位取反 <<左位移 >>右位移,基本不做要求,位运算不支持短路操作
-
赋值运算符: = += -= *= /= %=
-
三目运算符: (表达式1:表达式2:表达式3)
算术运算符
+-*/
特殊:整除计算,参与计算的双方都是整数,则计算为整除计算,结果中不会有小数部分,例如 10/3=3 不是3.33333.如果10./3返回值就是3.33333...,因为10.表示浮点数,不是整除
%取余[取模]
10%3 = 1 实际上就是10除以3的余数
double k = 10.12;
System.pout.println(k%3); //输出结果为1.12,小数部分不参与除法运算
++和--都是单目运算符
i++计算结果等价于i = i + 1, i--结果等价于 i = i - 1; 【这里需要特别注意:只是计算结果相同 而不是说等价!!!】
有两种写法:以++为例,--写法实际相同
i++是先获取i的值,然后针对i执行i+1的操作
int age = 99;
System.out.println(age++); //输出值为99 先获取age值为99,输出后,进行+1操作,此时age = 100
System.out,println(age); //结果为100
++i是先进性+1操作,在获取i的值
System.out.println(++age); //结果为100 先+1操作,在获取age此时为100,系统获取后输出100
System.out.println(age); //结果为100
问题:将一个任意正整数进行反转,如果数值越界则返回-1
-
最大正整数 Integer.MAX_VALUE, 最小正整数 Integer.MIN_VALUE ----------常量
int p = 123456009;
long res = 0;
while(p>0) {
int l = p%10;
p = p/10;
res = res*10+l;
if(res > Integer.MAX_VALUE) {
res = -1;
break; //立即终止循环的程序
}
}
System.out.println(res); //输出结果为900654321 如果越界则会返回-1
如果这段代码需要多个地方使用,则需定义一个方法,其中包含处理逻辑,其他地方使用是只需要通过名称就可以进行调用
public class A1 {
public static void main(String[] args) {
int k = 200000999;
System.out.println(reverse(k));
}
public static int reverse(int x){ //自定义的方法,不会主动执行,需要在main方法中进行调用。这里可以先理解public static是固定的写法【实际上有问题】,int表示返回值类型,reverse是方法名称(可以执行定义),以后相当于需要使用这段代码的时是通过名称就可以直接调用,int x 是参数,表示调用方法时必须传入一个int类型的参数
long res = 0;
while(x > 0) {
int l = x %10;
x = x/10;
res = res*10+l;
if(res > Integer.MAX_VALUE) {
res = -1;
break; //立即终止循环的程序
}
}
return (int)res; //因为res声明为long类型,但是返回类型应该是int,所以需要强制类型转换
}
}
关系运算符
用于判断两个数据之间的大小关系,计算结果就是boolean值,如果成立则返回true,否则返回false
<小于 >大于 >= 大于等于 <=小于等于 == 等于 !=不等于
double d = 10;
System.out.println(d>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
&&与运算,表示并且
同真则真,其余为假
age>18 && age<65 age = 25由于两个条件都成立,所以计算结果为真
|| 或运算,表示或者
同假则假,其余为真
age>18 || age<65 age = 125由于age >18 成立所以返回结果为true
! 非运算,不是否则
非真则假,非假则真
考试重点:短路计算
例如:A&&B,如果条件A为false,不管B是true还是false,则计算结果一定是false,这种情况下计算结果和B没有任何关系(&&表示并且,同真为真),所以计算时不执行B,直接返回false
A||B,如果条件A为true,则不需要计算B,直接返回true(||表示或者,有真则真),计算结果和B没有直接关系
int age1 = 100;
char AA = 'A';
System.out.println((int)AA);
System.out.println((int)'B');
if(AA > 'B' && age<200 ) { //因为第一个条件不成立 所以直接输出条件为假,后边age<200不需要进行判断
System.out.println("条件成立");
}
System.out.println("条件为假");
赋值运算符
*= += -= = /= %=
int k = 10;将10赋值存储在k对应的存储单元中
k = k+1 可以简化为k+=1,其他的运算含义一致
考点:
short kkkk = 3;
kkkk = kkkk+3; //报错:类型不匹配:不能从int转换为short kkkk+3中的3被系统自动识别为int类型,所以计算结果自动转换为int。但是int类型不能直接给短整型变量直接赋值
kkkk = (short) (kkkk+3);
//另外写法
short k = 3;
k+=3;
结构化编程
指导思想:自顶向下、逐步求精、模块化
编程过程
流程图时使用画图的方式来说明某个过程,常见的离线绘图工具有Visio或者PowerDesigner等;目前还有在线的绘图工具有ProcessOn等
-
圆角矩形表示一个流程图的开始或者结束点
-
矩形用于表示行动方案或者普通额工作环节
-
菱形用于问题的分支判断或者审核、审批之类的判断环节
-
平行四边形表示处理流程中额输入或输出
-
箭头线用于表示工作流的方向
结构化编程的推论
任何复杂的问题都可以使用三种基本算法结构来描述:顺序、选择和循环
条件分支语句
Java提供了两种判断语句if和switch,这两种语句用于实现条件判断,当复合某些条件时执行某段代码,否则不执行
if结构
语法:
当条件成立时执行代码段,如果条件不成立则不执行代码段,而是执行if后面额下一句
if(条件判断语句){
代码段1:
}else{
代码段2:
}
//当条件成立时执行代码段1,如果条件不成立则执行代码段2,无论如何至少执行一个代码段
允许if/else结构进行嵌套
if(条件1){
代码段1:
}else if(条件2){ //隐含条件实际上是条件1不成路并且条件2成立
代码段2;
}else if(条件n){
代码段n;
}else{
代码段n+1;
}
要求:
输入学生性别,如果false则显示女
Scanner sc = new Scanner(System.in);
boolean bb1 = sc.nextBoolean();
if(bb1 == false) {
System.out.println("性别为女");
}
要求:输入学生成绩,假设成绩都是整数,如果>60显示及格,否则显示不及格
Scanner sc = new Scanner(System.in);
int q = sc.nextInt();
if(q>60) {
System.out.println("你的成绩为及格");
}else {
System.out.println("你的成绩不及格");
}
要求:输入学生成绩,假设成绩全为整数,成绩>=85为优秀,>=75为良好,>=60为及格,否则显示不及格
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if(score >= 85){
System.out.println("你的成绩为"+score+"等级优秀");
}else if(score >= 75){
System.out.println("你的成绩为"+score+"等级良好");
}else if(score >= 65){
System.out.println("你的成绩为"+score+"等级及格");
}else{
System.out.println("你的成绩不及格!!!");
}
这里的判断顺序不能进行调整,例如先判断>=70,在判断>=85
这里的潜在含义为:条件1不成立时才执行条件2的判断,如果条件1成立则不会执行条件2的判定
开关分支语句
swtich(表达式){
case 值1: 计算表达式的值是否等于值1,如果相等则执行代码块1
代码块; break; 执行完毕后,如果没有break则继续向下执行,但是不做判断。如果有break语句则立即终止switch的执行,跳转到switch结构后的下一句开始执行
case 值2:
代码块2; break;
... ...
dafault: 当所有的case都不能成立时,则执行代码块n
代码块n; [break];
}
语法点:【考核点】
-
表达式的计算结果可以是整数【不允许是long类型】,可以是char,同时还允许字符串类型
-
dafault的位置实际上没有什么特殊要求,但是一定是所有的case值都不相等是才会执行。在具体的开发中为了增强代码的可读性,一般建议写在所有case语句之后
要求:输入月份,显示对应的本月的天数
-
1 3 5 7 8 10是31天
-
4 6 9 11是30天
-
2月闰年29天,平年28天
-
如果一个年份值可以被4整除,同时不能被100整除,或者能被400整除就是闰年
Scanner sc =new Scanner(System.in);
int mouth =sc.nextInt();
switch(mouth) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
System.out.println("本月天数为31天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println("本月30天");
break;
case 2:
System.out.println("请输入年份:");
int year = sc.nextInt();
if(year%4 == 0 && year%100!=0 || year%400 == 0) {
System.out.println("本月28天");
}else {
System.out.println("本月29天");
break;
}
default:
System.out.println("输入的年份有误");
break;
}
循环结构
循环就是重复做一件事,在Java程序中,循环控制就是某一个条件下,控制程序重复执行某一个代码段,直到遇到终止条件为止
循环结构也就称为迭代语句,在Java语言中while、for、和do ...while三种循环语句
while循环
while循环时Java中最基本的语句,满足条件才执行循环体,如果不满足则不执行,所以可能循环体执行多次,也可能一次都不执行
*while(条件) {执行语句} * 当条件成立时反复执行语句,知道条件不成立为止
需求:1+2+3+…+100
int res = 0;
int k = 0;
while(k<100){ //使用0比较 累加使用1
k++;
res = res+k;
}
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循环
先执行循环体,然后进行条件判单,如果条件为真,则执行下次循环;否则终止循环
不同于while循环的特征:do/while循环至少需要执行一次循环;然而while有可能一次都不执行循环体
do{
循环体
}while(条件);
实现
int res = 0;
int k = 1;
do{
res+=k++;
}while(K<100){
System.out.println(res);
}
需求:求100以内所有偶数的和
int res = 0;
int k = 0;
do {
k++;
if(k%2==0) {
res+=k;
}
}
while(k<100);
System.out.println(res);
}
for循环
基本循环流程:1.执行表达式1。2.执行表达式2,一般表达式2是一个条件判断,如果值为true则执行循环体,否则终止循环。3.执行完循环体后在执行表达式3。4、只执行表达式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并不是必须的 【由于只是小白,代码不在此展示,各路大神可以自行编译运行】
循环总结
实际上三种循环可以相互迭代
for循环一般用于可以明确循环次数的场景中
while循环一般用于不能明确知道执行次数的场景中
do/while循环一般用于不能预先明确循环次数,但是同时要求循环体至少运行一次的场景中
系统预定义类
java5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序
nextInt()只读取int值,就是只能读取类型的数据,如果输入了非类型的数据(浮点型字符串等)就会报错。nextFloat、nextDouble这些也是以此类推,只能读取符合该类型的数据
Scanner sc = new Scannner(System.in); //可以理解为获取标准输入设备的引用,用于接收用户的键盘录入
//为了针对用户优化,所以一般输入之前需要对用户进行提醒
System.out.println("请输入您的年龄为:");//在控制台上输出提示信息
int age = sc.nextInt();//这里需要接受一个int类型数据
System.out.println("年龄"+age);
注意在class类定义上方应该添加 import java.util.Scanner ;