作者:2233 | 来源:互联网 | 2023-08-10 15:32
数据类型
- Java中的数据类型包括基本数据类型和引用数据类型。
- 下图为Java数据类型的分类:
装箱(boxing)与拆箱(unboxing)
- Java数据类型中的8种简单类型分别为:boolean、byte、char、short、int、long、float和double,与之相对应的Java类库的java.lang包中定义了8种包装类(wrapper):Boolean、Byte、Character、Short、Integer、Long、Float、Double。
- 通过装箱和拆箱操作,可以实现简单类型与引用类型之间的转换。
- 装箱即将一个简单类型转换成对应的包装类型。把一个简单类型的值装箱,就是创建一个对应的包装类的实例,我们可以称之为“箱子”,并将这个值复制给这个对象,装箱后对应的包装类的实例对象存储在堆中。
- 拆箱即将一个包装类的实例对象类型转换成一个简单类型,拆箱过程一般分成两步,首先检查这个对象实例是否为给定的值类型的装箱值,然后把这个对象实例的值复制给值类型的变量。
- 值得注意的是,装箱和拆箱会导致额外的系统开销。
- eg:
public class Testdome1 {public static void main(String[] args) {Integer i =1;//装箱int j =i;//拆箱System.out.println(j);}
}
反编译后得到以下内容:
G:\javacode\HelloWorld>javac src\com\k\Testdome1.javaG:\javacode\HelloWorld>javap -c src.com.k.Testdome1
警告: 二进制文件src.com.k.Testdome1包含com.k.Testdome1
Compiled from "Testdome1.java"
public class com.k.Testdome1 {public com.k.Testdome1();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."":()V4: returnpublic static void main(java.lang.String[]);Code:0: iconst_11: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;4: astore5: aload_16: invokevirtual #3 // Method java/lang/Integer.intValue:()I9: istore_210: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;13: iload_214: invokevirtual #5 // Method java/io/PrintStream.println:(I)V17: return
}
从反编译得到的字节码内容可以看出,在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法的。
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxValue方法实现的。
Tip:
public class Testdome1 {public static void main(String[] args) {Integer i1 = 100;Integer i2 = 100;System.out.println(i1 == i2);System.out.println(i1.equals(i2));Integer i3 = 200;Integer i4 = 200;System.out.println(i3 == i4);System.out.println(i3.equals(i4));}
}
true
true
false
true
- 这里经常会出现错误,简单来说,“==”比较的是地址,“equals”比较的是指向的数值,i1和i2指向的是用一个对象,而i3和i4指向的是不同对象,此时我们查看Integer的valueof方法:
-public static Integer valueOf(int i) {
if(i >&#61; -128 && i <&#61; IntegerCache.high)
return IntegerCache.cache[i &#43; 128];
else
return new Integer(i);
} - 在通过valueOf方法创建Integer对象的时候&#xff0c;如果数值在**[-128,127]**之间&#xff0c;便返回指向IntegerCache.cache中已经存在的对象的引用&#xff1b;否则创建一个新的Integer对象。 上面的代码中i1和i2的数值为100&#xff0c;因此会直接从缓存cache中取已经存在的对象&#xff0c;所以i1和i2指向的是同一个对象&#xff0c;而i3和i4则是分别指向不同的对象&#xff0c;因为200已经不再范围内&#xff0c;会重新生成对象。
变量
- 变量表示存储位置。每个变量必须具有一个类型。程序通过改变变量的值来改变整个程序的状态&#xff0c;或者说得更大一些&#xff0c;也就是实现程序的功能逻辑。为了方便的引用变量的值&#xff0c;在程序中需要为变量设定一个名称&#xff0c;这就是变量名。Java是一种类型安全的语言&#xff0c;Java编译器保证存储在变量中的值具有合适的类型&#xff0c;通过赋值更改变量的值。
- 变量同时也可以分为实例变量&#xff0c;静态变量&#xff0c;以及局部变量。
- 注意&#xff1a;
&#xff08;1&#xff09;变量在使用之前必须声明&#xff1b;
&#xff08;2&#xff09;变量可以在声明的同时赋值&#xff0c;也可以先声明再赋值&#xff1b;
&#xff08;3&#xff09;变量一次只能赋一个值&#xff0c;但可以修改多次&#xff1b;
&#xff08;4&#xff09;静态变量不属于对象&#xff0c;只属于类本身&#xff0c;所以在JVM内存区域中放在方法区中&#xff1b;
&#xff08;5&#xff09;局部变量使用时必须初始化&#xff1b;一般放在虚拟机栈中&#xff1b;
&#xff08;6&#xff09;JVM&#xff08;Java visual machine&#xff09;内存区域分别有&#xff1a;堆&#xff08;heap&#xff09;、方法区&#xff08;method area&#xff09;、虚拟机栈&#xff08;VM stack&#xff09;、本地方法栈&#xff08;native method stack&#xff09;、程序计数器&#xff08;program counter register&#xff09;五部分&#xff1b;
&#xff08;7&#xff09;变量定义&#xff1a;变量名称由字母、数字、下划线&#xff08;_&#xff09;、美元符&#xff08;$&#xff09;组成即标识符&#xff08;标识符是严格定义大小写的&#xff09;&#xff0c;但是不包括&#64;、%、空格等&#xff0c;但是不能以数字、美元符号、下划线开头。 - 示例&#xff1a;int a; //实例变量&#xff1b;
static double b;//静态变量&#xff1b;
if&#xff08;i&#61;&#61;0&#xff09;{ int c &#61; 1; } //局部变量&#xff1b;
常量
- 常量分类&#xff1a;数值型常量&#xff08;整形或浮点型&#xff09;、字符型常量&#xff08;以‘’引起来的单个字符&#xff09;、转义字符常量&#xff08;以‘\’开头&#xff09;、字符串常量&#xff08;以“”引起来的单个字符或多个字符&#xff09;、布尔型常量&#xff08;true和false&#xff09;、null常量&#xff08;表示空&#xff0c;并非不存在&#xff09;、用户声明常量。
- 注意&#xff1a;
&#xff08;1&#xff09;常量名一般大写&#xff1b;
&#xff08;2&#xff09;第一次初始化赋值后不可改变其值&#xff1b;
&#xff08;3&#xff09;编译时统一进行处理&#xff1b;而变量是在运行时才能知道它的值&#xff1b;
&#xff08;4&#xff09;关键字定义&#xff1a;语法&#xff1a; final 常量名 &#61;值; //关键字&#xff1a;关键字是指Java中具有特殊功能的词&#xff0c;变量、类和方法等在命名时应该避免去使用这些关键字。常用的关键字&#xff1a;Abstract、break、case、catch、char、continue、do、double、else、final、finally、float、for、if、import、instanceof、int、class、long、private、protected、public、return、short、static、this、throw、throws、transient、try、void、volatile、while等。 - 示例&#xff1a;
int int1 &#61; 123&#xff1b;//整型常量&#xff1b;
double d1 &#61; 12.3; //双精度浮点型&#xff1b;
boolean b1 &#61; true; //布尔型&#xff1b;
final double TAX &#61; 100&#xff1b;//用户声明&#xff1b;
运算符
- 算术运算符&#xff1a;&#43;加 —减 *乘 /除 %取余
示例&#xff1a;注意数据类型
public class Testdome1 {public static void main(String[] args) {int a &#61; 10;int b &#61; 4;int c &#61; a / b;System.out.println("c"); /cfloat f1 &#61; 5 / 2; //2.0float f2 &#61; (float) (5.0 / 2); //2.5float f3 &#61; (float) 5 / 2; //2.5float f4 &#61; 5 / (float) 2; //2.5System.out.println(f1);System.out.println(f2);System.out.println(f3);System.out.println(f4);}}
取余&#xff1a; System.out.println(-10%3);//-1
System.out.println(-10%-3);//-1
System.out.println(10%-3);//1
System.out.println(10%3);//1
- 关系运算符&#xff1a;> <>&#61; <&#61; &#61;&#61;等于 !&#61;不等于
- 逻辑运算符&#xff1a;&&逻辑与&#xff08;111/100&#xff09; ||逻辑或&#xff08;000/011&#xff09; !非
- 位运算符&#xff1a;&按位与&#xff08;乘法&#xff09; |按位或&#xff08;加法&#xff09; ^按位异或&#xff08;同为0&#xff0c;异为1&#xff09; ~&#xff08;&#xff09;
- 移位运算符&#xff1a;>>右移&#xff08;除2^n ,补符号位&#xff09; <<左移&#xff08;乘2的n移位数&#xff09; >>>无符号右移&#xff08;只补0&#xff09;
- 条件运算符&#xff1a;三目运算符 &#xff1f;&#xff1a;
a?b &#xff1a;c &#xff1a;要求第一个操作元a的值必须是boolean类型数据。运算法则是&#xff1a;当a的值是true时&#xff0c;a?b&#xff1a;c运算的结果是b的值&#xff1b;当a的值是false时&#xff0c;a?b&#xff1a;c运算的结果是c的值。 - 自增自减运算符&#xff1a;&#43;&#43; —— 单目运算符&#xff0c;优先级是2级
&#43;&#43;x&#xff0c;–x表示在使用x之前&#xff0c;先将x的值加1或减1。
x&#43;&#43;&#xff0c;x–表示在使用x之后&#xff0c;将x的值加1或减1 - 例&#xff1a;注意自增自减运算符在操作元之前还是之后&#xff0c;以及赋值时的变化。
&#xff08;1&#xff09;
int a&#61;10;&#43;&#43;a;System.out.println(a);//11int b &#61; &#43;&#43;a;System.out.println(a);//12
&#xff08;2&#xff09;
int a&#61;10;a&#43;&#43;;System.out.println(a);//11
&#xff08;3&#xff09;
int a&#61;10;int b &#61; a&#43;&#43;;System.out.println(b);//10a &#61; a&#43;&#43;;System.out.println(a);//11
Over…欢迎一起讨论交流