服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java入门(6)java数据类型


  摘要

  本章将目光聚焦在java的数据类型上,通过本章的学习,读者应能熟练定义、使用基本数据类型、字符串类以及数组。


--------------------------------------------------------------------------------


  本章目标:

  本章将目光聚焦在java的数据类型上,通过本章的学习,读者应能熟练定义、使用基本数据类型、字符串类以及数组。

  6.1 基本数据类型

  传授新知

  在java语言中,数据类型可以分为两大类:

  1)基本类型;

  2)扩展类型。

  在本小节中,我们就一起来学习一下java语言的基本数据类型。它包括:boolean、char、byte、int、short、long、float、double八种:

  类型 描述 取值范围

  boolean 布尔型 只有两个值true、false

  char 字符型

  byte 8位带符号整数 -128到127之间的任意整数

  short 16位无符号整数 -32768~32767之间的任意整数

  int 32位带符号整数 -231到231-1之间的任意整数

  long 64位带符号整数 -263到263-1之间的任意整数

  float 32位单精度浮点数 根据ieee754-1985标准

  double 64位双精度浮点数 根据ieee754-1985标准

  表6-1 java基本数据类型一览表

  一些提示:

  不象其它程序设计语言,java语言中的整型的位数是固定的,而不会根据硬件平台以及操作系统的不同而不同。

  6.1.1 boolean型

  在上一章的逻辑运算符中,我们就已经看到过了取值为true和false的变量,这种变量称为boolean型变量。

  实例说明

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad test601.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:test601.java


public class test601
{
public static void main(string args[])
{
boolean x=true;
boolean y=false;
system.out.println("x&&y="+(x&&y));
system.out.println("x||y="+(x||y));
system.out.println("x^y="+(x^y));
system.out.println("!x="+(!x));
}
}



  2.编译程序,输入命令:


c:javastudy> javac test601.java



  3.编译完成后,执行这个程序了。输入命令:


c:javastudy> java test601



  这个程序的输出如下图所示:


  图6-1 程序test601.java的输出

  根据逻辑运算符的计算表可以得出x&&y=true&&false=false;x||y=true||false=true;x^y=true^false=true;!x=!true=false。

  传授新知

  6.1.2 char型

  char型是用来表示字母的,它仅能表示一个单一的字母。通常char型常量必须使用单引号括起来,以与数字区分开来。下面就是一个char型变量的实例:


char letter=’a’;



  char型在java语言中并不是很常用,因为如果要存储字符的话,一般使用扩展的数据类型string(我们将在下一小节中说明)。

  6.1.3 整型

  在java语言中,提供了多种整型数据类型:byte、short、int、long。它们都是定义了一个整数,唯一的区别就是它们能够表示数据的范围。

  能够表示数据的范围越大,占用的内存空间也就越大,因此,在程序设计中应该选择最合适的类型来定义整数。

  大家可以根据以下规律,记住它们所占的内存空间:

  1) int是最基本的,它占用32位(现代计算机不就是32位机嘛!);

  2) long,长的,也就是比int还长,它占用64位;

  3) short,短的,也就是比short还短,它占用16位;

  4) byte,字节,8位组成一个字节,当然byte就只占8位了。

  根据它们所占用的内存空间不同,能够表示的数字范围也不同。占用内存空间越大,能够表示的数字范围也就越广。

  实例说明

  实例一:

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad test602.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:test602.java


public class test602
{
public static void main(string args[])
{
int x=20;
system.out.println(x+5);
system.out.println(x*7);
}
}



  2.编译程序,输入命令:


c:javastudy> javac test602.java



  3.编译完成后,执行这个程序了。输入命令:


c:javastudy> java test602



  这个程序的输出如下图所示:


  图6-2 test602程序输出

  实例二:

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad test603.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:test603.java


public class test603
{
public static void main(string args[])
{
byte x=129;
system.out.println(x+5);
}
}



  2.编译程序,输入命令:


