-
定义及特点
-
注释是在程序指定位置添加的说明性信息
-
注释不参与程序运行,仅起到说明作用
-
-
注释有三类,分别是单行注释,多行注释,文档注释
单行注释的格式: // 注释信息
多行注释的格式:
文档注释的格式(这个只要理解现在用不到):格式:
-
定义
关键字:就是被Java语言赋予了特定含义的单词。比如pubilc,void,等,有50多个。但是像System这样的是类,不是关键字
-
特点
-
关键字的字母全部小写。
-
常用的代码编辑器,针对关键字都是有特殊的颜色标记,非常直观。如图,这几个框起来的都是关键字
-
-
定义
- 常量:在程序运行过程中,其值不可以发生改变的量。是一个定值。比如123这个数字就是常量。
-
常量的分类
常量有下面6种:(值得注意的是:true和false既是常量又是关键字)
常量类型 说明 举例 字符串常量 用双引号括起来的内容 “HelloWorld”,“中国” 整数常量 不带小数的数字 666,-88 小数常量 带小数的数字 13.14,-5.21 字符常量 用单引号括起来的内容 ‘A’,‘0’, ‘我’ 布尔常量 布尔值,表示真假 只有两个值:true,false 空常量 一个特殊的值,空值 值是:null
-
计算机的存储单元
无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位(bit)”,我们又称之为“比特位”,通常用小写的字母”b”表示。但是计算机中最小的存储单元叫“字节(byte)”,通常用大写字母”B”表示,字节是由连续的8个位组成。比如int就是占四个字节,double是占8个字节的,不会是说某个数据类型是占4个字节又3个bit这样的。
-
存储单位之间的换算
1B(字节) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB -
java的数据类型
Java语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的。因为他们分配了不同的地址空间,所以,他们表示数据范围的能力是不同的。
下面是java的数据类型的关系。
-
各个数据类型的内存占用和取值范围的情况如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
所以可以看出,一个数据类型的表示范围和它占用的字节位数有关。比如,这个byte系统给他分配了一个字节,所以它只能表示2^7个值。然后还看这个类型在计算机里的存储规则,一个byte是1个字节,即8位,然后byte在计算机内部的存储的规则为,第一个为表示符号,且它是以补码存储的,所以它的表示的范围是-128-127。下面解释一下为什么得到这个结论。
就是byte这个数据类型在计算机里面的10000001表示是指补码为10000001,那他表示的数是什么呢?看他的原码。10000001的转换回反码是11111111,所以他的原码是11111111即-127。补码01111111这个,他的原码是01111111,所以表示的是127。那10000000表示什么呢?10000000的反码是,1(0)1111111,因为溢出了,所以这么写。所以他的值是什么呢?他的原码是1(1)0000000。因为第一个1表示符号,所以这个值是-128这就是为什么负数要比正数多一点的原因。
原码反码补码的变化规则:
原码:正数:符号位0,负数:符号位1
反码:正数:同原码,负数:原码符号位不变,数值位按位取反
补码:正数:同原码,负数:反码基础上加1
移码:无论正负数,符号位同补码相反,数值位相同补码中不区分+0和-0:
[+0]补,[-0]补都用0000 0000B 表示
[-128]补=1000 0000B
8位补码范围为:-128~127原码,反码中区分+0和-0:
+0用0000 0000B表示,-0用1000 0000B表示
8位原码,反码范围为:-127~127存在溢出只有一种情况,以8位补码做说明:补码为:1000 0000,此处补码实际是-128,而8位反码最多是-127,溢出了。
原码变反码,反码变原码都影响不到符号位,反码变补码的进位也影响不到符号位,如11111111这个反码,+1,去影响到符号位的1,那进进来的1就被扔了。补码变原码的-1要是不够,要向借位,借除符号位之外的1都是会消耗的,但是,借符号位的1,符号位的1不会被消耗,比如10000000这个补码变位反码,结果是1(0)1111111,但是这里有一个隐藏的(0),他变原码的时候还是会变为,1(1)0000000,所以这个原码的值是-128
因为整数在计算机内存储都是用补码存储的,所以,他们表示的范围都是 -X~Y(X=Y+1),原因,上面都讲了。还有就是byte占8位,所以他表示的范围是 -2^7~ 2^7-1,后面的也是同理,你看long占64位,所以他的范围是 -2的63次~2的63次-1。
记住几个数,256是2^8, 128是2^7 , 32768是2^15, 65535是2^16
还有要记住的是科学记数法的计算机上是怎么讲的:E+38表示是乘以10的38次方,同样,E-45表示乘以10的负45次方。在其他地方科学计数法是1.99714×10^13这样的,但是在计算机上表达10的多少幂都是用E或e的,所以在计算机1.99714E13=19971400000000。比如:1.123456E10在计算机里表示-1.1234560000,这个1.123456E10相当于1.123456X10 ^10(幂的计算的优先级是大于乘号的,所以这里10 ^10不加括号)
其中默认字面量的整数是int型的,默认字面量浮点数是double型的。
-
变量的定义
- 变量:在程序运行过程中,其值可以发生改变的量。变量本质上是内存的一小块区域。相当于你拿出来一块内存空间,用一个变量表示这个空间,这个空间相当于作为一个量的暂存位置。
-
定义变量的格式
格式:数据类型 变量名 = 变量值; 或者 数据类型 变量名;
范例:int a = 10; 例如:int i;
定义一个变量需要三个重要的信息,即变量名、变量值、数据类型。
定义变量的变量名和数据类型是必须的,但是,如果那个变量有被使用,那么在使用前你必须给他变量值,如果那个变量没有被使用,那么你定义变量的时候不给他赋值也没有关系。这里面为什么要给变量一个数据类型呢?因为,你需要知道这个变量表示的内存空间占多大,系统才好分配资源。要是这个变量使用前没有被给一个变量值,那么这个程序将会提示你错误。
-
变量的使用
- 取值格式:变量名。比如System.out.println(i);表示取这个i变量的值打印出来。
- 修改格式:变量名 = 变量值; 例如:a = 20;
-
变量使用的注意事项
- 变量名不能重复定义
- 变量未赋值不能使用
- 使用long类型的变量的时候,赋值的时候不能过大,不然后面要加L。比如 long l=10000000000就是错的,因为字面量10000000000默认为int型的,而int型的变量的范围是不大于2^31-1的,2的31次方-1的值为2147483647,所以要是字面量大于这个int的范围要这样写long l=10000000000L表示他是long型的数据类型的字面量。
- float f=13.12;是错的,因为浮点数默认是double型的。double型赋值给float的变量就会丢失数据,所以会报错。float ff=12.14F的话可以,这个F表示它是浮点数的字面量。
-
定义:标识符就是给类,方法,变量等起名字的符号。
-
规则
- 由数字、字母、下划线(_)和美元符($)组成
- 不能以数字开头
- 不能是关键字
- 区分大小写。比如int Css和int css这两个是不同的标识符。
-
约定(定义标识符的一些约定,小驼峰命名法一般用来命名变量和方法,大驼峰命名法一般用来命名类,接口)
- 规则是一定要遵守的,不然编译不通过,但是约定不一定要遵守,不遵守也不报错。但是约定是一种习惯,最好遵守。
-
分为两类,自动类型转换和强制类型转换
-
自动类型转换:把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。范例:double d = 10;
-
自动类型转换是如下图顺着来的,从byte到double是可以的,所以一个byte的变量赋值给一个double的变量是可以的。但是byte赋给char是不可以的,因为不能逆流。double变量或值赋值给byte变量也是不可以的。
-
强制类型转换:把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
-
强制类型转换是逆着上面这个流水的。
-
强制类型转换的格式为:目标数据类型 变量名 = (目标数据类型)值或者变量; 范例:int k = (int)88.88;
值得注意的是强制类型转换的话会造成数据丢失,且强制类型转换有时也行不通。比如float f=(float)true;和float f=(float)“sdfasf”;都是错误的。就是有是强转转会出现问题,因为他们的数据结构不同。都是数值型的可以转。
所以强制类型转换的使用范围是:
-
强转适合数值型的数据类型。看上面这个图的逆流。要是不是在这个图上的,比如,byte b=(byte)“sfs”;就是行不通的。
并不是说只要必须是上面的逆流,比如byte c=(byte)‘b’;这个也是OK的。就是说上面这个图上的这些表示数值类型的这几个数据类型的话,随便什么强转为什么都是可以的。byte b=110; char c=(char)b;也不会有问题。
-
强转适合用于多态的情况下。那个也叫向下造型。比如Animal是Dog的父类。
Animal a = new Dog();//这个是向上造型,这个是不用强转类型转换的 Dog b=(Dog)a;//这个是强转类型转换,也叫向下造型
-
运算符包括 算术运算符、赋值运算符、自增自减运算符、关系运算符、逻辑运算符、三元运算符。
运算符和表达式的定义:
运算符:对常量或者变量进行操作的符号
表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
例子:int c = a + b;中a + b:是表达式(不是说这个c = a + b;是表达式),由于+是算术运算符,所以这个表达式也叫算术表达式。不同运算符连接的表达式体现的是不同类型的表达式,所以你看这个表达式用算术符号连接,所以这个表达式叫算术表达式。
算术运算符-
算术运算符的种类
符号 作用 说明 + 加 参看小学一年级 - 减 参看小学一年级 * 乘 参看小学二年级,与“×”相同 / 除 参看小学二年级,与“÷”相同 % 取余 获取的是两个数据做除法的余数 值得注意的一点是。整数/整数的结果是整数,比如6/4的结果是1相当于除出来的数向下取整。
只有浮点数参与这个运算那他们的结果才是浮点数。比如6.0/4的结果就是1.5。这里就是涉及到了类型提升,下面马上就讲了。
-
算术运算的里面要注意的是:char类型的“+”操作
char在计算机里的算术运算,都是把char转为ASC码的整数,用这个ASC码的整数来运算的。比如。System.out.println(‘a’+2);的结果是99。所以这个System.out.println(‘a’);的结果是输出a不是97。当然我觉得这里也是于类型提升有关。
-
类型提升
算术表达式中包含多个基本数据类型的值的时候,整个算术表达式的类型会自动进行提升。
提升的规则有两个。
一、byte类型,short类型和char类型参与的运算byte、short、char类型将被提升到int类型参与运算。
package network; import java.util.Scanner; public class A { public static void main(String[] args) { short s = 5;//int的字面量是可以赋值给short,byte,char的,不会出错。但是有变量参与运算的时候就是会要求数据类型匹配,防止数据丢失 short x = 5+1; //s=s-2;这个是错误的,因为这个s-2是会强制提升为int然后用s去接受就会数据丢失,因为有变量参与,所以这个是 System.out.println(s); } }二、整个表达式的类型自动提升到表达式中最高等级操作数同样的类型。
等级顺序:byte,short,char --> int -->long --> float --> double 所以:6.0/4的结果是1.5.因为这个这个4已经提升为double类型了
-
字符串的+操作就看下面图就行。
-
赋值运算符有哪些
符号 作用 说明 = 赋值 a=10,将10赋值给变量a += 加后赋值 a+=b,将a+b的值给a -= 减后赋值 a-=b,将a-b的值给a *= 乘后赋值 a*=b,将a×b的值给a /= 除后赋值 a/=b,将a÷b的商给a %= 取余后赋值 a%=b,将a÷b的余数给a -
注意点:int i=10;i+=2;相当于:int i=10;i=10+2;但是不完全一样。其实应该是相当于int i=10;i=(强转转换)i+10;这个强转转换是转换为i=(强转转换)i+10;的前面这个i的他一样的类型,因为这个i是int,所以相当于i=(int)i+10;
看例子
因为这个s为short类型的,20为int型的,他们相加是会做一个类型提升的,所以s+20的结果是int型的,然后int要是直接赋值给short类型的s会出错,但是这个s+=20没有出错,所以s+=20要是相当于s=s+20;就不行,应该相当于s=(short)(s+20);
-
单独使用++i和i++是一样的效果
-
参与操作的时候,++i是先i加1后,然后去做事情,i++是先用未加1的i去做事情,语句结束后i的值+1
-
4==(b=3+1)这个结果是true,相当于(b=3+1)这个的结果是4,赋值的这个式子的结果就是相当于那个被赋值的值,比如,int i;int y=14+(i=12);的结果就是26。
-
很多++或–运算的时候
package network; public class A { public static void main(String[] args) { int i=12;int j=11; System.out.println(i++-++j);//这个因为遇到-的时候后面是+所以-+不会立马急着想去找变量合 System.out.println(i---++j); // System.out.println(i--+++j);错误,相当于一识别到一个--或++就会自动合起来,因为这里碰到第一个+又碰到第二个+就会立刻急着与边上的合但是这里他发现没有变量给他合,所以报错 // System.out.println(--i--+12);错误,已经和前面的合了就不能在与--或++合了 // System.out.println(i++---j);错误 } }
-
逻辑运算符有哪些,及其规则
符号 作用 说明 & 逻辑与 a&b,a和b都是true,结果为true,否则为false | 逻辑或 a|b,a和b都是false,结果为false,否则为true ^ 逻辑异或 a^b,a和b结果不同为true,相同为false ! 逻辑非 !a,结果和a的结果正好相反 -
注意:java里不能表示x
-
&&是短路与,||是短路或(他们与&和|的输出结果是一样的,但是就是有短路效果,就是第一个条件已经可以判断除式子的结果了,后面的就不执行了).( && 和 || 比 & 和 | 更常用)
测试如下
-
格式:格式:关系表达式 ? 表达式1 : 表达式2;
-
范例:a > b ? a : b;
计算规则:
首先判断a>b的真假
如果值为true,整个式子返回一个a的值
如果值为false,整个式子返回一个b的值 -
注意点
package network; public class A { public static int f() {return 10;} public static boolean g() {return true;} public static void main(String[] args) { int i=12;int j=11; // i>j?i+1:j-1;错误三元运算符的结果必须得有变量接收,所以这里错误 int x=i>j?i+1:j-1;//对的 // int y=i>j?System.out.println(142):System.out.println(142);//这个里面只能是值,不能是语句,但是可以是,返回值是符合基本数据类型的语句 int q=i>j?f():5;//看这样就可以 boolean p=i>j?g():false;//你看这个就行,但是语句里面是没有分号的 int z=i>j?i+1:j+2;//这样的i+1这个虽然是语句但是这个语句是相当与整个返回一个值的,所以没有问题 } }
- 当前阶段不会自己写输入输出类,所以我们用java封装好的,Scanner类
- 使用这个类的步骤是:
- 导包,即import java.util.Scanner; ,且这个语句是必须在定义类语句的上面
- 创建对象。即Scanner sc = new Scanner(System.in);
- 接收数据,int i = sc.nextInt();
- 注意程序碰到nextInt()是会停下来等你输入的。
int的整数字面量可以自动向下转
虽然short s=12;s=s+2;的s=s+2;这个语句会出错,原因是类型不匹配,因为右边类型升级为int但是左边是short所以出错了。整数字面量默认是int的,但是为什么short s=12;没有出错呢?
就是因为整数字面量在没有变量参与的时候是可以自动向下强转的。所以没有出现问题。但是有变量参与,那s+2就不能自动向下强转了,所以s=s+2;出错了
但是整数字面量不能自动向上强转,比如long s=10000000000;是错的,这个时候只能用long l=10000000000L;
但是double的字面量是不会自动向下强转的,所以float f=13.12是错的。必须是float f=13.12F;这样写;
tInt()是会停下来等你输入的。
int的整数字面量可以自动向下转
虽然short s=12;s=s+2;的s=s+2;这个语句会出错,原因是类型不匹配,因为右边类型升级为int但是左边是short所以出错了。整数字面量默认是int的,但是为什么short s=12;没有出错呢?
就是因为整数字面量在没有变量参与的时候是可以自动向下强转的。所以没有出现问题。但是有变量参与,那s+2就不能自动向下强转了,所以s=s+2;出错了
但是整数字面量不能自动向上强转,比如long s=10000000000;是错的,这个时候只能用long l=10000000000L;
但是double的字面量是不会自动向下强转的,所以float f=13.12是错的。必须是float f=13.12F;这样写;



