常量的概述和使用
A:什么是常量
在程序执行的过程中其值不可以发生改变
B:Java中常量的分类
字面值常量
自定义常量(面向对象部分讲)
C:字面值常量的分类(6种常量)
字符串常量 用双引号括起来的内容
整数常量 所有整数(无限个)
小数常量所有小数
字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号
'10','ab'非法的。
布尔常量较为特殊,只有true和false
空常量 null(数组部分讲解)
D:案例演示
用输出语句输出各种常量。null不演示
class Demo1 {
public static void main(String[] args) {
//字符串常量
System.out.println("Hello World!");
//整数常量
System.out.println(100);
//小数常量
System.out.println(12.3); //默认是Double精度类型
//字符常量
System.out.println(' '); //单个数字,单个字母,或单个符号,一个也没有不可以,超过也一个不可以。
//布尔常量
System.out.println(true); //true和false都是关键字
//null常量不演示,后续会详细讲
//在字符常量中'100','ab',''均为非法,只能单个,否则报错未结束的字符串
}
}
进制概述和二,八,十六进制图解
A:什么是进制
进制:就是进位制,是人们规定的一种进位方法。 对于任何一种进制--X进制,就表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。
例如一周有七天,七进制,一年有十二个月,十二进制
B:二进制的由来
其实二进制来源与中国,请看史料记载
18世纪德国数理哲学大师莱布尼兹从他的传教士朋友鲍威特寄给他的拉丁文译本《易经》中,读到了八卦的组成结构,惊奇地发现其基本素数(0)(1),即《易经》的阴爻yao- -和__阳爻,其进位制就是二进制,并认为这是世界上数学进制中最先进的。20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是二进制。它不但证明了莱布尼兹的原理是正确的,同时也证明了《易经》数理学是很了不起的。
C:八进制的由来
任何数据在计算机中都是以二进制的形式存在的。二进制早期由电信号开关演变而来。一个整数在内存中一样也是二进制的,但是使用一大串的1或者0组成的数值进行使用很麻烦。
所以就想把一大串缩短点,将二进制中的三位用一位表示。这三位可以取到的最大值就是7.超过7就进位了,这就是八进制。
D:十六进制的由来
但是对于过长的二进制变成八进制还是较长,所以出现的用4个二进制位表示一位的情况,四个二进制位最大是15,这就是十六进制。
E:不同进制表现同一个数据的形式特点
进制越大,表现形式越短
不同进制数据的表现形式
system-min.png
二进制是所有进制的基础。8421,2的次方数。
A:二进制的数据表现形式
由0,1组成。以0b(b可以大写也可以小写)开头(JDK1.7版本可以表示二进制了)
B:八进制的数据表现形式
由0,1,…7组成。以0开头
C:十进制的数据表现形式
由0,1,…9组成。整数默认是十进制的
D:十六进制的数据表现形式
由0,1,…9,a,b,c,d,e,f(大小写均可)。以0x开头
E:案例演示
class Demo2JinZhi {
public static void main(String[] args) {
//二进制,1.7版本前面加上0b表示二进制,b大写小写都可以
System.out.println(0b100);
//八进制
System.out.println(074);
//十进制
System.out.println(100);
//十六进制,10到15分别用a到f表示,大小写都可以
System.out.println(0x3c);
// 0b1010101 052 0x52
}
}
* 输出不同进制表现100的数据。
* 0b100 //二进制 0b开头
* 0100 //八进制 0开头
* 100 // 十进制
* 0x100 //16进制0x开头
任意进制到十进制的转换图解
A:任意进制到十进制的转换原理
系数:就是每一位上的数据。
基数:X进制,基数就是X。
权:在右边,从0开始编号,对应位上的编号即为该位的权。
结果:把系数*基数的权次幂相加即可。
B:画图练习
二进制--十进制
八进制--十进制
十六进制--十进制
jinzhi1-min.png
注意去权次幂的时候,从0开始要数到系数的位置,从1开始的话,要少数一位。
十进制到任意进制的转换图解
A:十进制到任意进制的转换原理
除积倒取余
B:画图练习
十进制--二进制
十进制--八进制
十进制--十六进制
jinzhi.png
快速的进制转换法
A:8421码及特点
8421码是中国大陆的叫法,8421码是BCD代码中最常用的一种。在这种编码方式中每一位二值代码的1都是代表一个固定数值,把每一位的1代表的十进制数加起来,得到的结果就是它所代表的十进制数码。
B:通过8421码的方式进行二进制和十进制的相互转换
C:二进制到八进制的简易方式
D:二进制到十六进制的简易方式
8421ma-min.png
八进制数字 三个bit位为一组。
十六进制,四个bit位为一组。
一个字节占八个个bit位。
一个字,两个字节,16个bit位置。
原码反码补码
A:为什么要讲解有符号数据表示法
后面学习数据类型的时候,要学习强制类型转换,如果不知道有原反补会看不懂结果
B:有符号数据表示法的几种方式
原码
就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
通过一个字节,也就是8个二进制位表示+7和-7
0(符号位)0000111
1(符号位)0000111
反码
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码
正数的补码与其原码相同;负数的补码是在其反码的末位加1。
YuanMaFanMaBuMa-min.png
在计算机系统里面,存储采用的是原码的形式,计算采用的都是补码的形式,进行运算。
原码->反码->补码
原码反码补码的练习
A:已知原码求补码(加一取反)
0b10110100
0b11001100
B:已知补码求原码
0b11101110 (减1取反)
ob10010010
YuanMaBuMaLianxi-min.png
变量的概述及格式
A:什么是变量
在程序执行的过程中,在某个范围内其值可以发生改变的量(ex:数学的未知数)
B:变量的定义格式
数据类型 变量名 = 变量值;
C:为什么要定义变量
用来不断的存放同一类型的常量,并可以重复使用
数据类型的概述和分类
A:为什么有数据类型
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间
B:Java中数据类型的分类
基本数据类型
引用数据类型
面向对象部分讲解
C:基本数据类型分类(4类8种)
整数型
byte,short,int,long
浮点型
float,double
字符型
char
布尔型
boolean
D:引用数据类型
类(class)、接口(interface)、数组([]).
class Demo1 {
public static void main(String[] args) {
//整数类型byte,short,int,long
/*
byte占的是1个字节 = 8个bit 0 1111111 = 1 + 2 + 4 + 8 + 16 + 32 + 64 = 127
1 1111111 = -127
1 0000000 取反
1 0000001 -127的补码
1 0000000 -128的补码
0 0000001 减去1
-------------
1 1111111
1 0000000 -128的原码
byte取值范围是-128到127 -128到-1 0到127 256个数
short占的2个字节 = 16个bit
int 占的4个字节 = 32个bit //int是整数类型的默认类型
long占的8个字节 = 64个bit
*/
//浮点类型 float和double
/*
float占的是4个字节 单精度
double占的是8个字节 双精度 double是浮点数的默认类型
*/
//字符类型
/*
char占的两个字节 0到65535之间
*/
//布尔类型
/*
布尔类型占几个字节?
按照bit位算的话,应该占的是八分之一个字节
java中没有明确布尔类的大小。
*/
}
}
定义不同数据类型的变量
A:案例演示
定义不同基本数据类型的变量,并输出
赋值时候注意float类型,long类型
class Demo2DateType {
public static void main(String[] args) {
//整数类型
byte b = 100;
short s = 1000;
int i = 10000;
long l = 123456789012345678L;
//System.out.println(12345+5432l);切记 如果想标识long类型的数,超过了int的取值范围,需要在末尾
//加上L,最好是大写,因为小写的太像1这个数字;
//浮点类型
float f = 12.3f;
double d = 13.4d; //13.4后面的d可以省略,d可以是大写也可以是小写
//字符类型
char c1 = 'a';
char c2 = '0';
char c3 = '中';
//字符是否可以存储中文?
//可以,java是unicode编码,char类型占的两个字节,而一个中文占的也是两个字节
//System.out.println(c3);
//布尔类型
boolean b1 = true;
boolean b2 = false;
}
}
附上一个截图,不同数据类型的取值范围
fanwei-min.PNG
整型的取值范围默认是int,浮点型默认是double,所以当使用float单精度定义数据时候必须带有f,数字过于大的话,需要在末尾带有L(小写容易混淆)。
使用变量的注意事项
A:案例演示
a:作用域问题
同一个区域不能使用相同的变量名
b:初始化值问题
局部变量在使用之前必须赋值
c:一条语句可以定义几个变量
int a,b,c...;
class Demo3DateType {
public static void main(String[] args) { //作用域
int x = 10;
x = 20; //赋值将原来10覆盖掉
//System.out.println(x);
int y; //变量在使用之前必须赋值
y = 30;
//System.out.println(y);
int a,b,c; //一条语句可以声明多个变量
a = 10;
b = 20;
c = 30;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
数据类型转换之隐式转换
A:案例演示
a:int + int
b:byte + int 的结果分别用byte和int类型接收,看效果
B:Java中的默认转换规则
C:画图解释byte+int类型的问题
leixing-min.png
由于java中整型的数据默认是int类型,因此 short btye类型的数据和int类型的进行运算的时候,会被自动提升称为int类型。
int和long等更高精度的数据运算时,会提升成为long等更高精度的数据类型,为了确保精度。
数据类型转换之强制转换
A:强制转换问题
int a = 10;
byte b = 20;
b = a + b;
B:强制转换的格式
b = (byte)(a + b);
C:强制转换的注意事项
如果超出了被赋值的数据类型的取值范围得到的结果会与你期望的结果不同
class Demo4DateType {
public static void main(String[] args) {
/*int i = 100;
byte b = 50;
i = i + b; //自动类型提升(隐式转换)
System.out.println(i);*/
//00000000 00000000 00000000 10010110 int类型的150
//10010110 用byte强转150后的结果,运算中都是使用补码
//0 1101010 106
//1 1101010 -106的原码
//1 0010101 -106的反码
//0 0000001 +1
//1 0010110 -106的补码
int i = 100;
byte b = 50;
b = (byte)(i + b); //强制类型转换
System.out.println(b);
byte b2 = (byte)300;
System.out.println(b2);
//00000000 00000000 00000001 00101100 300的二进制表现形式,本应该占32位
//00101100
}
}
面试题之变量相加和常量相加的区别
A:案例演示
面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
从两方面去回答这个题
b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值
byte类型的变量在进行运算的时候,会自动类型提升为int类型
byte b4 = 3 + 4;
3和4都是常量,java有常量优化机制,就是在编译的的时候直接把3和4的结果赋值给b4了
//面试题(数据类型转换)
class Demo5DateType {
public static void main(String[] args) {
byte b,b1,b2;
b1 = 3;
b2 = 4;
//b = b1 + b2; //b1和b2是两个byte类型的变量,
//在进行运算的会自动类型提升为int类型
//b1和b2是两个变量,jvm无法判断里面具体的值
b = 3 + 4; //3和4是两个常量,java有一个常量优化机制,在编译直接讲常量相加的结果算出并赋值
//这两种哪种会报错,为什么
System.out.println(b);
byte x = 100;
}
}
数据类型中补充的几个小问题
A:在定义long或者float类型的变量的时候,需要在末尾跟上L和F;
因为默认的数据类型是int和double
byte和short在定义的时候,他们接收的实际上是一个int类型值,越界就会报错
B: Byte的值问题
byte b1 =127;
byte b2 =(byte)300; //损失精度
byte b4 =(byte)130; //损失精度,此外计算机在进行运算的时候,都是使用补码
byte的取值范围 -128~127;
C: 数据类型转换之默认转换
进行混合运算的时候,byte,short,char不会相互转换,都会自动类型提升为int类型,其他类型进行混合运算的是小的数据类型提升为大的
byte,short,char -- int -- long -- float -- double
long: 8个字节
float:4个字节
IEEE754 国际制定的标准
4个字节是32个二进制位
1位是符号位 1是负数,0是正数
8位是指数位
00000000 11111111
0到255
1到254
每个指数位减去127
-126到127
23位是尾数位(无限接近1)
A:它们底层的存储结构不同。
B:float表示的数据范围比long的范围要大
long:2^63-1
float:3.410^38 > 210^38 > 28^38 = 22338 = 2*2^114 > 2^63-1
D: java语言中的字符char可以存储汉字吗?为什么?
可以的,因为java语言采用的是Unicode编码,unicode编码中每个字符占用两个字节
所以,java中的字符可以存储一个中文汉子。
字符和字符串参与运算
A:案例演示
System.out.println('a'); //a的acsII码表 97
System.out.println('a'+1);//输出 98 提升成int类型
System.out.println((char)('a'+1));//强转输出 b
System.out.println((char)(98));//强转输出 b
System.out.println((char)(100));//强转输出 ? 只用到了127位(Unicode)
通过看结果知道'a'的值是多少,由此引出ASCII码表
B:ASCII码表的概述
记住三个值:
'0' 48
'A' 65
'a' 97
C:案例演示
System.out.println("hello"+'a'+1);//输出:helloa1 任何数据用+与字符串连接最后都会产生新的字符串
System.out.println('a'+1+"hello");//输出: 98 hello
D:+在有字符串参与中被称为字符串连接符
System.out.println("5+5="+5+5);//输出 5+5=55
System.out.println(5+5+"=5+5");//输出:10=5+5
char数据类型
A:char c = 97;
B:Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
可以。因为Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。
所以,Java中的字符可以存储一个中文汉字
算术运算符的基本用法
A:什么是运算符
B:运算符的分类
C:算数运算符有哪些
D:案例演示
算数运算符的基本用法
注意事项:
a:整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型
b:/获取的是除法操作的商,%获取的是除法操作的余数
yunsuanfu-min.png
//取模运算
class Demo7Operator {
public static void main(String[] args) {
//System.out.println(12 % 5); //取模运算就是取余数
//System.out.println(-3 % 5); //如果左边绝对值小于右边就是本身
//System.out.println(-10 % 5); //如果左边绝对值是右边的倍数时,结果为0
//System.out.println(13 % -5); //如果左边的绝对值大于右边,结果是余数,符号取决于左边,右边忽略不计
//System.out.println(3 % 2); //一个数模与2结果要么是0,要么是1,可以用来切换条件
int a = 100;
int b = 30;
System.out.println(a / b); //整数与整数运算结果肯定是整数,不能是小数 out : 3
}
}
算术运算符++和--的用法
A:++,--运算符的作用
自加(++)自减(--)运算
++:自加。对原有的数据进行+1
--:自减。对原有的数据进行-1
B:案例演示
a:单独使用:
放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)
b:参与运算使用:
放在操作数的前面,先自增或者自减,然后再参与运算。
放在操作数的后面,先参与运算,再自增或者自减。
同理a--
class Demo8Operator {
public static void main(String[] args) {
/*int a = 4;
//a++; //a++ 相当于a = a+1
//int b = a++; //如果++符号放在变量的后面,是先赋值,再自加
//无论赋值,还是运算,还是打印都是先将变量里的值拿出来,然后在自身+1
//System.out.println("b = " + b);
System.out.println(a++);// 输出4
System.out.println(a);*/ //输出 5
int a = 4;
++a; //a++和++a单独写没有区别
//int b = ++a; //如果++符号放在变量的前面,是先自加,然后再赋值
//System.out.println("b = " + b);
System.out.println(a);
}
}
算术运算符++和--的练习
A:案例演示
请分别计算出a,b,c的值?
int a = 10;
int b = 10;
int c = 10;
a = b++; //a = 10 b = 11
c = --a; //c = 9 a = 9
b = ++a; //b = 10 a = 10
a = c--; //a = 9 c = 8
B:案例演示
请分别计算出x,y的值?
int x = 4;
int y = (x++)+(++x)+(x*10);
代码:
class Demo9Operator {
public static void main(String[] args) {
/*int a = 10;
int b = 10;
int c = 10;
a = b++; //a = 10 b = 11
System.out.println(a); //10
c = --a; //c = 9 a = 9
b = ++a; //b = 10 a = 10
a = c--; //a = 9 c = 8
System.out.println("=================================");
System.out.println(a); //9
System.out.println(b); //10
System.out.println(c); //8*/
int x = 4;
// 4 + 6 + 6 * 10 = 70
int y = (x++)+(++x)+(x*10);
System.out.println(x);
System.out.println(y);
}
}
赋值运算符的基本用法
A:赋值运算符有哪些
B:案例演示
赋值运算符的基本用法
注意事项:
a:基本的赋值运算符:=
把=右边的数据赋值给左边。
b:扩展的赋值运算符:+=,-=,*=,/=,%=
+= 把左边和右边做加法,然后赋值给左边。
赋值运算符的面试题
A:案例演示
面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。
short s=1;s = s+1;
short s=1;s+=1;
//面试题
class Demo10Operator {
public static void main(String[] args) {
int a = 10;
//a += 20; //a = a + 20;相当于将左右两边相加的结果再赋值给左边,
//20 += a; //左边一定是变量
a *= 20;
//System.out.println(a);
short s=1;
//s = s+1; //short类型与int类型进行运算会提升为int类型,结果是int类型,不能赋值给short类型
s+=1; // s = (short)(s + 1);+=号是一个赋值运算符,所以为了能够保证赋值成功,会把int类型强转为short类型
System.out.println(s);
}
}
关系运算符的基本用法及其注意事项
A:关系运算符有哪些
B:案例演示
关系运算符的基本用法
注意事项:
无论你的操作是简单还是复杂,结果是boolean类型。
"=="不能写成"="。
guanxi.png