c:javastudy> javac test603.java



  在编译这个程序时,将无法通过,出现以下问题:


  图6-3 编译test603.java时出错信息

  这是为什么呢?错在哪里呢?

  由于x是byte型数据,它占用8位空间,最大能够表示的数是128,而本例中赋给值129,超出了取值范围,所以导致了编译错误。

  传授新知

  6.1.4 浮点型

  前面我们学习了存储整数的变量数据类型,现在我们还看看存储小数的变量数据类型---浮点数。在java语言中有两种浮点数类型:float、double。

  其中float是单精度型,占用32位内存空间,而double是双精度型,占用64位内存空间。

  浮点数:

  浮点数这个名称是相对于定点数而言的,这个点就是小数点。浮点数就是指小数点可以根据需要改位置。

  实例说明

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad test604.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:test604.java


public class test604
{
public static void main(string args[])
{
float x1=7;
float y1=9;
double x2=7.0;
double y2=9.0;
system.out.println(x1/y1);
system.out.println(x2/y2);
}
}



  2.编译程序,输入命令:


c:javastudy> javac test604.java



  3.编译完成后,执行这个程序了。输入命令:


c:javastudy> java test604



  这个程序的输出如下图所示:


  图6-4 test604程序输出

  同样是7/9,使用float型与使用double型,输出的结果不同,显然double型的输出的数字精度要高得多。

  自测练习

  1) 以下不属于基本数据类型的有_____________。

  a. string b.char c.double d.int

  2) 下面数据类型中___________占用的空间最大。

  a.float b.int c.long d.byte

  3) 在程序中有一表达式为short x=64589,程序能够正常编译吗?________。

  a.不能 b.能

  请说明理由:__________________________________。

  4) 请写出下列代码的输出:


boolean x=true;
boolean y=true;
system.out.println(x^!y)



  ________________________________________________________________

  5) 阅读以下程序段,回答问题


public class lianxi601
{
public static void main(string args[])
{
byte x=126;
byte y=x+5;
system.out.println(y);
}
}



  这个程序能够编译通过吗?________________

  这是因为:_______________________________________________________

  6) 请写出下列代码的输出:


byte x=126;
system.out.println(x+5);



  ____________________________________________________________________

  7) 假设x、y都是float型,分别等于5和7,而x1、y1则是double型,分别等于5.0和7.0,那么x/y与x1/y1的值相等吗?____________。

  a.不等 b.相等

  请说明理由:______________________________________。

  8) 假设x、y都是float型,分别等于5和8,而x1、y1则是double型,分别等于5.0和8.0,那么x/y与x1/y1的值相等吗?____________。

  a.不等 b.相等

  请说明理由:______________________________________。

  请写出检验它的程序段。

  ____________________________________________________________________

  ____________________________________________________________________

  ____________________________________________________________________

  ____________________________________________________________________

  ____________________________________________________________________

  ____________________________________________________________________

  练习答案

  1)a string型是字符串型,它不属于java的基本数据类型。

  2)c 其中float占32位空间,int占32位空间,long占64位空间,byte占8位空间,因此是long所占的空间最大。

  3)b 不能正常编译,因为short型的取值范围是-32768-32767,而在程序中x=64589超出了这一范围,将导致编译失败。

  4)true 这个程序段将输出true,因为!运算符的优先级比^运算符优先级高,因此先计算!y,得到false,然后计算true^false,因此得到true。

  5)不能,当编译到byte y=x+5;时将会出错,这时因为这种等价于byte y=131;,而byte类型的取值范围是-127~128之间,这样的定义超出了这一范围,导致编译失败。

  6) 131

  7) a 不相等,由于5/7都将产生无限不循环小数,而float与double两种数据类型的精度不相等,因此将产生不相等的输出。

  8) b 相等,由于5/8将得到0.625,float与double两种数据类型的精度都足以表示这个值,因些将产生相等的输出。我们可以使用以下程序来检验:


public class answer08
{
public static void main(string args[])
{
float x=5,y=8;
double x1=5.0,y1=8.0;
system.out.println((x/y)==(x1/y1));
}
}



  注意:

  我们可以使用float x=5,y=8;来代替float x=5;float y=8。

  这个程序将输出true,说明它们是相等的,验证了我们的答案。

  6.2 字符串类

  传授新知

  在上一小节中,我们讲述过字符型char,当时我们告诉大家char型变量只能存储一个字符,因此一般并不常用,而是使用string型变量来保存字符。

  string型,是一种用来存储字符串的数据类型。记得从第一章开始就见到过类似于下面的字符串型变量定义:


