一、变量
1、定义: 变量就是在程序运行过程中其值可以发生变化的量
2、声明(定义)一个变量的格式:
方式一:数据类型 变量名
方式二: 数据类型 变量名1,变量2…[一次性声明了多个相同类型变量]
注意:变量是必须先声明再使用, 在一个作用域中不能声明同名的变量。
3、变量名的命名规范: 首单词小写,其他单词首字母大写,其他小写。
4、两种数据类型
① 基本数据类型(8个)
◆ 整数的数据类型:
byte(字节):8位(bit) 2^8 = 256 -128~127
short(短整型):16bit
int(整型):32bit
long(长整型):64bit
注意: 如果一个整数没有加上任何的标识的时候,那么默认是int类型的数据。如果需要把该数据表示成一个long类型的数据,那么需要加数据后面加上L表示,L是不区分大小写的,但是建议使用大写。
◆ 小数的数据类型:
float(单精度浮点型):32bit(保留7位小数)
double(双精度浮点型):64bit(保留15位小数)
注意: 如果一个小数没有加上任何标识的时候,那么该小数默认是double类型的数据,如果需要表示成float类型,那么需要在小数的后面加上f表示,f不区分大小写的。
◆ 布尔类型: 只有true或者false两个值
boolean:1字节或者4个字节
注意: 如果使用boolean声明一个基本类型的变量时,那么该变量占4个字节;如果使用boolean声明一个数组类型的时候,那么每个数组的元素占1个字节。
◆ 字符类型:
char:2字节(16bit)
② 引用数据类型
字符串的数据类型是:String
class Demo3.1{
public static void main(String[] args){
byte age = 120; //定义了一个byte类型的变量,变量名叫age,把120存储到了age变量中
age = 121;//改变变量的值
short money = 128;//定义了一个short类型的变量
int bossMoney = 1000000000;//定义了一个int类型的变量
long allMoney = 10000000000000000L;//定义了一个long类型的变量
//存储小数
float f = 3.14f;
double d = 3.1415926537;
boolean b = false;
char c = 'a';
String str = "Hello World";
System.out.println(str); //需要获取一个变量存储的数据,只需要使用变量名即可
}
}
5、转义字符
特殊字符使用”\”把其转化成字符的本身输出,那么使用”\”的字符称作为转移字符。
转义字符 | 解释 |
---|---|
\r | 相当于按下回车,把光标移动到一行的首位置上 |
\n | 表示换行 |
\t | 制表符,相当于Table键,为了让一列对齐,一个tab一般等于4个空格 |
\b | 退格键,相当于BackSpace |
\’ | 单引号 |
\’’ | 双引号 |
\ | 表示一个斜跨 |
\t | 制表符,相当于Table键,为了让一列对齐,一个tab一般等于4个空格 |
\b | 退格键,相当于BackSpace |
注意: 如果是在windows系统上操作文件的时候需要换行,是需要\r\n
一起使用的;如果是在其他的操作系统上需要换行,仅需要\n
即可。
import java.io.*;
class Demo3.2{
public static void main(String[] args) throws Exception{
File file = new File("F:\\Demo4.2.txt");
FileWriter out = new FileWriter(file);
out.write("大家好\r\n");
out.write("你们辛苦了~");
out.close();
}
二、数据类型转换
1、数据类型转换:
小数据类型 > 大数据类型 [自动类型转换]
大数据类型 > 小数据类型 [强制类型转换]
强制类型转换的格式:小数据类型 变量名 = (小数据类型)大数据类型
2、要注意的细节
① 凡是byte、short 、 char数据类型数据在运算的时候都会自动转换成int类型的数据再运算。
② 两个不同数据类型的数据在运算的时候,结果取决于大的数据类型。
3、负数的存储原理
在计算机中,如果一个二进制最高位是1,那么该数肯定是一个负数;如果一个二进制最高位是0,那么该数据肯定是一个正数。
而,负数在计算机中存储方式是补码。
例如:-7 > 11111001
① 先取负数的绝对值,求出该绝对值的二进制代码(原码)
② 原码取反得到反码
③ 反码+1得到补码
class Demo3.3{
public static void main(String[] args) {
int i1 = 128; //4个字节
byte b =(byte) i1; // 1个字节
System.out.println(b); // -128
//如果是负数,那么最高位肯定是1,正数的二进制位的最高位是0
//sun给我们提供一个功能 Integer.tobinaryString()查看一个数据的二进制数据形式的
System.out.println(Integer.toBinaryString(-7)); //11111001(补码)
//凡是byte、short 、 char数据类型数据在运算的时候都会自动转换成int类型的数据再运算
byte b1 = 1;
byte b2 = 2;
byte b3 = (byte)(b1+b2);
System.out.println(b3); //3
System.out.println('a'+1); //98
//两个不同数据类型的数据在运算的时候,结果取决于大的数据类型
int i2 = 10;
long l = 20;
i2 = (int)(i2+l);
System.out.println(i2);
byte b = 10;
//10 是一个常量,编译器在编译的时候就能够确认常量的值了,byte b = 10,在编译到的时候,java编译器就会检查到10并没有超出byte的表示范围,所以允许赋值。
int i3 = 10;
byte b = (byte)i3;
//java编译器在编译的时候并不能确认变量所存储的值,变量存储的值是在运行的时候才在内存中分配空间的
System.out.println(b);
}
}
三、运算符
1、算数运算符
+
、 -
、*
、/
(除法) 、%
(取模、取余数)、++
(自增) 、--
(自减)
连接符的作用: 让任何的数据都可以与字符串进行拼接
其中,如果+号用于字符串的时候,那么+号就是一个连接符,并不是做加法功能
注意:任何类型的数据与字符串使用连接符连接,那么结果都是字符串类型的数据
class Demo3.4 {
public static void main(String[] args){
//计算机每次运算的时候只能取两个数据运算
Syste.out.println(1+2+3 +" world"+1+2+3); // 6world123
//过程:3+3 +" world"+1+2+3 > 6+" world"+1+2+3 > "6world"+1+2+3
int a1 = 10;
int b1 = 3;
System.out.println(a1/b1); //3
double a2 = 12.0;
int b2 = 3;
System.out.println(a2/b2); //4.0
//在java中做取模运算的时,结果的正负号是取决于被除数。
System.out.println("结果:"+(10%3)); // 1
System.out.println("结果:"+(10%-3)); // 1
System.out.println("结果:"+(-10%3)); // -1
System.out.println("结果:"+(-10%-3)); //-1
//后自增在jvm的运行原理:因为后自增要使用到没有+1之前的值,那么jvm会先声明一个变量用于保存没有+1之前的值。
//原理:
//1. int temp = i; // 声明了一个临时变量用于记录了i没有加1之前的值
//2. 自增 i = i + 1; 此时i=1
//3. 返回temp,用作了表达式的结果
//i的值发生了几次变化:i = 0 > 1 > 0
int i = 0;
i = i++; //后自增要使用到没有+1之前的值
System.out.println("i= "+i);//i=0
}
}
2、赋值运算符
赋值运算符:=
、 +=
、 -=
、 *=
、 /=
、 %=
class Demo3.5 {
public static void main(String[] args){
int i = 10; // 把10赋予给i变量。
i+=2; // i = i+2;
System.out.println("i = "+i);//12
byte b1 = 1;
byte b2 = 2;
//b2 = b2+b1; //报错。需要强制类型转换
b2+=b1; //b2=b2+b1;b2+=b1在编译的时候,java编译器会进行强制类型转换,不需要我们手动转换
System.out.println("b2 : "+ b2);
}
}
3、比较运算符
比较运算符: 比较运算符的结果都是返回一个布尔值的
==
(判断是否等于)、!=
(不等于)、>
(大于)、<
(小于)、>=
(大于等于)、<=
(小于等于)
其中,==用于比较两个基本数据类型数据(引用类型变量)的时候,比较的是两个变量所存储的值(引用类型变量所记录的内存地址)是否一致
class Demo3.6 {
public static void main(String[] args){
byte b = 10;
long l = 30;
System.out.println(l>b); //true
//两个不同类型的数据是否可以比较呢?可以的,但是两个不同类型的数据必须是兼用的数据
//这个比较的过程会先把b转换了long类型的数据,然后再进行比较
System.out.println('a'>50);//true
}
}
4、逻辑运算符
逻辑运算符 :逻辑运算符的作用是用于连接布尔表达式的
&
(与)、 |
(或)、 ^
(异或)、!
(非)、&&
(短路与、双与)、||
(短路或、双或)
① 短路与和单与符号的相同与不同点:
相同点: 短路与和单与运算的结果是一样的
不同点: 使用短路与的时候,如果左边的布尔表达式为false,则不会在运算右边的布尔表达式,从而提高了效率。使用单与的时候,即使发现左边的布尔表达式为false,还是会运算右边的布尔表达式的。
◆ 只有左边的布尔表达式为false时,双与的效率才要高于单与的。
② 短路或与单或的相同点与不同点:
相同点:运算的结果是一致的
不同点:使用短路或的时候,当发现左边的布尔表达式为true时,则不会运算右边的布尔表达式。使用单或的时候发现左边的布尔表达式为true,还是会运算右边布尔表达式
5、位运算符
位运算符:位运算符就是直接操作二进制位的(把1看成true,0看成false)
&
(与)、|
(或)、^
(异或)、~
(取反)
class Demo3.7{
public static void main(String[] args){
System.out.println(6&3); // 2
System.out.println(6|3); // 7
System.out.println(6^3); // 5
System.out.println(~7); // -8
}
}
① 规律: 如果操作数A连续异或同一个操作数两次,那么结果还是操作数A
② 应用: 对数据加密(异或)使用异或对图片数据进行加密
import java.io.*;
class Demo3.8{
public static void main(String[] args) throws Exception{
//找到图片文件
File inFile = new File("f:\\待加密的图片.jpg");
File outFile = new File("d:\\加密的图片.jpg");
//建立数据通道,让图片的二进制数据流入
FileInputStream input = new FileInputStream(inFile);
FileOutputStream output = new FileOutputStream(outFile);
//边读,把读到的数据异或一个数据并写出
int content = 0;//该变量用于存储读取到的数据
while((content = input.read())!=-1){
//如果没有到文件的末尾,那么继续读取数据
output.write(content^12);
}
//关闭资源
output.close();
input.close();
}
}
③ 位运算符可能会出现的笔试题目:
◆ 交换两个变量的值,不准出现第三方变量。
class Demo3.9{
public static void main(String[] args){
int a = 3;
int b = 5;
/*
方式1: 定义第三方变量
int temp = a; //3
a = b; //a = 5
b = temp;
*/
/*
方式2:相加法, 缺点: 两个int类型的数据相加,有可能会出现超出int的表示范围
a = a+b; // a =8
b = a-b; //b = 8 - 5 = 3
a = a-b; // a = 8 - 3 = 5
*/
/*
方式3: 可以使用异或。 缺点:逻辑不清晰
a = a^b; // a = 3^5
b = a^b; // b = (3^5)^5 = 3
a = a^b; // a = (5^3)^3 = 5
*/
System.out.println("a = "+ a+" b= "+b);
}
}
◆ 取出一个二进制数据的指定位数。要求读取该二进制数据的低4位
6、移位运算符
① <<
(左移)
规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以2的n次方,n就是左移的位数
3<<1 = 3 2(1) = 6
3<<2 = 32(2) = 12
3<<3 = 32(3) = 24
② >>
(右移)
规律:一个操作数在做右移运算的时候,实际上就是等于该操作数除以2的n次方,n就是右移的位数
3>>1 = 3 / 2(1) = 1
3>>2 = 3 / 2(2) = 0
③ >>>
(无符号右移)
无符号右移与右移的区别:
进行右移运算的时候,如果操作数是一个正数,那么左边的空缺位使用0补;如果操作数是一个负数,那么左边的空缺位使用1补。
而使用无符号右移的时候,不管是正数还是负数都统一使用0补。
④ 笔试题目:使用最高的效率算出2乘以8的结果。2<<3 = 22(3) = 16
class Demo3.10{
public static void main(String[] args){
//左移
System.out.println(3<<1); // 6
System.out.println(3<<2); // 12
System.out.println(3<<3); // 24
//右移
System.out.println(3>>>1); // 1
System.out.println(3>>>2); //0
}
}
7、三元运算符(三目运算符)
格式:布尔表达式?值1:值2
注意:使用三元运算符的时候,一定要使用该表达式返回的结果,或者是定义一个变量接收该表达式返回的结果。
class Demo3.11{
public static void main(String[] args){
int age = 26;
String result = age>=18?"成年人":"未成年人";
System.out.println(result);//成年人
}
}