浅谈一下对软件构造中Java的数据类型与类型检验的理解
一、数据类型
Java中的数据类型包括基本数据类型和引用数据类型:
1. 基本数据类型
Java中的基本数据类型包括:byte、short、int、long、float、double、char和boolean。它们都是原始类型,被存储在栈中,不需要进行垃圾回收。
2. 引用数据类型
Java中的引用数据类型包括:类、接口、数组、枚举和注解等。它们都是对象,被存储在堆中,需要进行垃圾回收。引用数据类型可以分为类类型(class type)和接口类型(interface type),类类型也包括普通类(class)、抽象类(abstract class)、枚举(enum)和注解(annotation)。
同时,Java中每个基本数据类型都对应着一个包装类,包括:
- Boolean对应boolean
- Byte对应byte
- Short对应short
- Integer对应int
- Long对应long
- Float对应float
- Double对应double
- Character对应char
包装类的作用主要有两个:一是将基本数据类型转换为对象,便于在Java中使用面向对象编程的方式,二是提供了一些常用的方法,例如字符串转换、数值比较等。
3.对象层次结构
在Java中,所有的对象都继承自Object类,形成一个继承层次结构。
具体来说,所有的Java类都是Object类的子类,因此每个类都从Object类继承了许多方法。如果一个类没有指定父类,那么它默认继承自Object类。
在Object类之上还有一个顶级父类,叫做Class类。Class类表示Java程序中的所有类和接口的元信息,可以通过反射机制获得。
除此之外,像String、Integer、Long、Double等常用的类都在继承层次结构中占据着特殊的位置。例如,String类和Array类都是final类,不可被继承;而Integer、Long和Double这些包装类都继承自Number类。
4.重载(overload)
Java中的方法重载(Overloading)指的是在一个类中定义多个同名但参数列表不同的方法。Java编译器会根据实参的类型、数量和顺序来确定应该调用哪个重载方法。
方法重载的规则如下:
- 方法的参数列表必须不同(参数的类型、数量或顺序不同均可);
- 方法的返回值类型可以相同也可以不同;
- 方法的访问修饰符可以相同也可以不同;
- 方法的异常类型可以相同也可以不同;
- 重载方法必须在同一个类或者其子类中。
下面是一个方法重载的例子:
public class OverloadDemo {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public String add(String a, String b) {
return a + b;
}
}
在该例子中,add方法被重载了三次,分别是传入两个int型参数、两个double型参数和两个String型参数。当我们调用这个方法时,Java编译器会根据实参的类型来选择合适的方法。例如:
OverloadDemo overload = new OverloadDemo();
int result1 = overload.add(1, 2); // 调用add(int, int)
double result2 = overload.add(1.1, 2.2); // 调用add(double, double)
String result3 = overload.add("Hello", " world!"); // 调用add(String, String)
二、类型检验
Java中的类型检验主要有两种方式:编译时检验(静态检验)和运行时检验(动态检验)。
静态检验指的是Java编译器在编译Java代码时进行类型检查,确保程序中的类型匹配和兼容性。这样可以减少程序中的类型错误,提高程序的健壮性和可靠性。编译时类型检查通常会导致编译错误,在编译之前就需要解决这些错误。
动态检验指的是程序在运行时进行类型检查,主要是通过instanceof运算符来判断对象是否是某个类的实例。运行时类型检查通常用于处理输入数据的类型不确定、需要根据具体情况进行处理的情况。它可以保护程序避免类型错误产生的异常,提高程序的容错能力。在运行时检查,主要检查值(非法参数值、非法返回值、越界、空指针)
三、可变性与不可变性
该部分在“Java中的‘RI’与‘RI’”中有更为详细的解释
四、Snapshot diagram
Java中的Snapshot diagram(快照图)是一种用于描述对象状态的UML图形。它类似于类图,但更加注重状态和行为,通过捕捉系统中某个时刻的对象状态,来展示系统的行为。
快照图是通过沿用类图的表示方式,增加状态信息和对象执行某些操作的顺序图形成的。它展示了对象的状态,而不是对象的行为。它通常用于系统调试和测试中,可以帮助开发人员识别问题源和解决方案。
在Java中使用快照图,可以使用一些工具来自动生成快照图,例如Eclipse和IntelliJ IDEA等IDE都提供了快照图的生成工具。开发人员也可以手动绘制快照图。
下面是一个简单的Java快照图示例:
五、数组和集合
Java中的数组和集合是两种常用的数据结构,用于存储和访问多个元素。它们有一些共同点,但也有一些区别。
数组是一组相同类型的元素的集合,使用时需要指定数组的大小,一旦创建后,数组大小就不能改变。数组可以用来存储各种类型的元素,例如整数、浮点数、字符等,也可以用来存储对象。数组的元素可以通过索引位置进行访问和修改,索引从0开始。Java中的数组用[]来表示,例如int[] arr = {1, 2, 3, 4, 5};。
集合是一组元素的集合,不需要指定集合大小,并且可以动态的添加、删除和修改元素。集合有多种不同的实现方式,其中List、Set和Map是最常用的。List用于存储一组有序的元素,可以有重复元素,常用的实现类有ArrayList和LinkedList;Set用于存储一组无序的元素,不能有重复元素,常用的实现类有HashSet和TreeSet;Map用于将一组键值对映射到一组相应的值,常用的实现类有HashMap和TreeMap。Java中的集合使用泛型来保证类型安全,例如List<String> list = new ArrayList<String>();。
下面是一些数组和集合的操作示例:
创建数组:
int[] arr = {1, 2, 3, 4, 5};
String[] strs = {"Java", "Python", "C++"};
Object[] objs = {1, "Java", new Object()};
创建列表:
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Python");
list.add("C++");
创建集合:
Set<String> set = new HashSet<String>();
set.add("Java");
set.add("Python");
set.add("C++");
遍历数组:
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
遍历列表:
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
遍历集合:
for (String str : set) {
System.out.println(str);
}