string programout;



  而且,当时我们还借用了它来说明变量的定义。

  我们可以使用两种方法来定义一个字符串:

  1) 使用变量定义的方式,例如:


string programout=”hello world!!”;



  2) 使用new操作符,例如:


string programout=new string(”hello world!!”);



  通常,我们使用第1种方法来定义string变量。

  实例说明

  实例一:

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad test605.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:test605.java


public class test605
{
public static void main(string args[])
{
string firstname = “mike”;
string lastname = “joeden”;
string fullname = firstname+” “+lastname;
system.out.println(fullname);
}
}



  2.编译程序,输入命令:


c:javastudy> javac test605.java



  3.编译完成后,执行这个程序了。输入命令:


c:javastudy> java test605



  这个程序的输出如下图所示:


  图6-5 test605程序输出

  实例二:

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad test606.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:test606.java


public class test606
{
public static void main(string args[])
{
string programout = “i’m enjoy java program world”;
int outlen = programout.length();
system.out.println(outlen);
}
}



  2.编译程序,输入命令:


c:javastudy> javac test606.java



  3.编译完成后,执行这个程序了。输入命令:


c:javastudy> java test606



  这个程序的输出如下图所示:


  图6-6 test606程序输出

  实例三:

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad test607.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:test607.java


public class test607
{
public static void main(string args[])
{
string programout = “i’m enjoy java program world”;
int index = programout.indexof(“java”);
system.out.println(index);
}
}



  2.编译程序,输入命令:


c:javastudy> javac test607.java



  3.编译完成后,执行这个程序了。输入命令:


c:javastudy> java test607



  这个程序的输出如下图所示:


  图6-7 test607程序输出

  实例四:

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad test608.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:test608.java


public class test608
{
public static void main(string args[])
{
string programout = “i’m enjoy java program world”;
string prehalf=programout.substring(0,14);
string backhalf=prgramout.substring(14);
system.out.println(prehalf);
system.out.println(backhalf);
}
}



  2.编译程序,输入命令:


c:javastudy> javac test608.java



  3.编译完成后,执行这个程序了。输入命令:


c:javastudy> java test608



  这个程序的输出如下图所示:


  图6-8 test608程序输出

  传授新知

  字符串合并:

  通过程序test605.java,我们可以看到一个表达式:


fullname=firstname+” “+lastname;



  通过程序的运行结果我们得知,通过这个表达式,我们可以完成字符串合并。在本例中,实现了将字符串firstname与lastname合并,并在中间加上一个空格,形成一个新的字符串fullname。

  求字符串长度:

  有时,我们需要计算出一个字符串的长度,在java语言中提供了一个方法length()可以满足这个需求。它在java api中定义为:


public int length()



  其中,public代表任何外部类都可以访问它,使用它;而int则表示这个函数将返回一个整数,也就是字符串的长度值。

  例如,在程序test606.java中,我们定义了一个名为programout的字符串变量,然后将字符串“i’m enjoy java program world”赋予了这个变量。在程序中,通过调用length得到了这个字符串的长度:28,并且打印到屏幕上。


int outlen=programout.length()



  注意,在这里调用length方法的格式:programout.length。

  在字符串中查找:

  在字符串操作的程序中,经常需要在一个字符串中查找某一个单词,我们可以使用java语言中的一个方法indexof()来满足这个需求。它在java api中的定义是:


public int indexof(string findme)



  同样,public代表任何外部类可以访问它,而int表示它将返回一个整数值,也就是在字符串中包含要查找的单词findme的第一个出现位置。

  在程序test607.java中,我们就使用了这个函数在字符串:“i’m enjoy java program world”中查找单词java所在位置。那么,为什么返回值是10呢?这时因为:

  字符串中每个字符都有一个在该字符串中的位置。第一个字符的位置是0,第二个字符的位置为1,以此类推。(注意,是字符,也就是包括数字、字母、标点符号,还包括空格。)所以,java所处在的位置就是10,如下图所示:


  图6-9 字符串位置示意图

  求子串方法

  子串是字符串的一部分。在一些字符串操作的程序中,经常会需要求一个字符串的子串。我们可以通过使用java语言提供的求子串方法substring来实现。在java api中是这样定义它的:


