一、变量和数据类型
1.预备知识
进制转换 :十进制整数转为二进制,采用 “除 2 取余,逆序排列”法,如 十进制29转为二进制就是11101:
二进制转十进制采用“权相加法”,如二进制1011010专为十进制数为90::
注释 : 为了方便程序的阅读,Java 语言允许程序员在程序中写上一些说明性的文字,用来提高程序的可读性,这些文字性的说明就称为注释。注释不会出现在字节码文件中,即 Java 编译器编译时会跳过注释语句。在 Java中根据注释的功能不同,主要分为单行注释、多行注释和文档注释。
单行注释:用双斜线 ”//” 表示
多行注释:用 /*——————*/ 表示
文档注释:用 /**—————–*/ 表示
标识符: 标识符是用来给变量、类、方法以及包进行命名的。
标识符的命名规则 :1.标识符必须以字母、下划线_、美元符号$开头。2.标识符其它部分可以是字母、下划线“_”、美元符“$”和数字的任意组合。3.Java 标识符大小写敏感,且长度无限制。4.标识符不可以是 Java 的关键字。
标识符的使用规范: 1.表示类名的标识符:每个单词的首字母大写,如 Man, GoodMan;
2.表示方法和变量的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为
“驼峰原则”,如 eat(), eatFood()。
2.变量
变量 本质 上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什
么值不确定。我们可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存
储的值。
Java 是一种强类型语言,每个变量都必须声明其数据类型。 变量的数据类型决定了变
量占据存储空间的大小。 比如,int a=3; 表示 a 变量的空间大小为 4 个字节。
变量作为程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。变量在使
用前必须对其 声明 , 只有在变量声明以后,才能为其分配相应长度的存储空间。
变量的分类和作用域 : 从整体上可将变量划分为局部变量、成员变量(也称为实例变量)和静态变量。
类型 | 声明位置 | 从属于 | 生命周期(作用域) |
局部变量 | 方法或语句块内部 | 方法/语句块 | 从声明位置开始,直到方法或语句块执行完毕,局部变量消失 |
成员变量 (实例变量) | 类内部、方法外部 | 对象 | 对象创建,成员变量也跟着创建。对象消失,成员变量也跟着消失 |
静态变量 (类变量) | 类内部,用static修饰 | 类 | 类被加载,静态变量就有效;类被卸载,静态变量消失。 |
常量 通常指的是一个固定的值,例如:1、2、3、’a’、’b’、true等。在 Java 语言中,主要是利用关键字 final 来定义一个常量。 常量一旦被初始化后不能再更改其值。
常量 声明格式为:final type varName = value;
3.数据类型
Java 是一种强类型语言,每个变量都必须声明其数据类型。 Java 的数据类型可分为两 大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。Java 中定义了 3 类 8 种基本数据类型:
数值型-byte、 short、int、 long、float、 double
字符型-char
布尔型-boolean
boolean 类型 有两个常量值,true 和 false,在内存中占一个字节或 4 个字节,不可以使用 0 或非 0 的整数替代 true 和false,boolean 类型用来判断逻辑条件,一般用于程序流程控制。
关于boolean类型几个字节的说明: 在《Java 虚拟机规范》一书中的描述:“虽然定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持。在 Java 虚拟机中没有任何供 boolean 值专用的字节码指令,Java 语言表达式所操作的boolean 值,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替,而 boolean 数组将会被编码成 Java虚拟机的 byte 数组,每个元素 boolean 元素占 8 位”。也就是说 JVM 规范指出 boolean 当做 int 处理,也就是 4 字节,boolean 数组当做 byte 数组处理,这样我们可以得出 boolean 类型单独使用是 占 了 4 个字节,在数组中是确定的 1 个字节。
字符型 : 字符型在内存中占 2 个字节,在 Java 中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串。
char 类型用来表示在 Unicode 编码表中的字符。Unicode 编码被设计用来处理各种语言的文字,它占 2 个字节,可允许有 65536 个字符。Unicode 具有从 0 到 65535 之间的编码,他们通常用从’u0000’到’uFFFF’之间的十六进制值来表示(前缀为 u 表示 Unicode)
Java 语言中还允许使用转义字符 ‘’ 来将其后的字符转变为其它的含义。常用的转义字符及其含义和 Unicode 值如下:
常用转义字符 | ||
转义字符 | 含义 | Unicode值 |
b | 退格(backspace) | u0008 |
n | 换行 | u000a |
r | 回车 | u000d |
t | 制表符(tab) | u0009 |
” | 双引号 | u0022 |
‘ | 单引号 | u0027 |
反斜杠 | u005c |
整型 : 整型用于表示没有小数部分的数值,它允许是负数。整型的范围与运行 Java 代码的机器无关,这正是 Java 程序具有很强移植能力的原因之一。Java 语言的整型常数默认为 int 型,声明 long 型常量可以后加‘ l ’或‘ L’ 。
整型数据类型 | ||
类型 | 占用存储空间 | 表述范围 |
byte | 1字节 | -27 ~ 27-1(-128~127) |
short | 2字节 | -215 ~ 215-1 (-32768~32767) |
int | 4字节 | -231 ~ 231-1 (-2147483648~2147483647)约 21 亿 |
long | 8字节 | -263 ~ 263-1 |
浮点型 : 带小数的数据在 Java 中称为浮点型。浮点型可分为 float 类型和 double 类型。float 类型又被称作单精度类型,尾数可以精确到 7 位有效数字,在很多情况下,float类型的精度很难满足需求。而 double 表示这种类型的数值精度约是 float 类型的两倍,又被称作双精度类型,float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。 绝大部分应用程序都采用 double 类型 。
浮点型数据类型 | ||
类型 | 占用存储空间 | 表数范围 |
float | 4字节 | -3.403E38~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
Java 浮点类型常量有两种表示形式: 十进制数形式,例如:3.14、314.0;
科学记数法形式,如 3.14e0、3.14E2。
二、运算符
运算符分类 | ||
算术运算符 | 二元运算符 | +、-、*、/、% |
一元运算符 | ++、– | |
赋值运算符 | = | |
扩展运算符 | +=、-=、*=、/= | |
关系运算符 | >、<、>=、<=、==、!= | |
逻辑运算符 | &&、||、!、^ | |
位运算符 | &、|、^、~、>>、<<、>>> | |
条件运算符 | ?: | |
字符串连接符 | + |
1.算术运算符
算术运算符中+,-,*,/,%属于二元运算符,二元运算符指的是需要两个操作数才能完成运算的运算符。其中的%是取模运算符,就是我们常说的求余数操作。
二元运算符的运算规则:
整数运算: 如果两个操作数有一个为 long, 则结果也为 long。没有 long 时,结果为 int。即使操作数全为 short,byte,结果也是 int。
浮点运算: 如果两个操作数有一个为 double,则结果为 double。只有两个操作数都是 float,则结果才为 float。
取模运算: 其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。
算术运算符中++(自增),–(自减)属于一元运算符,该类运算符只需要一个操作数。
2.赋值及其扩展赋值运算符
赋值运算符用法 | ||
运算符 | 用法举例 | 等效的表达式 |
+= | a+=b | a=a+b |
-= | a-=b | a=a-b |
*= | a*=b | a=a*b |
/= | a/=b | a=a/b |
%= | a%=b | a=a%b |
3.关系用算符
关系运算符 | ||
运算符 | 含义 | 示例 |
== | 等于 | a==b |
!= | 不等于 | a!=b |
> | 大于 | a>b |
< | 小于 | a<b |
>= | 大于或等于 | a>=b |
<= | 小于或等于 | a<=b |
注:1. =是赋值运算符,而真正的判断两个操作数是否相等的运算符是==。
2.==、!= 是所有(基本和引用)数据类型都可以使用。
3.> 、>=、 <、 <= 仅针对数值类型(byte/short/int/long,float/double 以及char)。
4.逻辑运算符
逻辑运算符 | ||
运算符 | 说明 | |
逻辑与 | & | 两个操作数为 true,结果才是 true,否则是 false |
逻辑或 | | | 两个操作数有一个是 true,结果就是 true |
短路与 | && | 只要有一个为 false,则直接返回 false |
短路或 | || | 只要有一个为 true, 则直接返回 true |
逻辑非 | ! | 取反:!false 为 true,!true 为 false |
逻辑异或 | ^ | 相同为 false,不同为 true |
短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。
5.位运算符
位运算指的是进行二进制位的运算:
位运算符 | |
运算符 | 说明 |
~ | 取反 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< | 左移运算符,左移 1 位相当于乘 2 |
>> | 右移运算符,右移 1 位相当于除 2 取商 |
注:1. &和|既是逻辑运算符,也是位运算符。如果两侧操作数都是 boolean 类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。2.不要把“^”当做数学运算“乘方”,是“位的异或”操作。
6.字符串连接符
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
7.条件运算符
语法格式: x ? y : z
其中:x 为 boolean 类型表达式,先计算x 的值,若为 true,则整个运算的结果为表达式 y的值,否则整个运算结果为表达式 z的值。
8.运算符优先级
关于优先级的问题是不需要去刻意记的,表达式里面优先使用小括号来组织!不过逻辑与、逻辑或、逻辑非的优先级一定要熟悉!(逻辑非>逻辑与>逻辑或)。如:a||b&&c 的运算结果是:a||(b&&c),而不是(a||b)&&c。
三、数据类型转换
1.自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。如上图所示,实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
另外, 可以将整型常量直接赋值给 byte、 short、 char 等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。如:
short b = 12; //合法
short b = 1234567; //非法,1234567 超出了 short 的表数范围
2.强制类型转换
强制类型转换,又被称为造型(cast),用于强制的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
语法格式:( type )var; 其中运算符“()”中的 type 表示将值 var 想要转换成的目标数据类型。
如: double x = 3.94; int nx = ( int ) x ; //值为 3
当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。如: int x = 300; byte bx = ( byte ) x ; //值为 44
四、Java基础应用
1.从控制台接收输入字符
通过输入流实现从控制台接收用户输入文本,并提示该文本的长度信息,代码如下:
package cn.pxy.test;
import java.util.Scanner;
public class InputCode {
public static void main(String[] args) {
//创建输入流扫描器
Scanner scanner=new Scanner(System.in);
//提示用户输入
System.out.println("请输入身份证号:");
//获取用户输入的一行文本
String line=scanner.nextLine();
System.out.println("原来你的身份证号是:"+line.length()+"为数字的啊");
}
}
运行测试:
2.自动类型转换与强制类型转换
Java基本数据类型之间存在自动类型转换和强制类型转换两种转换方式。类型转换时常见的问题主要有: 操作比较大的数时,要留意是否溢出,尤其是整数操作时。不要命名名字为 l 的变量,字母 l 容易和数字 1 混淆。long 类型使用大写 L,不要用小写 l。
代码如下:
package cn.pxy.test;
public class TypeConversion {
public static void main(String[] args) {
byte b=127;
char c='W';
short s=23456;
int i=333;
long L=400000L;
float f=3.14159F;
double d=54.523;
//低类型向高类型自动转换
System.out.println("累加byte等于:"+b);
System.out.println("累加char等于:"+(b+c));
System.out.println("累加short等于:"+(b+c+s));
System.out.println("累加int等于:"+(b+c+s+i));
System.out.println("累加long等于:"+(b+c+s+i+L));
System.out.println("累加float等于:"+(b+c+s+i+L+f));
System.out.println("累加double等于:"+(b+c+s+i+L+f+d));
//高类型到低类型的强制转换
System.out.println("把long强制类型转换为int:"+(int)L);
//高类型到低类型会丢失数据
System.out.println("把long强制类型转换为short:"+(short)L);
//实数到整数转换会舍弃小数部分
System.out.println("把double强制类型转换为int:"+(int)d);
//整数到字符类型的转换将获取对应编码的字符
System.out.println("把short强制类型转换为char:"+(char)s);
}
}
运行结果:
3.加密可以这样简单
通过位运算的“^”异或运算符把字符串与一个指定的值进行异或运算,从而改变字符串中每个字符的值,这样就可以得到一个加密后的字符串了,代码如下:
package cn.pxy.test;
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入要加密或解密的字符串:");
//获取用户输入
String password=scan.nextLine();
//获取字符串数组
char[] array=password.toCharArray();
//遍历字符数组
for(int i=0;i<array.length;i++) {
//对每个数组元素进行异或运算
array[i]=(char)(array[i]^20000);
}
System.out.println("加密或者解密的结果为:");
System.err.println(new String(array));
}
}
其中out与err都是System类的成员变量,可以直接使用,out主要是调试信息的输出流,在Eclipse中以黑色字体标识;err是错误信息的标准输出流,用于输出紧急错误信息,在Eclipse中以红色字体标识;在这里为了使加密或解密的结果更显眼,使用err输出结果。
加密:
解密:
4.用三元运算符判断奇数和偶数
代码如下:
package cn.pxy.test;
import java.util.Scanner;
public class ParityCheck {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入一个整数:");
long number=scan.nextLong();
String check=(number%2==0)?"这个数是:偶数":"这个数是奇数";
System.out.println(check);
}
}
运行:
5.更精确的使用浮点数
在计算机中所有数字都是使用二进制进行存储的,而二进制无法精确地表示所有小数,所以使用基本数据类型进行小数计算会有一些误差。在 java.math 包下面的两个有用的类:BigInteger 和 BigDecimal,这两个类可以处理任意长度的数值。BigInteger 实现了任意精度的整数运算。BigDecimal 实现了任意精度的浮点运算。测试代码如下:
package cn.pxy.test;
import java.math.BigDecimal;
public class AccuratelyFloat {
public static void main(String[] args) {
//现有金额
double money=2;
//商品单价
double price=1.1;
double result=money-price;
System.out.println("非精度计算:");
System.out.println("剩余金额:"+result);
//精确浮点数计算
BigDecimal money1=new BigDecimal("2");
BigDecimal price1=new BigDecimal("1.1");
BigDecimal result1=money1.subtract(price1);
System.out.println("精确计算:");
System.out.println("剩余金额:"+result1);
}
}
运行结果:
6.不用乘法运算符实现2*16
一个整数左移n次就相当于这个整数乘以2的n次方,右移n次相当于这个整数除以2的n次方:
package cn.pxy.test;
public class Example {
public static void main(String[] args) {
int number=2;
System.out.println("2*16为:"+(number<<4));
}
}
运行结果:
7.实现两个变量的互换(不借助第三个变量)
代码如下:
package cn.pxy.test;
import java.util.Scanner;
public class VariableExchange {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入变量A的值:");
long A=scan.nextLong();
System.out.println("请输入变量B的值:");
long B=scan.nextLong();
System.out.println("A="+A+"tB="+B);
System.out.println("执行变量互换:");
A=A^B;
B=B^A;
A=A^B;
System.out.println("A="+A+"tB="+B);
}
}
运行结果: