变量就是申请内存来存储值,就是在创建变量的同时,需要在内存中申请空间
内存管理系统根据变量的类型分配存储空间,分配的空间只能用来存储该类型数据
Java的俩大数据类型:
-
内置数据类型
-
引用数据类型
内置数据类型
Java语言提供八种基本类型。六种数字类型、一种字符类型、一种布尔型
-
整数类型(整数值):
-
byte:1 字节,范围为 -128 到 127。
-
short:2 字节,范围为 -32,768 到 32,767。
-
int:4 字节,范围为 -2,147,483,648 到 2,147,483,647。
-
long:8 字节,范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
-
-
浮点数类型(浮点数值):
-
float:4 字节,范围为 ±3.40282347e+38F,具有约 6-7 位小数的精度。
-
double:8 字节,范围为 ±1.79769313486231570e+308,具有约 15 位小数的精度。
-
-
字符类型:
-
char:2 字节,表示单个 Unicode 字符,范围为 '\u0000' 到 '\uffff'。
-
-
布尔类型:
-
boolean:表示真(true)或假(false)。
-
这些基本数据类型提供了一种直接存储和操作数据的方式。它们在内存中分配的空间大小是固定的,不同类型的数据可以进行不同的计算和操作。在使用基本数据类型时,需要注意其范围和精度,以及适合的使用场景。
此外,Java还提供了一些特殊的数据类型,如字符串类型 String
,用于表示文本数据。字符串不是基本数据类型,但在实际开发中广泛使用。
以下是一个简单的学习例子,通过学习可以得知如何声明和使用基本数据类型:
public class 数据类型示例 {
public static void main(String[] args) {
byte myByte = 10;
short myShort = 100;
int myInt = 1000;
long myLong = 1000000L;
float myFloat = 3.14F;
double myDouble = 3.14159;
char myChar = 'A';
boolean myBoolean = true;
System.out.println("字节型: " + myByte);
System.out.println("短整型: " + myShort);
System.out.println("整型: " + myInt);
System.out.println("长整型: " + myLong);
System.out.println("单精度浮点型: " + myFloat);
System.out.println("双精度浮点型: " + myDouble);
System.out.println("字符型: " + myChar);
System.out.println("布尔型: " + myBoolean);
}
}
通过上述示例,我们可以看到不同基本数据类型的声明和初始化方式,并输出其对应的值。使用适当的基本数据类型可以有效地管理和操作数据,提高代码的效率和性能。
引用数据类型
概念:在Java中,引用数据类型是一种用于存储对象引用的数据类型。与基本数据类型不同,引用数据类型并不直接存储实际的数据值,而是存储指向对象在内存中存储位置的引用。引用数据类型包括类、接口、数组和枚举。所有引用类型的默认值都是null。
以下是常见的引用数据类型:
-
类(Class):类是用户自定义的引用数据类型,用于描述具有相似特征和行为的对象。类由属性(成员变量)和方法组成,可以创建多个对象实例。
-
接口(Interface):接口是一种规范,定义了一组方法的契约,但不提供实现。类可以实现(implement)一个或多个接口,从而获得接口定义的方法。
-
数组(Array):数组是用于存储相同类型的多个元素的容器。数组的大小在创建时确定,可以通过索引访问和修改数组元素。
-
枚举(Enum):枚举是一种特殊的引用数据类型,用于表示一组固定的常量。枚举常常用于表示有限的可能性,如星期几、颜色等。
-
String(字符串):String 是 Java 中的一个特殊引用数据类型,用于表示文本数据。String 类提供了许多字符串操作的方法,例如连接、截取、替换等。
-
包装类(Wrapper Classes):包装类是一种将基本数据类型封装为对象的引用数据类型。每个基本数据类型都有对应的包装类,例如 Integer、Double、Boolean 等,用于在需要对象的上下文中使用基本数据类型。
-
集合类(Collection Classes):集合类是用于存储和操作一组对象的引用数据类型。Java 提供了许多集合类,如 ArrayList、LinkedList、HashSet、HashMap 等,用于实现不同的集合数据结构和操作。
引用数据类型的应用场景广泛,主要包括以下几个方面:
-
对象建模和封装:引用数据类型的主要应用是通过类来建模和封装现实世界中的对象。通过定义类和使用引用数据类型,可以描述和操作对象的属性和行为。
-
抽象和多态:接口是引用数据类型的一种形式,它可以用于实现抽象和多态的概念。通过定义接口,可以将不同的类组织在一起,并以统一的方式进行访问和操作。
-
数据集合和处理:数组是引用数据类型的一种形式,用于存储多个元素。数组提供了便捷的数据集合和处理方式,可以对元素进行访问、遍历和修改。
引用数据类型的特点包括:
-
内存动态分配:引用数据类型的对象在运行时动态分配内存,可以根据需要创建和销毁对象。
-
对象引用:引用数据类型的变量存储的是对象的引用,而不是对象本身。通过引用,可以访问和操作对象的属性和方法。
-
对象的生命周期:引用数据类型的对象的生命周期由垃圾回收器控制。当对象不再被引用时,垃圾回收器将自动回收该对象所占用的内存。
引用数据类型在Java中提供了更灵活和复杂的数据处理能力。通过合理使用引用数据类型,可以构建丰富的对象模型,并实现抽象、封装和多态等面向对象编程的特性。
Java中常量
在Java中,常量是指在程序执行期间不可更改的固定值。常量在程序中使用时保持不变,并且具有固定的取值。Java提供了几种定义常量的方式:
-
字面常量:字面常量是直接写入代码中的常量值。例如,整数常量
10
、浮点数常量3.14
、字符常量'A'
、字符串常量"Hello"
等都属于字面常量。 -
final关键字:使用
final
关键字可以将变量声明为常量。一旦将变量声明为final
,其值就不能再改变。例如:final int MAX_VALUE = 100; final double PI = 3.14; final String GREETING = "Hello";
-
枚举(Enum):枚举是一种特殊的常量类型,用于定义一组固定的常量值。枚举常量在定义时就确定,并且可以通过枚举类型访问。例如:
enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; }
使用常量的好处包括:
-
可读性:使用常量可以使代码更易读和理解,因为常量的含义明确且不会改变。
-
可维护性:通过使用常量,如果需要更改常量的值,只需要修改常量的定义处,而不需要在整个代码中查找和修改。
-
安全性:将某些值声明为常量可以防止其在程序执行过程中被修改,提高程序的安全性。
在实际开发中,常量常用于存储不会改变的配置值、固定的数学常量、枚举值等。通过使用常量,可以提高代码的可读性、可维护性和安全性。
在Java中,常量的命名规则通常遵循以下约定:
-
全部大写:常量的名称通常使用大写字母,多个单词之间使用下划线(_)分隔。例如:
MAX_VALUE
,PI
,GREETING
. -
描述性名称:**常量的名称应具有描述性,能够清晰地表达常量所代表的含义。使用有意义的单词或短语来命名常量,以便其他开发人员能够理解其用途。**
-
遵循命名约定:常量的命名应遵循Java的命名约定,例如使用驼峰命名法(Camel Case)或下划线命名法(Snake Case)。在驼峰命名法中,多个单词的首字母小写,后续单词的首字母大写,如
myVariableName
。在下划线命名法中,所有字母都小写,并使用下划线分隔单词,如my_variable_name
。但是Java中命名约定建议将常量的名称全部大写,并使用下划线分隔单词,以便清晰地区分常量和其他标识符。 -
常量修饰词:为了进一步明确常量的特性,可以使用修饰词
final
来声明常量。这样可以确保常量的值在初始化后不会被修改。
以下是一些符合常量命名规则的示例:
final int MAX_VALUE = 100;
final double PI = 3.14;
final String GREETING_MESSAGE = "Hello";
使用全大写和下划线命名常量的好处是,它们更容易与其他标识符(如变量和方法)进行区分,从而提高代码的可读性和可维护性。此外,全大写的常量名称也是一种约定俗成的做法,使得其他开发人员更容易识别和理解代码中的常量。
Java语言支持一些特殊的转义字符序列。
符号 | 字符含义 |
---|---|
\n | 换行 (0x0a) |
\r | 回车 (0x0d) |
\f | 换页符(0x0c) |
\b | 退格 (0x08) |
\0 | 空字符 (0x0) |
\s | 空格 (0x20) |
\t | 制表符 |
" | 双引号 |
' | 单引号 |
\ | 反斜杠 |
\ddd | 八进制字符 (ddd) |
\uxxxx | 16进制Unicode字符 (xxxx) |
自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换的规则默认是:从低级到高级。
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
数据类型转换必须满足如下规则:
- 不能对boolean类型进行类型转换。
- 不能把对象类型转换成不相关类的对象。
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
转换过程中可能导致溢出或损失精度,例如:
int i =128; byte b = (byte)i;
因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int)23.7 == 23;
(int)-45.89f == -45
自动类型转换
必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
实例
public class QiangZhiZhuanHuan{
public static void main(String[] args){
int i1 = 123;
byte b = (byte)i1;//强制类型转换为byte
System.out.println("int强制类型转换为byte后的值等于"+b);
}
}
运行结果为:
char自动类型转换为int后的值等于97
char类型和int计算后的值等于66
解析:c1 的值为字符 a ,查 ASCII 码表可知对应的 int 类型值为 97, A 对应值为 65,所以 i2=65+1=66。
强制类型转换
条件是转换的数据类型必须是兼容的。
概念:在Java中,强制类型转换(Type Casting)是指将一个数据类型转换为另一个数据类型的过程。它可以将一个较大范围的数据类型转换为较小范围的数据类型,或者将一个父类对象转换为子类对象。强制类型转换需要使用括号和目标类型进行显式转换。
强制类型转换的原理是根据数据类型的兼容性和类型转换规则来执行转换。当进行强制类型转换时,编译器会检查两种类型之间的关系,并根据规则进行转换。如果目标类型能够容纳原始值,转换就会成功,否则会出现编译错误。
强制类型转换可能导致以下几种情况的出现:
简单实例
public class 强制类型转换示例 {
public static void main(String[] args) {
// 定义一个整数
int num1 = 10;
// 定义一个浮点数
double num2 = 3.14;
// 进行强制类型转换,将浮点数转换为整数
int num3 = (int) num2;
// 输出转换后的整数
System.out.println("转换后的整数:" + num3);
// 定义一个长整数
long num4 = 10000000000L;
// 进行强制类型转换,将长整数转换为整数
int num5 = (int) num4;
// 输出转换后的整数,注意会发生数据溢出
System.out.println("转换后的整数:" + num5);
// 定义一个整数
int num6 = 65;
// 进行强制类型转换,将整数转换为字符
char ch = (char) num6;
// 输出转换后的字符
System.out.println("转换后的字符:" + ch);
}
}
通过这个示例,我们可以看到三种不同的强制类型转换:
1.将浮点数 3.14
转换为整数类型,小数部分被舍弃,得到整数 3
。
2.将长整数 10000000000
转换为整数类型,由于超出了整数的范围,导致数据溢出,得到一个不准确的整数值。
3.整数 65
转换为字符类型,根据 ASCII 码表,对应的字符是大写字母 'A'
。
可以看到在进行强制类型转换时,可能会发生数据丢失、数据溢出或引发运行时异常。因此,要谨慎使用强制类型转换,确保转换的结果符合预期。
格式:(type)value type是要强制类型转换后的数据类型
-
数据精度丢失:当将一个高精度的数据类型转换为低精度的数据类型时,可能会发生数据精度的丢失。例如,将一个浮点数转换为整数时,小数部分将被舍弃。
-
数据溢出:当将一个较大范围的数据类型转换为较小范围的数据类型时,可能会发生数据溢出。例如,将一个超出字节范围的整数转换为字节类型时,将会截断高位数据。
-
类型不兼容:强制类型转换只能在相关的数据类型之间进行,否则会导致编译错误。例如,将一个字符串直接强制转换为整数是不允许的。
强制类型转换的应用场景包括:
-
处理数据类型不匹配:当需要将一个数据类型转换为另一个数据类型以进行特定的计算或操作时,可以使用强制类型转换。例如,将一个长整数转换为整数以满足特定的计算要求。
-
处理继承关系:当需要将一个父类对象转换为子类对象时,可以使用强制类型转换。这通常在需要调用子类特有的方法或访问子类特有的属性时发生。
PS:强制类型转换可能会导致数据丢失、溢出或引发运行时异常,因此在进行强制类型转换时应谨慎操作。在进行转换之前,应该先进行类型检查或使用类型转换运算符进行安全检查,以确保转换的可行性。同时,应该遵循类型转换规则和最佳实践,避免出现类型转换错误和数据异常。
隐含强制类型转换
- 整数的默认类型是 int。
- 小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 F 或者 f。
概念:
在Java中,隐含强制类型转换(Implicit Type Casting)是指将一个数据类型自动转换为另一个数据类型的过程,而无需显式的类型转换操作。隐含强制类型转换是编译器根据数据类型的兼容性和类型转换规则自动执行的。
隐含强制类型转换的规则如下:
-
小范围数据类型向大范围数据类型的自动转换:如果目标类型能够容纳源类型的所有取值范围,编译器会自动进行转换。例如,将一个整数赋值给长整数类型。
-
整数类型向浮点数类型的自动转换:如果源类型是整数类型,而目标类型是浮点数类型,编译器会自动将整数转换为相应的浮点数。例如,将整数赋值给双精度浮点数类型。
-
字符类型向整数类型的自动转换:如果源类型是字符类型,而目标类型是整数类型,编译器会自动将字符的 ASCII 值转换为整数。例如,将字符赋值给整数类型。
-
自动装箱和拆箱:自动装箱是指将基本数据类型自动转换为对应的包装类对象,而自动拆箱是指将包装类对象自动转换为基本数据类型。这种转换在基本数据类型和其对应的包装类之间自动进行。
隐含强制类型转换的应用场景包括:
-
表达式中的类型转换:当表达式中使用不同的数据类型进行运算时,编译器会根据类型转换规则自动进行类型转换,以便执行运算。
-
方法参数传递:当调用方法时,如果方法的参数类型与实际传递的参数类型不完全匹配,但能够进行隐含强制类型转换,编译器会自动进行转换。
PS:隐含强制类型转换是由编译器自动执行的,但在某些情况下可能会导致数据精度丢失或溢出的问题。为了确保转换的准确性和安全性,应理解隐含强制类型转换的规则,并谨慎处理数据类型的转换。在某些情况下,显式强制类型转换会更加明确和可靠。
结尾语:记录于2023年7月11日15点17分,以上仅为个人在*菜鸟教程Java*的学习过程中遇到的问题,还有记录的个人想法,有错误欢迎指出,感谢!