public string substring(int startindex)
public string substring(int startindex,endindex)



  这个方法的定义很明显,它是一个可供所有外部类调用的方法(public指定);它将返回一个字符串(返回值类型是string);这个方法在调用时必须给参数,参数有两种形式:

  1) 一种是给出开始位置,表示从指定的开始位置开始,直到字符串结束;

  2) 另一种是给出开始位置和结束位置,表示从指定的开始位置开始,直到结束位置。

  我们从程序test608.java的输出中就可以很明显地知道。

  自测练习

  1) 代码”hello,”+”world!!”的结果是什么?________________。

   a. “hello,+world!!” b.出错

   c.”hello,world!!” d.”hello, world!!”

  2) 返回字符串的长度(字符数)的方法是____________。

  a.width() b.size() c.length()

  3) 若有字符串test=”i love java!”,那么test.indexof(“java”)=______。

  a. 8 b. 7 c.6 d. 5

  4) 阅读以下程序段,回答问题:


public class lianxi602
{
public static void main(string args[])
{
string programout=”i love java program language”;
string key=”love”;
int index=programout.indexof(key);
system.out.println(“found key at “+index);
}
}



  这段程序将产生什么样的输出:

  ___________________________________________________________________

  如果把key的值改为“java”,则程序将输出什么?

  ___________________________________________________________________

  编写代码,使用substring方法从字符串programout中摘出单词“language”。

  ___________________________________________________________________

  你能想出更好的完成上一任务的方法吗?

  ___________________________________________________________________

  ___________________________________________________________________

  5) 根据给定的以下代码:


string str01=”i’ll use java language”;
string str02=”haha,very good”;



  写出产生以下输出的程序:


  图6-10 练习题图

  ___________________________________________________________________

  ___________________________________________________________________

  练习答案

  1)c 对于字符串而言,+号完成的功能是字符串合并。第一个答案“hello,+world!!”多了个+,最后一个答案“hello, world!!”多了个空格。

  2)c java语言提供了一个叫length()的方法,能够计算字符串的长度。

  3)b 因为字符串的位置是从0算起的,所有的字母、数字、标点、空格都应计算在内,所以应该为7.

  4)§ 这个程序的输出是found key at 2;

  § 如果将key的值改为“java”的话,程序的输出将变成:found key at 7;

  § 可以使用程序:


string substr=programout.substring(20);



  § 可以使用程序:


int index=prograout.indexof(“language”)
string substr=programout.substring(index);



  6) 可以使用以下程序:


system.out.println("length of ′"+str01+"′ is: "+str01.length());
system.out.println("length of ′"+str02+"′ is: "+str02.length());



  6.3 数组

  实例说明

  1.首先,我们使用以下命令调用“写字板”程序来编辑源程序。


c:javastudy> notepad arraytest.java



  在写字板中,输入下面的程序代码,然后存盘退出。

  源程序:arraytest.java


public class arraytest
{
public static void main(string args[])
{
int intarray[ ]={30,20,10,-10};
string stringarray[ ]={“first”,”second”,”third”};
system.out.println(intarray[0]);
system.out.println(intarray[1]);
system.out.println(intarray[2]);
system.out.println(intarray[3]);
system.out.println(stringarray.length);
}
}



  2.编译程序,输入命令:


c:javastudy> javac arraytest.java



  3.编译完成后,执行这个程序了。输入命令:


c:javastudy> java arraytest



  这个程序的输出如下图所示:


  图6-11 arraytest.java程序输出

  传授新知

  在arraytest.java程序,我们发现了两个与前面的例子都不相同的变量声明:


int intarray[ ]={30,20,10,-10};
string stringarray[ ]={“first”,”second”,”third”};



  这两个变量的类型与前面讲过的有点不同,它就是本小节的主角----数组。正如我们看到的一样,数组intarray是由四个int型常量:30、20、10、-10组成的;而数组stringarray则是由三个string型常量“first”、“second”、“third”组成的。

  数组,是相似元素的有序集合。在一个数组中的所有元素必须是相同类型的。

  6.3.1 定义数组

  下面,我们就来仔细地观察一下数组的定义:


  图6-12 定义数组格式图解

  正如上图所示,数组变量的命名同其他任何变量一样,但是我们利用方括号([ ])表明该变量是一个数组。定义数组的方式有三种:

  1)零数组:表明数组存在,但没有值。


