索引
同简单数据类型的定义一样,Java虚拟机(JVM)还定义了索引(reference)这种数据类型。索引类型可以“引用”变量,由于Java没有明确地定义指针类型,所以索引类型可以被认为就是指向实际值或者指向变量所代表的实际值的指针。一个对象可以被多于一个以上的索引所“指”。JVM从不直接对对象寻址而是操作对象的索引。
索引类型分成三种,它们是:类(class)、接口(interface)和数组(array)。索引类型可以引用动态创建的类实例、普通实例和数组。索引还可以包含特殊的值,这就是null 索引。null 索引在运行时上并没有对应的类型,但它可以被转换为任何类型。索引类型的默认值就是null。
类
类(Class)指的是定义方法和数据的数据类型。从内部来看,JVM通常把class类型对象实现为指向方法和数据的一套指针。定义class类型的变量只能引用类的实例或者null ,如以下代码所示:
MyObject anObject = new MyObject(); // 合法
MyObject anotherObject = null; // 合法
MyObject stillAnotherObject = 0; // 非法
接口
接口(interface)好比一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用。接口不能被实例化。类可以实现多个接口并且通过这些实现的接口被索引。接口变量只能索引实现该接口的类的实例。比方说,假设我们定义了一个接口,名字是Comparable ,同时还定义了一个类SortItem,这个类实现了接口Comparable,那么我们可以编写以下的定义代码:
Comparable c = new SortItem();
假如Comparable 接口定义了一个方法: public void compare(Comparable item), 那么SortItem 类就必须提供compare 方法的实现,如以下代码所示:
public class SortItem implements Comparable
{
public void compare(Comparable item)
{
...method implementation here
}}
数组
Java数组(array)是动态创建的索引对象,这一点和类非常相似,此外,同类一样,数组只能索引数组的实例或者null ,如以下代码所示:
int[] myIntArray = new int[5];
int[] anotherIntArray = null;
数组是Object类的继承,这样,Object类的所有方法都可以被数组调用。数组对象由元素组成。元素的数目也可以为0,在这种情况下称做数组为空。所有的数组都是从0开始对元素编号的,这意味着数组内的第1个元素的索引编号是数字0。所有对数组元素的访问都会在运行时上接受检查,如果试图使用编号小于0或者大于数组长度来索引元素就会产生ArrayIndexOutOfBoundsException异常并被扔出。
数组的元素按整型值索引,如以下代码所示:
int[] myIntArray = { 9, 5, 6 };
int int1 = myIntArray[0];
int int2 = myIntArray[1];
int int3 = myIntArray[2];
数组对象的长度是不变的。为了改变数组变量的长度,你必须创建另一个数组并赋给变量,如以下代码所示:
int[] myIntArray = { 9, 5, 6 };
System.out.println("myIntArray length = " +myIntArray.length); // 输出结果是3
myIntArray = new int[] { 3, 6, 4, 2, 8 };
System.out.println("myIntArray length = " +myIntArray.length); // 输出结果是5
复合数据类型
Java语言不支持结构(struct)或联合(union)数据类型。它的复合数据类型是通过类或者接口来构造的,类提供了捆绑数据和方法的方式,同时可以限制对类的私有数据的访问。比如说,如果用C语言,那么汽车(car)就可以如下代码所示用结构来定义:
struct Car
{
char* model;
char* make;
int year;
Engine* engine;
Body* body;
Tire** tires;
}
以上的示范代码还隐含采用了先前定义的引擎(Engine)、车身(Body)和轮胎(Tire)结构。而采用Java语言,汽车的定义如清单A所示。
以上的示例还假设我们以前都已经定义过CarModels和CarMakes接口以及Engine、Body、Tire、DurangoEngine、DurangoBody和GoodyearTire类。
复合数据类型的初始化
复合数据类型由构造器内定义的代码实现初始化,构造器在类的创建函数(比如“new”之类)应用到类变量的时候被调用。构造器被调用之前,类的各个成员被初始化为各自的默认值或者显式赋予的初值。清单B 中的程序代码对以上过程进行了解释。
在清单B的代码中,当myClass 的实例用new 运算符创建时,构造器public MyClass()即被调用促使类对自身初始化。初始化的过程如下所示:
声明“int myInt;”给myInt赋默认值0。
声明“AnotherClass anotherClass;”给anotherClass分配默认值null。
构造器内的声明“myint = 2;”给myInt赋值为2。
预定义复合数据类型
Java语言包含了大量的预定义复合数据类型。其中之一的String 类属于java.lang 包。String 类提供的方法执行常用的字符串操作,比如length()、 substring(int beginIndex)、toUpperCase()、toLowerCase()、equals() 等等。另一种常用的Java复合数据类型是Vector 类,它属于java.util 包。Vector 类定义的方法执行可扩展对象数组的常用操作。比如add(int index, Object element)、elementAt(int index)、isEmpty()和remove(int index)等。这些就是一小部分预定义复合数据类型的代表示例。在以后的文章里我们还会进一步对预定义复合数据类型进行讨论。
小结
除了简单数据类型之外,Java语言中还定义了本文所讨论三种索引数据类型。Java还运行开发人员自己用简单和索引数据类型组合起来创建复合数据类型。用户定义的组合数据类型和Java预定义复合数据类型一道为程序员提供了强大的面向对象工具包。在接下来的文章里,我们会进一步详细地讨论大多数常用的复杂数据类型及其可用操作。我们会首先从Java所特有的集合框架讲起。
分享到:
相关推荐
其次,对于复杂的数据类型,如日期和时间,Java的Date和Calendar类在Hibernate中可以映射为java.sql.Date、java.sql.Time或java.sql.Timestamp。对于数组和集合,如List、Set、Map等,Hibernate提供了ListType、...
- **复杂数据类型**:存储在内存堆上,使用内存栈存储指向堆中对象的引用。 #### 四、使用字面量赋值的特性 当使用字面量给简单类型赋值时,需要注意以下几点: 1. **整数类型**:使用字面量赋值时,默认为`int`...
在Java中,Jython是一个非常有用的工具,它允许我们在Java应用程序中嵌入Python代码,并能够无缝地在Python数据类型和Java数据类型之间进行转换。这极大地扩展了Java的生态系统,让我们能够利用Python丰富的库和简洁...
本文将深入探讨如何使用Java操作Redis的四种主要数据类型:字符串(String)、列表(List)、哈希(Hash)和集合(Set)。 首先,我们来看**字符串类型**(String)。在Redis中,字符串是最基础的数据类型,可以...
本章我们将深入探讨Java中的核心概念——变量、数据类型和运算符,这些都是编写任何Java程序的基础。 首先,让我们从“变量”开始。在Java中,变量是用来存储数据的容器。每个变量都有一个特定的数据类型,它决定了...
本篇将深入探讨Java中的数据类型,包括基本数据类型和引用数据类型,并通过实例来展示如何使用这些数据类型。 Java中的8种基本数据类型分为两大类:数值类型和非数值类型。数值类型包括: 1. 字符型(char):char...
由于我做的是Java后端的开发,由于前端数据格式的是JSON格式的,所以后端的复杂数据类型转化成JOSN格式的数据就变成了很有必要而且也很重要的了,为此我找到了一种插件可以将Java常用的数据类型转化成JSON
Oracle数据库提供了更多的复杂数据类型,如OBJECT、ARRAY、REF,这些在Java中可以通过自定义类型映射或JDBC驱动的高级特性来处理。同时,Oracle的NCLOB和BFILE等非BLOB/CLOB类型用于存储特定类型的字符数据和大文件...
Java语言实验(数据类型和运算符) 本实验涵盖了Java语言的基本概念,包括数据类型、运算符和表达式。实验中涉及到变量的命名规则、数据类型的分类、运算符的优先级和结合性、表达式的计算顺序等知识点。 一、变量...
"传递复杂数据类型的AIDL服务的客户端"是一个示例程序,展示了如何通过AIDL在服务与客户端之间传递包含复杂数据类型的数据。 在Android中,当需要在不同的应用程序组件之间交换数据时,由于进程隔离,直接调用是不...
在Java编程语言中,了解基本数据类型的大小是至关重要的,因为这直接影响到程序的内存管理和性能。`Sizeof` 在Java中并不存在,与C++等语言不同,Java没有提供直接计算对象或变量在内存中占用字节数的内置方法。然而...
在Java开发中,导出Excel是一项常见的需求,尤其在数据报表和数据分析场景中。本示例涉及的主题是“java导出excel复杂表头”,这意味着我们要处理的不是简单的单级表头,而是包含多级或者多层次结构的表头。在描述中...
这些内容与数据类型结合,可以帮助开发者构建复杂的系统和解决实际问题。 在编程技巧方面,可能会涉及如何优化代码,提高程序效率,例如使用位运算代替常规算术运算以提升速度,或者通过合理使用数据结构和算法来...
在本项目中,"Java复杂计算器的实现(改进版)"是一个高级的编程实践,它旨在构建一个功能丰富的计算工具,能够处理复杂的数学运算。这个计算器不仅支持基本的加、减、乘、除,还可能包含对数、指数、平方根、三角...
在本课程“S1-使用Java语言理解程序逻辑-第二章变量、数据类型和运算符”中,我们将深入探讨Java编程的基础,特别是关注变量、数据类型以及运算符的使用。这些概念构成了任何程序的核心,是编写有效代码的基础。通过...
引用数据类型包括类、接口和数组,它们可以用来创建更复杂的数据结构。 在Java中,操作符是用于执行各种算术和逻辑操作的符号。Java支持多种类型的操作符,包括算术操作符(如+、-、*、/)、比较操作符(如==、!=、...
理解变量及其数据类型对于编写任何Java程序至关重要。 1. **什么是变量?** 变量是一个动态存储数据的容器,它的值可以在程序执行过程中改变。在Java中,变量必须先声明再使用,声明时需要指定其数据类型和名称。...
在Java编程语言中,我们使用一系列内置的数据类型来表示各种数据。然而,当我们与数据库进行交互,特别是使用ORM(对象关系映射)框架如Hibernate时,这些数据类型需要与数据库中对应的数据类型相匹配,以确保数据的...
例如,可以使用组合键(如用户ID+数据类型)来存储特定用户的特定数据。 5. **缓存策略**:在从Redis取数据前,应先检查数据是否存在。如果不存在,再从数据库中计算并存入Redis。此外,还需要考虑缓存更新和过期...