*在方法体当中的java代码,是遵守自上而下的顺序依次执行的,逐行执行
第一行;
第二行;
第三行;
特点:第二行的代码必须完整的结束之后,第三行程序才能执行。
*在同一个“作用域”当中,变量名不能重名,但是变量可以重新赋值。
*在不同的作用域当中,变量名是可以相同的
*java遵循“就近原则”
*类体中不能直接编写java语句【除声明变量之外】
*字符编码:为了让计算机可以表示现实当中的文字,我们需要人的干涉,需要人负责
提前制定好“文字”与“二进制”之间的对照关系。这种对照关系被称为:字符编码
*编码和解码的时候采用同一套字典/对照码,不会出现乱码
*当编码和解码的时候采用的不是同一套对照码,会出现乱码问题。
'a' --> 97 【01100001】
'A' --> 65
'0' --> 48
*JDK中自带的native2ascii.exe命令,可以将文字转换为unicode编码形式
1、标识符
-在java源程序当中凡是程序员有权自己命名的单词都是标识符
-标识符可以标识什么元素呢?
*类名
*方法名
*变量名
*接口名
*常量名
…
标识符的命名规则?【不按照这个规则来,编译器会报错,这是语法】
*只能由"数字、字母、下划线、美元符号"组成,不能含有其他符号
*不能数字开头
*严格区分大小写
*关键字不能用做标识符
*理论上无长度限制,但是最好不要太长
标识符命名规范?【只是一种规范,不属于语法,不遵守规范编译器不会报错】
*最好见名知意
*遵守驼峰命名方式
*类名、接口名:首字母大写,后面每个单词首字母大写
*变量名、方法名:首字母小写,后面每个单词首字母大写
*常量名:全部大写(常量中存在多个单词,用下划线隔开)
2、关键字
48个关键字:
abstract、assert、boolean、break、byte、case、catch、char、class、
continue、default、do、double、else、enum、extends、final、finally、float、
for、if、implements、import、int、interface、instanceof、long、native、new、
package、private、protected、public、return、short、static、strictfp、super、
switch、synchronized、this、throw、throws、transient、try、void、volatile、while。
2个保留字(现在没用以后可能用到作为关键字):goto、const。
3个特殊直接量:true、false、null。
3、字面值
*字面值就是数据
*字面值是java源程序的组成部分之一。包括标识符和关键字它们都是java源程序的组成部分
*数据在现实世界是分门别类的,所以在计算机当中也是有类型的:【数据类型】
-10、100 属于整数型字面值
-3.14 属于浮点型字面值
-true、flase 属于布尔型字面值
-“abc”、“中国人” 属于字符串型字面值(java语言当中必须使用半角型双引号括起来)
-‘a’、‘人’ 属于字符型字面值(java语言当中必须使用半角型单引号括起来)
4、变量
4.1 什么是变量
变量本质上来说是内存中的一块空间,这块空间有"数据类型"、"有名字"、"有字面值"*
变量包含三部分:数据类型、名称、字面值【数据】*
变量是内存中存储数据的最基本的单元
4.2 数据类型的作用?
不同的数据有不同的类型,不同的数据类型底层会分配大小不同的空间
数据类型是指导程序在运行阶段应该分配多大的内存空间
4.3 变量要求:
变量中存储的具体的“数据”必须和变量的“数据类型”一致,当不一致的时候编译报错
4.4 声明/定义变量的语法格式:
数据类型 变量名;
数据类型:
例:整型int
变量名:
只要是合法的标识符就行。规范中要求:首字母小写,后边每个单词首字母大写
例如:
int i;
int age;
int size;
注:变量在一行可以声明多个
int a,b,c;
4.5 变量声明之后怎么赋值?
语法格式:
变量名=字面值;
要求:字面值的数据类型必须和变量的数据类型一致
=等号是一个运算符,叫做赋值运算符,赋值运算符先运算等号右边的表达式,
表达式执行结束之后的结果赋值给左边的变量
4.6 声明和赋值可以放到一起完成
int a=10;//此时已经给a赋值了,a=10
a=20;//此时为修改a变量的数值
例int a,b,c=100;//此时声明了a、b、c三个变量,但只有c=100,a、b还未赋值
4.7 java的变量必须先声明,再赋值,才能访问
int i;
程序执行到这里,内存空间并没有开辟出来,变量i并没有初始化,所以没有赋值前是无法访问的
4.8 变量的作用域
什么是作用域?
变量的作用域,其实描述的就是变量的有效范围
在这个范围之内是可以被访问的,只要出了这个范围该变量就无法访问了
变量的作用域就只有一句话:
【出了大括号就不认识了】
例:如果在for循环里声明变量的话,这个变量的有限范围只局限于for循环,循环结束变量内存就没了
如果在for循环上方声明变量,这个变量的作用域为main方法,访问的是main方法中的变量
4.9 变量的分类:
**根据变量声明的位置来分类:**
*局部变量
-在方法体当中声明的变量叫做局部变量
(局部变量在栈内存中存储)
*成员变量
-在方法体外【类体之内】声明的变量叫做成员变量
-成员变量没有手动赋值系统会默认赋值【局部变量不会】
但赋值前面要加static ,即static int t;这个系统会自动赋值t=0
(成员变量中的实例变量在堆内存的java对象内部存储
实例变量是一个对象一份,100个对象有100份)
5、数据类型
数据类型的作用
指导JVM在运行程序的时候给该数据分配多大的内存空间
java中的数据类型包含两种:
基本数据类型
引用数据类型
-类
-接口
-数组
......
基本数据类型包括四大类八小种:
第一类:整数型
byde(字节), 取值范围:【-128~127】 默认值:【0】
short(短整型), 取值范围:【-32768~32767】 默认值:【0】
int(整型), 取值范围:【-214748348~214748347】 默认值:【0】
long(长整型) 默认值:【0】
第二类:浮点型
float, 默认值:【0.0】
double 默认值:【0.0】
第三类:布尔型
boolean 取值范围:【ture、false】 默认值:【false】
第四类:字符型
char 取值范围:【0~65535】(一个1字符,两个字节) 默认值:【\u0000】
-八种基本数据类型的默认值是一切向0看齐
引用数据类型的默认值为null(空值)
注意:short和char所表示的种类总数是一样的,只不过char可以表示更大的正整数,因为char没有负数。
字符串“abc”不属于基本数据类型,属于“引用数据类型”
*字节(byde):
1 Byde = 8 bit 【1个字节 = 8个比特位,一个比特位就是一个1或者0,就是一个二进制位】
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
*byde类型的取值范围
关于java中的数字类型,数字都是有正负之分的,所以在数字的二进制当中有一个二进制位
被称为“符号位”。并且这个“符号位”在所有二进制位的最左边,0表示正数,1表示负数。
byte类型最大值:01111111(2的七次方-1,结果是127)
byde类型最小值:-128【与原码、反码、补码有关】
byde类型取值范围:【-128~127】
byde类型可以表示256个不同的数字【256个不同的二进制】
基本数据类型之间可以互相转换:转换规则
1)八种数据类型当中除布尔类型之外,剩下的七种类型之间都可以互相转换
2)小容量向大容量转换,称为自动类型转换,容量从小到大排序:
byte < short < int < long < float < double
< char <
注:任何浮点类型不管占用多少字节,都比整数型容量大。
char和short表示的种类数量相同,但是char可以取更大的正整数
3)大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过
4)当整数字面值没有超出byde、short、char的取值范围,可以直接赋值给byde,short,char类型的变量
**5)byde,short,char混合运算的时候,各自转换成int类型再做运算
**6)多种数据类型混合运算,先转换成容量最大的那种类型再做运算
注意:
byde b = 3;//可以编译通过,3没有超出byde类型取值范围
int i = 10;
byde b = i/3;//编译报错,编译器只检查语法,"不会运算"1/i
//而当前算式中i为int类型,b为byde类型,大容量转小容量需加强制转换符
//编译期不要掺杂自认为的运行过程(不要自己算),编译是编译,运行是运行
byde b = (byde)i/3;//仍为编译错误,强转符将i转换为byde类型,与int类型的3运算,结果为int类型
5.1 整型
*java语言当中的“整数型字面值”被默认当做int类型来处理,要让这个“整数型字面值”被
当做long类型来处理的话,需要在“整数型字面值”后面添加l/L,建议使用大写的L(需要赋的值超过了int类型最大取值范围)
*java语言当中的整数型字面值有三种表示方式:
第一种方式:十进制【是一种缺省默认的方式】常用 int a = 10; //输出10
第二种方式:八进制【在编写十六进制整数型字面值的时候需要以0开始】 int b = 010; //输出8
第三种方式:十六进制【在编写十六进制整数型字面值的时候需要以0x开始】 int c = 0x10; //输出16
强制转换原理 :将左边二进制砍掉【所有的数据类型转换的时候都是这样完成的】
例: long a = 100L;
int b =(int)a;
原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
强转之后的数据:00000000 00000000 00000000 01100100
00000000 00000000 00000000 01100100目前储存在计算机内部,计算机存储数据都是采用补码的形式存储
所以00000000 00000000 00000000 01100100现在是一个补码形式
将以上的补码转换到原码就是最终的结果
注:转换过程中(运行阶段)可能损失精度,所以强转类型谨慎使用,因为精度损失之后可能损失很严重
例:byde a = (byde)128;
System.out.println(a);
结果输出为-128
int 128 二进制表示为 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10000000
byde 128 二进制表示为 10000000(此为补码)
转原码:10000000--11111111--11111111+00000001--10000000
他的原码看起来是一个-0,我们将它约定为-128
128 64 32 16 8 4 2 1
数据存储时(最高位为1表示负数,最高位为0表示正数)
正整数的补码是其二进制表示,与原码相同
负整数的补码:将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1
或符号位不变,其他位减1(00000001)取反【cpu中没有加法器,所以用负数使用补码的方式来存储
,就可以使用加法器来实现减法】
例:求-5的补码。
-5对应带符号位负数5(10000101)→除符号位外所有位取反(11111010)→加 00000001为 (11111011)
所以-5的补码是11111011
补码求原码:已知一个数的补码,求原码的操作其实就是对该补码再求补码
5.2 浮点型
float 单精度【4个字节】
double 双精度【8个字节,精度较高】
(1代表ture,0代表false)
注意:double和float在计算机内部二进制存储的时候存储的都是近似值
在现实世界当中有一些数字是无限循环的,例如:3.333333333...
计算机的资源是有限的,用有限的资源存储无限的数据只能存储近似值
*java语言当中的“浮点型字面值”被默认当做double类型来处理,要让这个“浮点型字面值”被
当做float类型来处理的话,需要在“浮点型字面值”后面添加f/F
double的精度太低【相对来说的】,不适合做财务软件
财务涉及到了钱的问题,要求精度较高,所以SUN在基础SE类库当中
为程序员准备了精确度更高的类型,只不过这种类型是一种引用数据
类型,不属于基本数据类型,它是:java.math.BigDecimal
其实java程序中SUN提供了一套庞大的类库,java程序员是基于这套基础的
类库来进行开发的,所以要知道java的SE类库的字节码在哪,
要知道java的SE类库的源码在哪?
*SE类库的字节码:C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar
*SE类库的源码:C:\Program Files\Java\jdk1.8.0_161\src.zip
【每个人电脑存储位置可能不同,这是我电脑上存储的位置】
5.3 布尔型
boolean [true;false]
6、转义字符\
- 转义字符出现在特殊字符之前,会将特殊字符转换成普通字符。
\n[换行符],属于char类型的数据(一个字符)
\t[制表符]
'[普通的单引号]
\[普通的反斜杠]
"[普通的双引号]
\u[表示后边的一串字符是某个unicode编码],注:此编码需要先用
native2ascii.exe命令转换出来,否则会无法识别
若想输出\,
char k =‘’;
System.out.println(k);
此时会显示编译报错,因为左边的单引号缺少了结束的单引号字符
反斜杠将后边的单引号转义成不具有特殊含义的普通单引号字符
正确输出\方法
char k =‘\’;
System.out.println(k);
第一个反斜杠具有转义功能,将后面的反斜杠转义为普通的单引号字符