int firstarray[ ];



  2)预留空间:为数组预留一些存储空间,但并未马上赋值。


int secondarray[ ]=new int[5];



  在这里,我们定义了一个数组secondarray,并为其预留了够存放5个int型数的空间。

  3) 一次性完成定义与赋值:


int intarray[ ]={30,20,10,-10};



  注意:

  在java语言中,数组一经定义之后就不能够改变其大小,这与其它程序设计语言中不同,在编程时一定要注意这点。

  6.3.2 访问数组

  由于数组中包含了多个变量,所以访问起来就一定与变量不相同。在程序arraytest.java中是这样访问数组中的内容的:


system.out.println(intarray[0]);
system.out.println(intarray[1]);
system.out.println(intarray[2]);
system.out.println(intarray[3]);



  通过对这个程序运行结果的观察,我们发现intarray[0]就是数组intarray中的第1个值:30,intarray[1]则是数组intarray的第2个值……,以此类推。

  从中,我们可以总结出,访问数组内容可以使用:

  数组名[下标]

  下标从0开始。

  6.3.3 求数组长度

  在arraytest.java程序中还有一个语句,我们没有提到,那就是:


system.out.println(stringarray.length);



  而从这个程序的输出,可以知道这一句输出的值是3。这句程序的目的是打印出字符串数组stringarray的长度。

  数组的长度是指数组中元素的个数。

  有的读者阅读到这里,可能会觉得奇怪,字符串数组stringarray的值是:“first”、”second”、”third”,那么为什么长度会是3,而不是5+6+5=16个呢?请读者一定要记住,数组长度衡量的是元素,它并不管元素是什么。你看,字符串数组stringarray不正是包含3个字符串吗!

  自测练习

  1) 下面中哪个变量是数组?___________。

  a. intarray b. test () c. iamarray{} d.notarray[]

  2) 下面表达式中,用来访问数组中第一个值的是____________。

  a. intarray[1] b.intarray.1 c.intarray[0] d.intarray.0

  3) 使用system.out.println(数组名)就可以打印出数组的内容?_______

  a.对 b.错

  4) 定义完数组后,我们______根据实际需要,再动态调整数组大小。

  a.不能 b.可以

  5) 数组中可以包含什么类型的元素?_____________。

  a.int型 b.string型 c.数组 d.以上都可以

  6) 根据要求,写出程序段:

  要求:创建一个字符串数组weeks,使其包含周一至周日的英文名称。

  程序段:

  ___________________________________________________________________

  ____________________________________________________________________

  7) 阅读以下程序代码,回答问题:

  程序代码:


string lesson[ ] = {“chiness”, “math”, “english”, “physical”};
string class[ ] ;
class = lesson;



  其中lesson[1]的值是什么?____________________________________

  那么class[3]的值呢?____________________________________

  如果要将math改成maths的话,应该如何做。

  ____________________________________________________________________

  8) 试着运行以下程序,看看得到什么结果:


public class lianxi603
{
public static void main(string args[])
{
string stringarray[ ]={“first”,”second”,”third”};
system.out.println(stringarray);
}
}



  练习答案

  1)d 尽管叫notarray,但的确是数组,做为数组必须在后面加上“[]”。

  2)c 访问第1个值应该是使用下标0,也就是intarray[0]。

  3)a 这样不能够打印出数组的内容。

  4)a 在java语言中,不允许动态修改数组的大小。

  5)d 数组中可以包含任何一种数据类型,但必须每一个都是相同的数据类型。

  6)完成这个要求的程序是:


string weeks[ ] = {“monday”,”tuesday”,”wednesday”,
”thursday”,”friday”,”saturday”,”sunday”};



  7) lesson[1]的值为“math”;

  class[3]的值为“physical”;

  我们可以使用语句将math改为maths:


string lesson[1]=”maths”



  8) 本程序的输出是:


  图6-13 lianxi603的输入

  在你的机器,产生的输出可能与它不同,但是格式是类似的。这是因为,如何我们这样地调用,将打印出这个数组在内存中的地址。

扫描关注微信公众号