一、Java中的数类型分为两种:
- 基本数据类型
- 引用数据类型
基本数据类型
基本数据类型大致可以分为4种八类
4种
整型、浮点型、字符型和布尔型
八类
整型(byte、short、int、long)默认类型为int类型
浮点型(float、double) 默认类型为double类型
字符型(char)
布尔型(boolean)
基本数据类型各个类型的取值范围(其中大小指在存储过程中需要占的二进制位)
引用数据类型
引用数据类型包括数组、类和接口(后面会详细介绍)
二、Java中的标识符
定义:标识符是用来标识某个对象(变量名、常量名、函数、类名、包名、接口名等)的名称
标识符的命名规则
标识符可以有字母、数字、下划线和$中的任意字符组成
标识符首字母必须是字母、下划线或$,绝不能以数字开头
标识符的命名要有一定的意义,不能使用关键字作为标识符(关键字下面会介绍到)
标识符严格区分大小写
Java中每个对象的命名规范
包名(多单词组成时所有字母都小写 如:xxxyyyzzz)
类名和接口名(多单词组成时,每个单词的首字母都大写 如:XxxYyyZzz )
变量名和函数名(多单纯组成时,第一个单词的首字母小写,以后每个单词的首字母都大写 如:xxxYyyZzz)
常量名(多单词组成时,每个单词都大写,单词与单词之间使用下划线隔开 如:XXX_YYY_ZZZ)
三、Java中的关键字
定义:被Java赋予了特殊含义的单词
特点:关键字中所有字母都小写
常用关键字分类
用于定义数据类型的关键字(byte、short、int、ling、float、double、char、boolean、class、interface、void)
用于定义数据类型值得关键字(null、false、true)
用于定义流程控制语句的关键字(if、else、switch、case、default、break、return、do、 while、for、continue、try)
用于定义访问权限修饰符的关键字(public、private、protected)
用于定义修饰类、变量、函数修饰符的关键字(static、final、abstract)
用于定义类与类,类与接口之间关系的关键字(extends、implements)
用于定义建立实例及引用实例,判断实例的关键字(this、super、new、instanceof)
用于处理异常的关键字(try、catch、finally、throw、throws)
用于包的关键字(package、import)
四、Java中的常量
定义:常量表示不能被改变的数值
Java中常量的分类:
1,整数常量。所有整数
2,小数常量。所有小数
3,布尔型常量。较为特有,只有两个数值。true false。
4,字符常量。将一个数字字母或者符号用单引号( ' ' )标识。
5,字符串常量。将一个或者多个字符用双引号标识。
6,null常量。只有一个数值就是:null
Java中对于整数的三种表现形式
十进制 0-9,满十进一
八进制 0-7 满八进一 开头用0标识
十六进制 0-9,A-F,满十六进一,用0x开头标识
进制的基本转换
十进制转二进制
原理:其实就是除以2的过程把每次除以2得到的余数连接。如图:
15的二进制表现形式为:1111
十进制转八进制
原理:其实就是用三个二进制位代替一个八进制位
十进制转十六进制
原理:其实就是用四个二进制位代替一个八进制位
负数的二进制表现形式
原理:其实就是该数的二进制取反再+1
五、Java中的变量
变量的概念
变量指的是内存中的一块存储区域,该区域有自己的名称(变量名)和类型(数据类型),该区域的数据可以在同一类型范围内不断变化
为什么要定义变量?
因为变量可以重复的用来存放同一类型的常量
变量的作用范围
变量的作用范围只在该“{}”中有效
定义变量的格式
数据类型 变量名 = 初始化值;
注意:变量的格式是固定的,变量就如同数学中的未知数
六、数据类型转换
Java中常见的两种转换方式
自动类型转换(隐身类型转换)
强制类型专换(显式类型转换)
自动类型转换
定义:容量小的数据类型与容量大的数据类型进行计算,默认转换为容量大的类型;
如:short + int = int;
数据类型按照容量的大小排序为:
byte、short、char、> int > long > float > double
注意:byte、short运算时不能喝char之间互相转换,byte可以赋值给short,但是他们三个在计算时会首先转换为int类型
强制类型转换
定义:容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出,所以使用时要格外注意
如 short = int; 如果出现这种情况是会出现编译报错的,应使用强制转换符把int 强制转换为 short 如: short = (short) int;
注意:当有多种类型的数据混合运算时,系统会自动的将所有数据转换为容量里最大的哪一种数据类型,然后在进行计算
强制转换符格式:(数据类型)(要被转换的数据)byte b =(byte) short;
类型转换时有字符型参与运算
当有字符参与运算时,系统首先回去找对应的ASCII码值,然后在参与运算 如 ‘a’ + 6 = 103
注意:int类型是可以赋值给char类型的 如 char a = (char) 97;
ASCII码表:
七、Java中的运算符
常见的几种运算符
算术运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
三元运算符(条件运算符)
运算符的优先级
说白了就是 算术运算符 > 位运算符 > 比较运算符 > 逻辑运算符 > 条件运算符 > 赋值运算符
算术运算符(+、-、*、/、%、++、- -)
%
定义:取模(取余)运算符,用于获取余数、
小技巧:
当左边的绝对值小于右边,结果为左边
当左边的等于右边,或是右边的倍数时,结果为0;
当有正负数时,余数是正数还是负数取决于左边,左边为正数,则余数为正数,左边为负数,则余数为负数
++、- -
定义:就是递增或递减运算符,相当于+1或—1,++、——可以在操作数的前面也可以在操作数的后边 如:x++就等同于x+1;
使用技巧:
单独存在时:放在操作数的前面和后面,结果一样
参与运算时:
++、——放在变量的前面,是先自增或自减1,在参与其他运算
++、——放置在变量的后面,是先参与运算,后再自增或自减1
不管++、——在前还是在后,操作数都会+1或—1;
+
“+”号的两种不同的作用
当“+”号两边都为整型没有字符串参与运算时:此时“+”号是做求和运算
当“+”号两边有字符串参与运算时:此时“+”号是做连接使用,是在原有的字符串的基础上追加另一个字符
赋值运算符(+=、—=、/=、*=、%=、=)
定义:把运算符左边和右边的和(积、商、差、求余)赋给左边 如: int x=5; x+=5;等同于 x = x+5;
关于 short x = 5; x = x+5和x+=5;的区别:
这个问题就要牵扯到类型转换了,试过的朋友肯定都知道“x = x+5”会出现编译报错,而“x+=5”却不会报错,为什么呢?先说说“x = x+5”吧,因为x原本为“short”类型,而在计算时系统是先进行的加法运算(也就是先计算的x+5),所以根据当容量小的数据类型与容量大的数据类型进行计算时,会自动转换为容量大的类型(5为整型,整型默认是int类型),所以此时“=”右边的数据类型已经自动提升为了"int"类型,而“=”两边的类型不一致,当然会编译报错了,所以“x = x+5”是需要强制类型转换的。
而"x+=5"是单纯的赋值预算,虽然上面说相当于“x = x+5”,但是本质上还是有区别的,它自带的有一个自动类型转换动作,所以不会报错
比较运算符(==、!=、>=、<=)
比较运算符的结果只有连个值,要么“true”,要么“false”
逻辑运算符(&、&&、|、||、!、^)
逻辑运算符&和&&
true &(&&) true = true
true &(&&) false = false
false &(&&) false = false
false &(&&) true = false
相同点:只要表达式的结果有一边为false,则结果为false,只有两边都为true时,结果才为true。
不同点:
1、在效率上:
单&,无论左边表达式结果为true还是false,右边都参与运算
双&,当左边表达式结果为false时,右边不参与运算
2、在作用域上:
单&,一般不用于条件运算中,通常作为位运算使用,而得到的结果是二进制结果
双&,一般用于条件运算中,得到的结果是布尔型
逻辑运算符|和||
true |(||) true = true
true |(||) false = true
false |(||) false = false
false |(||) true = true
相同点:只要表达式的结果有一边为false,则结果为false,只有两边都为true时,结果才为true。
不同点:
1、在效率上:
单|,无论左边表达式结果为true还是false,右边都参与运算
双|,当左边表达式结果为false时,右边不参与运算
2、在作用域上:
单|,一般不用于条件运算中,通常作为位运算使用,而得到的结果是二进制结果
双|,一般用于条件运算中,得到的结果是布尔型
逻辑运算符^
true ^ true = false
true ^ false = true
false ^ false = false
false ^ true = true
^:两边相同结果为false,不同结果为true
位运算符(<<、>>、>>>、&、|、^、~(反码))
位运算符<<(左移)
原理:其实就是乘以2的位移次幂 注意:位移后会出现左边空出的情况,此时用“0”补齐即可
图例:
位运算符>>(右移)
原理:其实就是除以2的位移次幂 注意:位移后会出现右边空出的情况,此时,应看此二进制的最高位,最高位如果是“1”,则用“1”补齐空位,如果是“0”,则用“0”补齐空位
图例:
位运算符>>>(无符号右移)
原理:其原理和右移(>>)原理相同,需要注意的是,位移后无论二进制的最高位是“0”还是“1”,都用“0”补齐 (位运算时建议使用无符号右移)
位运算符&、^、|和~(反码)
&:二进制位进行&运算,只有1&1时才为1,否则都为0;
|:二进制位进行|运算,只有0 | 0时才为0,否则都为1;
^:二进制位进行运算,只有当1 ^ 1和 0 ^ 0时才为0,否则都为1
反码:对二进制进行取反
^的应用:
^能实现互换的原理class Demo { //需求:对两个整型进行互换 public static void main(String[] args) { //第一种方式:使用第三方变量实现互换 int a = 5,b = 10,temp = 0; temp = a; a = b; b = temp; //第二种方式:不使用第三方变量,利用两个数之间的和与差完成互换 int a1 = 5,b1 = 10,temp1 = 0; a1 = a1+b1; //结果为15 b1 = a1-b1; //结果为15-10 = 5; a1 = a1-b1; //结果为15-5 = 10; //第三种方式:不使用第三方变量,利用逻辑运算符^实现互换 int a2 = 5,b2 = 10,temp2 = 0; a2 = a2^b2; b2 = a2^b2; //他就相当与(a2^b2)^b2 a2 = a2^b2; //它就相当于(a2^b2)^((a2^b2)^b2) } }
三元运算符
格式:(条件表达式)? 表达式1 :表达式2;
如果“条件表达式”的结果为“true”,则运算后的结果为“表达式1”,如果“条件表达式”的结果为“false”,则运算后的结果为“表达式2”
示例:
class Demo { //使用三元运算符,求两个数之间的最大数 public static void main(String[] args) { int a = 5,b = 10,c = 0;; c = a>b?:a:b; //如果a>b成立 c = a;如果a>b不成立 则c=b; System.out.println(c); } }
八、流程控制语句
流程控制语句大致分为三种结构:判断结构、选择结构、循环结构
class Demo01 { /** *流程控制语句 * 定义:流程控制语句是控制程序中各语句顺序的语句 */ public static void main(String[] args) { //由于属于一个知识点,就直接写在一个main方法中了 /** 三种常用的流程控制语句 1、判断结构 2、选择结构 3、循环结构 */ /* --------判断结构-------- 常用的几种格式: 1、if(条件表达式){ 执行语句; } 2、if(条件表达式){ 执行语句; } else{ 执行语句; } 3、if(条件表达式1){ 执行语句 } else if(条件表达式2){ 执行语句; } else{ 执行语句; } 4、if(条件表达式1){ if(条件表达式2){ 执行语句 } else{ 执行语句; } } else{ 执行语句; } */ //第一种 if int x = 5; if(x == 5){ /*当“x == 5”成立,则执行该语句,反之则跳过“{}中的语句块,直接执行后面的其他代码” System.out.println("条件成立,该语句成功执行"); } //第二种 if else if(x == 5){ //当“x==5”成立,执行该语句 System.out.println("条件成立,该语句成功执行"); } else{ //当条件不成立时,执行该语句 System.out.println("条件不成立,该语句不执行"); } //第三种 if else if else if(x > 5) System.out.println("x > 5成立,执行该语句"); else if(x < 5) System.out.println("x < 5成立,执行该语句"); else System.out.println("前面条件都不成立时,执行该语句"); //第四种 嵌套 int m =6; if(x < 10){ if(m == 6){ System.out.println("当x < 10并且m == 6时执行该语句"); } else{ System.out.println("当x < 10并且m != 6时执行该语句"); } } else{ System.out.println("当x < 10不成立时执行该语句"); } /* --------选择结构-------- 格式: switch(条件表达式){ case 匹配值1: break; case 匹配值2: break; .... default: break; } */ switch(x){ case 2: System.out.println("x="+x); break; case 3: System.out.println("x="+x); break; case 4: System.out.println("x="+x); break; case 5: System.out.println("x="+x); break; case 6: System.out.println("x="+x); break; default: System.out.println("x="+x); break; /*注意:使用switch选择结构时, 1、条件表达式的结果只能是byte、int、short、char 2、case和default是没有书写顺序的,当没有匹配的case时,执行default 4、结束switch语句的方法有两种:遇到break或者执行到switch语句结尾 3、case或default后面的break是可以省略的,当时当如果匹配的case或default没有对应的break, 那么程序会继续往下执行,直到程序遇到break或者结束 */ } /* --------循环结构-------- 常用的三种格式 1、while(条件表达式){ 循环体; } 2、do{ 循环体; }while(条件表达式); 3、for(表达式1; 条件表达式; 表达式2){ 循环体 } */ //第一种: while(); while(x<=10){ //循环体 System.out.println("x="+x); x++; //使用x自增控制循环次数,防止死循环 } //第二种: do while(); do{ //循环体 System.out.println("x="+x); x++; //使用x自增控制循环次数,防止死循环 }while(x<=10); /*注意:while和do while是由区别的,while是先判断后执行,而do while是先执行后判断, 也就是说,使用do while时,无论条件是否成立,循环体都会执行一次 */ //第三种: for(); for(System.out.println("a"); x<=7;System.out.println("c"),x++){ System.out.println("b"); } /* 总结:通过运行程序发现控制台打印结果为:abcbcbc 所以在使用for循环时应注意:for循环的执行顺序是 先执行“表达式1”,然后再判断“条件表达式”是否成立, 如果成立,则执行循环体,然后再执行“表达式2” 然后再判断“条件表达式”是否成立,成立在执行循环体然后..... 但是当“条件表达式”不成立时,会结束循环 */ /* -------语句的嵌套应用-------- 1、打印 * ** *** **** ***** 2、打印 ***** **** *** ** * 3、打印 1 1 2 1 2 3 1 2 3 4 1 3 3 4 5 4、打印 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 第四题图例: 7777778888881 77777888881 2 1 777788881 2 3 2 1 7778881 2 3 4 3 2 1 77881 2 3 4 5 4 3 2 1 781 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 7 6 5 4 3 2 1 5、打印99乘法表 规律:尖朝上,改变内循环的条件,让条件随着外循环变化, 尖朝下,改变内循环的初始化值,让初始化值随着外循环变化 */ //第一题: for(int x = 0; x<5; x++){ //用于控制行数 for(int i = 0; i<=x; i++){ //用于控制每一行打印“*”的个数 //此处不能换行 System.out.print("*"); //用于打印“*” } //等内循环循环完毕后,打印换行 System.out.println(); //每打印一行,换行 } //第二题 for(int i= 0; i<5;i++){ //用于控制行数 for(int x=i;x<5;x++){ //用于控制每一行打印“*”的个数 System.out.print("*"); //用于打印“*” } System.out.println(); //每打印一行,换行 } //第三题 for(int i=1;i<=5;i++){ //用于控制行数 for(int x=1;x<=i;x++){ //用于控制输出的数字及个数 System.out.print(x+" "); //用于按顺序输出每个数字 } System.out.println(); //输出换行 } //第四题 for(int x=1;x<=7;x++){ //用于控制行数 for(int j=0;j<7-x;j++){ //用于输出空格 System.out.print(" "); } for(int i=1;i<=x;i++){ //用于控制左边数字的输出 System.out.print(i+" "); } for(int k=x-1;k>=1;k--){ //用于控制右边数字的输出 System.out.print(k+" "); } System.out.println(); //输出换行 } //第五题打印99乘法表 for(int i=1;i<=9;i++){ //用于控制行数 for(int j=1;j<=i;j++){ //用于控制每列输出的口诀 System.out.print(j+"*"+i+"="+i*j+"\t"); } System.out.println(); //用于输出换行 } /* --------使用循环完成累计求和、计算器操作------ 1、需求:使用循环求1-50之间的和 2、需求:使用循环找出1-100之间包含“7”的个数 3、需求:使用循环找出1-100之间7的倍数的个数 */ //求1-50之间的和 int sum=0; for(int i=1;i<=50;i++){ sum+=i; } System.out.println(sum); //求1-100之间包含7的个数 int index = 0; for(int i=1;i<=100;i++){ //定义循环,对1-100进行遍历 //把遍历到的数字转换为String类型 String num = i+""; //使用String的contains方法查询该字符串中是否包含“7” if(num.contains("7")){ //如果包含则让次数+1; index++; } } System.out.println("1-100之间包含7的个数为"+index); //求1-100之间7的倍数的个数 int index_1 = 0; for(int i=1;i<=100;i++){ //定义循环,对1-100进行遍历 //判断是否是7的倍数 if(i%7==0){ //如果是则次数+1 index_1++; } } System.out.println("1-100之间包含7的倍数的个数为"+index_1); } }