文章目录
- 标识符
- 数据类型
- 强弱类型语言
- 数据类型
- 基础类型
- 类型转换
- 常量与变量
- 变量的定义
- 变量作用域
- 变量命名规范
- 常量
- 运算符
- 包机制
- 流程控制
- 选择结构
- 循环结构
- 方法(Method)
- 数组
- 概述
- 申明创建
- java.util.Arrays类
标识符
Java标识符的命名规则如下:
- 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始;
- 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合;
- 不能使用关键字作为变量名或方法名;
- 标识符是大小写敏感的;
- JAVA不采用通常语言使用的ASCII字符集,而是采用unicode这样的标准的国际字符集。因此,这里的字母的含义:可以表示英文、汉字等等。
数据类型
强弱类型语言
Java是一种强类型语言,每个变量都必须申明其类型。
下面是强类型语言和弱类型语言的解释:
- 强类型语言也称为强类型定义语言,要求变量的使用要严格符合规定,所有的变量必须先定义后才能使用。
- 弱类型语言也称为弱类型定义语言,要求与强类型定义相反,例如Java Script 中 var i 可以定义任何类型。
数据类型
Java的数据类型分为两个大类:基础类型(primitive type)和引用类型(reference type)。
基础类型
下面是Java中基础数据类型:
位、字节、字符、编码详解
-
位(bit):是计算机内部数据存储的最小单位,例如:11001100是一个8位的二进制数。
-
字节(byte):是计算机中数据处理的基本单位,习惯用大写B来调试,其中1B(byte,字节) = 8bit(位);
-
字符:是指计算机中使用的字母、数字、字和符号。
-
常见编码:
ASCIIS码:
1个英文字母(不区分大小写)= 1个字节空间;
1个中文汉字 = 2个字节的空间 ;
1个ASCII码 = 1个字节。UTF-8编码:
1个英文字符 = 1个字节空间;
1个英文标点 = 1个字节;
1个中文 = 3个字节;
中文标点= 3个字节。Unicode编码
1个英文字符 = 2个字节;
1个英文标点 = 2个字节;
1个中文 = 2个字节;
1个中文 = 2个字节。 -
操作系统32位和64位:32位操作系统只可以使用32位的CPU,64位的CPU既可以安装32位操作系统也可以安装64位操作系统。寻址能力简单来说就是支持的内存的大小,64位操作系统最多可以支持128G的内存,32位操作系统最多支持4G内存。
类型转换
- Java是强类型语言,因此在运算的时候,需要用到类型转换。 整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化位同一类型,然后进行运算。
- 转换优先级:byte,short,char -> int -> long -> float -> double。
- 转换规则:
- 不能对boolean类型进行类型转换;
- 不能把对象类型转换成不相关的对象;
- 在把容量大的类型转换成容量小的类型时必须使用强制类型转换;在转换过程中可能导致溢出或损失精度;
- 浮点数到整数的转换是通过舍弃小数得到的,并不是四舍五入。
- 自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型,
- 例如:short数据类型的位数为16,可以自动转化为位数32的int类型,float的数据类型的位数是32,也可以转换为64位的double类型。
- 例如:short数据类型的位数为16,可以自动转化为位数32的int类型,float的数据类型的位数是32,也可以转换为64位的double类型。
- 强制类型转换:强制将一个类型转换另一个类型,中间可能是在丢失信息的情况下进行的转换,可能造成精度降低或者溢出。
- JDK7扩展:
二进制数:用0b开头即可,例如:int a = 0b0101,代表int a = 5。
下划线分割符:可以用下划线来分割长的数字,例如:int a = 1_234_567。
常量与变量
变量的定义
- 变量就是变化的量。Java是一种强类型语言,因此每个变量都必须声明其类型。
- Java变量是程序中最基本的存储单元,其要素包括变量名、变量类型和作用域。
- 变量在使用前都必须对其声明,只有在声明后,才能为其分配对应长度的存储单元,
申明格式为: type varName [=value] [{,varName[=value]}] ;
数据类型 变量名 = 值;可以使用逗号隔开来声明多个同类型变量。
变量作用域
- 局部作用域(local variable):类的方法或者语句块中定义的变量,生命周期从声明位置开始到“}“截止;局部变量没有默认值,在使用前必须先声明和初始化(赋初值)
- 实例变量(成员变量,member variable):方法外、类的内部定义的变量,没有statc修饰,从属于对象,其生命周期伴随对象始终,如果没有进行初始化,会自动初始化成该数据类型的默认初始值。数值型变量初始化成0或0.0,字符型变量的初始化值是16位的0,布尔型默认是false。
- 静态变量(static variable):类中独立于方法外的变量,用static修饰,从属于类,生命周期伴随类的始终,从类加载到卸载。如果没有进行初始化,会自动初始化成该类型的默认初始值。数值型变量初始化成0或0.0,字符型变量的初始化值是16位的0,布尔型默认是false。
变量命名规范
- 所有变量、方法、类名,都应该见名知意。
- 类成员变量、局部变量、方法名:首字母小写和驼峰原则。
- 常量:全部大写字母和下划线。
- 类名:首字母大写和驼峰原则。
常量
-
初始化后不能再改变的值,是一种特殊的变量。例如:final 常量名=值;
double PI=3.14; final String LOVE=“hello”; -
常量名一般使用大写字符。
运算符
Java 语言支持如下运算符:
- 算术运算符: + 、- 、* 、/ 、% 、++ 、–
- 赋值运算符 =
- 关系运算符: > 、< 、>= 、<= 、== 、!= 、instanceof
- 逻辑运算符: && 、 || 、! 、 & 、 | 、^ 、~ 、
- 位运算符: >> ,<< ,>>> (了解!!! )
- 条件运算符 : ? (也叫三目运算符号)
- 扩展赋值运算符:+= 、-=、*= 、/=
特殊的运算:
-
二元运算符:
1.如果两个操作数有一个为long,则结果也为long。
2.没有long时,结果为int,即使操作数全为short/byte,结果也是int。
3.如果两个操作数有一个为double,则结果为double,只有两个操作数都是float,其结果才为float。 -
取模运算(%)
简单来说就是取余,例如:5%3 = 2。其规律是:
负数%负数=负数;
负数%正数=负数;
正数%负数=正数; -
一元运算符
自增(++)自减(–),自增自减符号在前,表示先自增自减后赋值,自增自减再后,表示先赋值再自增自减。
Java中的乘幂使用Math.pow()进行处理,Java代码中的^符号表示异或关系。
包机制
- Java中采用包机制来处理类名的冲突问题,方便类的查找和使用。
- 包采用了树形目录的存储方式,同一个包中的类名是不同的,不同包中的类名是可以相同的,当同时要调用两个不同包中相同类名的类时,应该加上包名进行区分。
- 包也设定了访问权限,拥有包访问权限的类才能访问某个包中的类。
- 包的使用用import关键字进行导入。
流程控制
Java的基本结构是顺序结构,除非特定指明,否则就是按照程序一句一句进行执行的。
选择结构
- if单选择结构
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}
- if双选择结构
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
- if多选择结构
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}
- 嵌套if结构
if(布尔表达式 1){
如果布尔表达式 1的值为true执行代码
if(布尔表达式 2){
如果布尔表达式 2的值为true执行代码
}
}
- switch多选择结构
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句 default : //可选
//语句
}
switch case语句有如下规则:
1.switch语句中的变量类型可以是:byte、short、int 或者 char。从 Java SE 7 开始,switch支持字符串String类型了同时case标签必须为字符串常量或字面量。
2.switch语句可以拥有多个case 语句。每个case后面跟一个要比较的值和冒号。
3.case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
4.当变量的值与case语句的值相等时,那么case语句之后的语句开始执行,直到break 语句出现才会跳出switch语句。
5.当遇到break语句时,switch语句终止。程序跳转到switch 语句后面的语句执行。case语句不必须要包含break语句。如果没有break语句出现,程序会继续执行下一条case 语句,直到出现break 语句。
6.switch 语句可以包含一个default 分支,该分支一般是switch语句的最后一个分支(可以在任何位置,但建议在最后一个)。default在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。
switch case执行时,一定会先进行匹配,匹配成功返回当前case的值,再根据是否有break,判断是否继续输出,或是跳出判断。
如果case语句块中没有break语句时,匹配成功后,从当前case开始,后续所有case的值都会输出。如果后续的case语句块有break语句则会跳出判断。【case穿透】
循环结构
- while循环
while( 布尔表达式 ) {
//循环内容
}
- do…while循环
do {
//代码语句
}while(布尔表达式);
- for循环
for(初始化; 布尔表达式; 更新) {
//代码语句
}
- 增强for循环
for(声明语句 : 表达式){
//代码句子
}
方法(Method)
-
定义解释
1.Java方法是语句的结合,它们组合在一起执行一个功能。
2.方法是解决一类问题的有序组合;方法包含于类中或者对象中;方法在程序中被创建,在其他地方被引用。
3.设计方法原则:方法的本意就是功能块,就是实现某个功能的语句块的集合。因此在设计时,最好保持方法的原子性,也就是一个方法只完成一个功能,这样有助于后期的扩展。 -
方法的定义
修饰词 返回值类型 方法名(参数类型 参数名) {
...
方法体
...
return 返回值;
}
-
方法参数类型
1.形参。
方法参数列表中的参数就是方法的形参(形式上参数)。
2.实参。
调用方法是向方法传递的参数就是实参(实际上参数) -
方法的调用
Java方法的调用参数传递的值传递,其有如下好处:
1.只规定一种传递方式,简单易懂。
2.传递的是数据副本,不是原始数据,在方法中不能根据参数修改原始数据,更加安全。
3.只传递数据副本,而不是整个数据对象,减少内存开销和时间消耗。
调用参数是基础类型的时候,使用的是值传递,参数是引用类型时候,形参传递的是该对象的内存地址,是引用传递。
以下代码演示了 Java 中的值传递:
public class PassByValueExample {
public static void main(String[] args) {
int x = 5;
System.out.println("Before method call: " + x);
modifyValue(x);
System.out.println("After method call: " + x);
}
public static void modifyValue(int value) {
value = 10;
System.out.println("Inside method: " + value);
}
}
输出结果为:
Before method call: 5
Inside method: 10
After method call: 5
调用规则:
1.非静态方法(非static)被调用时,一定是使用对象进行调用的。
2.静态方法(staic)既可以使用类名进行调用,也可以使用对象进行调用。
3.静态方法与非静态方法之间的调用,一定是非静态方法调用静态方法。
- 方法重载
1.方法名相同,参数列表不同的两个方法就是重载方法。
2.不能仅仅根据修饰符和返回值类型来判断是否重载。
3.Java编辑器根据方法签名来判断那个方法应该被调用。
数组
概述
- 定义
数组可以看作是一个类型的所有数据的集合,有一下定义:
1.数组是相同类型数据的有序集合。
2.数据描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成的。
3.其中,每一个数据称为数组的元素,每个数组元素可以通过数组下标来访问 - 特点
1.数组的长度是确定的,数组一旦被创建,它的大小是不可改变的。
2.其元素是相同类型的,不允许出现混合类型。
3.数组中的元素可以是任何类型,包括基本类型和引用类型。
4.数组变量本身属于引用类型,数组也可以看作是对象,数组对象本身是在堆内存中。
申明创建
- 申明创建
//有两种方式:
- dataType[] arrayName = new dataType[arraySize];
2.dataType arrayName[] = new dataType[arraySize];
//一般建议采用第一种的风格进行声明。
-
内存分析
1.数组声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时候才与长度有关,因此,声明数组时不能指定其长度,例如:int a[5]非法。
2.声明一个数组的时候,该数组并没有被真正的创建。
3.构造一个数组,必须指定长度。 -
三种初始化
1.静态初始化。
除了用new关键字类产生数组外,还可以直接定义数组的同时,就为数组元组分配空间并赋值。
例如:int[] a = {1,2,3};
2.动态初始化。
定义数组和为数组分配空间、赋值的操作分开进行。
例如:int[] a = new int[2];a[0]=1;a[1]=2;
3.默认初始化。
数组是引用类型,它的元素相当于类的实例变量,因此数组分配空间后,其中的每个元素都会按照数组类型进行初始化赋值,也叫隐式初始化。
- 数组边界
数组的下标合法区间是:[0,length-1],超过这个区间就会报错(ArrayIndexOutOfBoundsException)
java.util.Arrays类
- 打印数组:Arrays.toString(arrayName);
- 数组排序:Arrays.sort(arrayName);
- 二分查找:
先排序:Arrays.sort(arrayName);
再查找:Arrays.binarySearch(arrayName,searchValue); - 元素填充:Array.fill(arrayName,indexStart,indexEnd,fillValue);
- 数组转化为List:Array.asList(arrayName);