1、第四章 对象基础和简单数据对象,华中科技大学IBM技术中心,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,主要内容,数组,数字,字符和字符串,对象的生存周期,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,对象的生命周期,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,CreateObjectDeom,public class CreateObjectDemo public static void main(String args) /创建一个Point对
2、象和两个Rectangle对象 Point origin_one = new Point(23, 94); Rectangle rect_one = new Rectangle(origin_one, 100, 200); Rectangle rect_two = new Rectangle(50, 100); / 显示rect_one的宽、高以及面积 System.out.println(Width of rect_one: + rect_one.width); System.out.println(Height of rect_one: + rect_one.height); System
3、.out.println(Area of rect_one: + rect_one.area(); rect_two.origin = origin_one; /设置rect_two的位置 / 显示rect_two的位置 System.out.println(X Position of rect_two: + rect_two.origin.x); System.out.println(Y Position of rect_two: + rect_two.origin.y); / 移动rect_two并且显示它的新位置 rect_two.move(40, 72); System.out.pri
4、ntln(X Position of rect_two: + rect_two.origin.x); System.out.println(Y Position of rect_two: + rect_two.origin.y); ,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,对象的创建,类型名 引用变量 = new 构造器(构造器的参数),华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,声明一个变量来引用对象,为了声明一个变量来引用对象,你可以使用类或者接口的名字作为变量的类型声明并没有创建新对象
5、。在对该引用变量赋值前,该引用为空,称为空引用(null),类型名 引用变量 = new 构造器(构造器的参数),Point origin_one,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,实例化对象,new操作符通过为新对象分配内存来实例化一个类new操作符需要一个后缀参数,即构造器的一个调用new操作符返回一个对它所创建对象的引用,通常该引用被赋值给具有适当类型的引用变量如果new操作符返回的引用没有被赋给任何变量,那么当new操作符所在的语句执行完后,将无法访问该对象,华中科技大学IBM技术中心,HUST & IBM Computer
6、Tech. Center,初始化对象,构造器(Constructor):是一个用来创建对象的特殊方法,用来初始化对象的属性。构造器的名字与类名相同构造器没有返回值构造器所包含的语句用来对所创建的对象进行初始化没有参数的构造器称为“无参构造器”每个Java类都至少有一个构造器,如果该类没有显式地声明任何构造器,系统会默认地为该类提供一个不包含任何语句的无参构造器,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,对象创建的实例,public class Point public int x = 0; public int y = 0; public P
7、oint(int x, int y) this.x = x; this.y = y; ,Point origin_one = new Point(23, 94);,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,问 题,Point origin_one = new Point(23, 94); Point origin_two = new Point(23, 94);,Point origin_one = new Point(23, 94); Point origin_two =origin_two;,华中科技大学IBM技术中心,HUST & IB
8、M Computer Tech. Center,构造器的重载(Overload),public class Rectangle public int width = 0; public int height = 0; public Point origin; public Rectangle() origin = new Point(0, 0); public Rectangle(Point p) origin = p; public Rectangle(int w, int h) this(new Point(0, 0), w, h); public Rectangle(Point p, i
9、nt w, int h) origin = p; width = w; height = h; . ,一个类可以包含多个构造器,这种情况成为构造器的重载同一个类中的多个构造器通过参数的数目及类型的不同来区分,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,对象的使用,对象的使用有两种方式操作或者检查它的变量调用它的方法要使用对象的实例成员,首先需要得到该对象的引用,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,实例成员与类成员,实例成员包括实例变量与实例方法实例成员依赖于实例存在同一个类的不同实例都拥
10、有一份实例变量的拷贝,对某个实例的实例变量的操作不影响到其它实例实例变量遵循对象的生命周期,随着对象的创建而创建,随着对象的消亡而消亡必须通过实例的引用来调用实例方法类成员包括类变量与类方法类成员不依赖于实例存在同一个类的不同实例共享同一个类变量,对类变量的改变会影响到所有实例类变量的生存期不依赖于对象,其它类可以不用通过创建该类的实例,直接通过类名访问它们。同样,类方法也可以直接通过类名访问。,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,实例成员与类成员,class ABCD char data; static int share_data;
11、class Demo ABCD a,b,c,d; /实例化,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,实例变量的引用,简单名称 当实例变量处在作用域内(即对象的类的代码内) 的时候 限定名称 objectReference.variableName 当实例变量处在作用域外时使用限定名称,System.out.println(Width of rect_one: + rect_one.width);System.out.println(Height of rect_one: + rect_one.height);int height=new R
12、ectangle().height;,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,关于变量访问的说明,建议不要通过其它对象或类直接操作对象的变量,可能引起无效值理想情况下,类会提供一些方法,其他对象可以通过他们检查或修改变量,确保值有效,而且如果变量的类型和名称发生了变化,不会影响它的使用者在某些情况下,可以允许对对象变量的直接访问,以使类更小更简单,也可使变量适用于更广泛范围;JAVA编程语言提供了一个访问控制机制,通过这种机制,类可以决定那些其它的类可以直接访问它的变量(第五章中介绍)。,华中科技大学IBM技术中心,HUST & IBM C
13、omputer Tech. Center,调用对象的方法,使用限定名称来调用对象的方法 objectReference.methodName(argumentList);或者objectReference.methodName();,System.out.println(Area of rect_one: + rect_one.area();rect_two.move(40, 72);int areaOfRectangle = new Rectangle(100, 50).area();,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,关于方法调用
14、,方法被声明为public,就可以被任何其它的类所访问。有时,类需要限制对它的方法的访问类可以使用与控制变量访问相同的机制来对它的方法进行访问控制(第五章中介绍),华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,对象的清除,JAVA运行时环境在当对象不再被使用的时候清除它们,这个过程就是所谓的“垃圾收集”(garbage collection)Java的垃圾收集器自动扫描对象的动态内存区,对被引用的对象加标记,然后把没有引用的对象作为垃圾收集起来并释放。垃圾收集器作为一个线程运行。当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时
15、,垃圾收集线程与系统同步运行。否则垃圾收集器在系统空闲时异步地执行。,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,无用对象的判定,当某个对象不在被任何引用变量引用时,该对象是无用对象,将被清除。一般有如下两种情况:,引用变量超出了作用域 StringBuffer s = newStringBuffer(“thisisatest”); / 超出对象作用域,引用变量引用了其它对象或引用了空对象StringBuffer s = new StringBuffer(“test1”); s = new StringBuffer(“test2”); / 引用
16、了新的对象 s = null; / 引用为空,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,finalize()方法,在对对象进行垃圾收集前,Java运行时系统会自动调用对象的finalize()方法来释放系统资源。某些情况下,程序员可能需要实现该方法来释放不由垃圾收集器所控制的资源。但这种情况非常少见finalize()方法是在Object中有缺省实现,在用户自定义的类中,它可以被覆盖,但一般在最后要调用父类的finalize()方法来清除对象所使用的所有资源,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Ce
17、nter,问题一,下列程序的运行结果?,public class SomethingIsWrong public static void main(String args) Rectangle myRect; myRect.width = 40; myRect.height = 50; System.out.println(myRects area is + myRect.area(); ,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,问题二,现有一个Point和Rectangle对象,代码执行后有多少引用指向它们?有没有对象需要垃圾收集?,Po
18、int point = new Point(2,4);Rectangle rectangle = new Rectangle(point, 20, 20);point = null;,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符和字符串,Java API提供了三个处理字符数据的类:Character:这个类的实例可以容纳单一的字符数值。该类还定义了一些简洁的方法来操作或者检查单一字符数据。 String:这个类用于处理由多个字符组成的不可变数据。 StringBuffer:这个类用于存储和操作由多个字符组成的可变数据。,华中科技大学IBM技
19、术中心,HUST & IBM Computer Tech. Center,字符类(Character),字符类的对象包含单个字符值当需要使用对象时,可以用字符对象替代原始的char类型的变量,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符类构造器和方法,Character(char)Character类唯一的构造器,它创建一个字符对象,其中包含由参数提供的值,一旦创建了Character对象,它包含的值就不能改变。compareTo(Character)这个实例方法比较两个字符对象包含的值,这个方法返回一个整数值,表示当前对象中的值是大于、等
20、于还是小于参数所包含的值,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符类构造器和方法,equals(Object)这个实例方法比较当前对象包含的值与参数对象包含的值,如果两个对象包含的值相等,那么这个方法返回truetoString()这个实例方法将此对象转换为字符串charValue()这个实例方法以原始char值的形式返回此字符对象包含的值isUpperCase()这个实例方法判断一个原始char值是否是大写字母,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符类例程,public cl
21、ass CharacterDemo public static void main(String args) Character a = new Character(a); Character a2 = new Character(a); Character b = new Character(b); int difference = pareTo(b); if (difference = 0) System.out.println(a is equal to b.); else if (difference 0) System.out.println(a is greater than b.
22、); System.out.println(a is + (a.equals(a2) ? equal : not equal)+ to a2.); System.out.println(The character + a.toString() + is + (Character.isUpperCase(a.charValue() ? upper : lower)+ case.); ,程序的输出:a is less than b.a is equal to a2.The character a is lowercase.,华中科技大学IBM技术中心,HUST & IBM Computer Tec
23、h. Center,字符类类方法,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,问题,Character a = new Character(a);Character b = new Character(a);,下列boolean表达式的值是true还是false?(1)pareTo(b)=0(2)a.equals(b)(3)a=b,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符串和字符串缓冲区,Java平台提供两个类String和StringBuffer,它们用于存储和操作字符串由多个字符组成
24、的字符数据。String类用于其值不能改变的字符串;StringBuffer类用于被修改的字符串,通常用来动态的构造字符数据。字符串是常量,比字符串缓冲区更高效,而且字符串可以被共享。,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符串(String),使用字符串常量时,需要创建String对象,和其它对象不同,String对象可以通过简单赋值语句创建:String name = “Petter”;此外,也可根据String类的构造函数创建String对象:String name = new String(“Petter”);对于程序任何位置出
25、现的双引号标记的字符串,系统都会自动创建一个String对象。可通过String对象的方法对字符串进行操作,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符串构造器,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符串的不可变性?,String类用于其值不能改变的字符串观察下列程序:,public class StringTest public static void main(String args) String s=abc; s=s+“defg; System.out.println(s);
26、 ,程序运行结果是abc还是abcdefg?,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符串的不可变性?,s=s+”defg”,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,字符串缓冲区(StringBuffer),String对象表示的是不可更改的字符串对象,如果需要修改String对象所表示的内容,必须重新创建一个对象:String str = “Petter”;str = str + “ 当修改操作频繁,或字符串的值很大时,会额外分配大量内存因此,Java语言引入了一个StringBuf
27、fer类,用来表示内容可以扩充和修改字符串对象,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,StringBuffer构造器,必须使用new操作符创建字符串缓冲区,String s = Dot saw I was Tod;StringBuffer dest = new StringBuffer(s);,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,访问器方法,用于获取关于对象的信息的方法被称为访问器方法。字符串和字符串缓冲区都可以使用的一个访问器方法就是length方法。length方法返回字符串和
28、字符串缓冲区中包含的字符数。,String palindrome = Dot saw I was Tod; int len = palindrome.length();,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,容量,在StringBuffer类中还有一个capacity()方法,它返回分配给这个字符串缓冲区的容量,而不是使用量。使用量会改变,但是容量始终是不变的。,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,通过索引得到字符,charAt()访问器方法,通过索引从字符串或者字符串缓冲区得到字
29、符,索引值从零开始。,String anotherPalindrome = Niagara. O roar again!; char aChar = anotherPalindrome.charAt(9);,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,substring方法,如果要从字符串或者字符串缓冲区得到多个字符,可以使用substring方法。String substring(int) String substring(int,int),String anotherPalindrome = Niagara. O roar again!;
30、String roar = anotherPalindrome.substring(11, 15);,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,search,string类提供两个访问器方法,返回特定的字符或者子字符串在字符串中的位置。indexOf()方法从字符串的开头查找;lastindexOf()方法从字符串的末尾查找;stringBuffer类不支持indexOf()和lastindexOf()方法。,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,search,华中科技大学IBM技术中心
31、,HUST & IBM Computer Tech. Center,search example,public class Filename private String fullPath; private char pathSeparator, extensionSeparator; public Filename(String str, char sep, char ext) fullPath = str; pathSeparator = sep; extensionSeparator = ext; public String extension() int dot = fullPath.
32、lastIndexOf(extensionSeparator); return fullPath.substring(dot + 1); public String filename() int dot = fullPath.lastIndexOf(extensionSeparator); int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(sep + 1, dot); public String path() int sep = fullPath.lastIndexOf(pathSeparator)
33、; return fullPath.substring(0, sep); ,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,search example,public class FilenameDemo public static void main(String args) Filename myHomePage = new Filename(/home/mem/index.html,/, .); System.out.println(Extension = + myHomePage.extension(); System.out.printl
34、n(Filename = + myHomePage.filename(); System.out.println(Path = + myHomePage.path(); ,程序输出:Extension = htmlFilename = indexPath = /home/mem,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,比较字符串和字符串缓冲区,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,操作字符串,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,
35、修改字符串缓冲区,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,数字类,Number类及其子类主要用于处理数字Number类的对象包含了原始类型的数值并且提供了一些有用的变量和方法,用于对数值进行处理,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,类型包装器类(Type-Wrapper class),数字类、Boolean、Character和void类统称为类型包装器类在需要对象的地方,可将原始类型的值存储在类型包装器对象中这些类定义了一些有用的变量,提供关于数据类型的一般信息这些类还定义了一些有
36、用的方法,用于将值转换为其他类型、转换为字符串等等这些类用于反射,反射这种java机制允许程序收集关于JVM中任何对象或类的信息此外,BigInteger和BigDecimal还扩展了原始数据类型,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,例程,public class NumberDemo public static void main(String args) Float floatOne = new Float(14.78f - 13.78f); Float floatTwo = Float.valueOf(1.0); Double d
37、oubleOne = new Double(1.0); int difference = floatOpareTo(floatTwo); if (difference = 0) System.out.println(floatOne is equal to floatTwo.); else if (difference 0) System.out.println(floatOne is greater than floatTwo.); System.out.println(floatOne is “ +(floatOne.equals(doubleOne) ? equal : not equa
38、l) + to doubleOne.); ,floatOne is equal to oneAgain. floatOne is not equal to doubleOne.,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,数字的转换、格式化、高级算术功能,自学!,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,数组,数组是一个固定长度的结构,它存储多个相同类型的值数组直接被JAVA语言所支持,所以没有一个数组类数组的长度在数组创建的时候就已经确定。 数组元素就是数组中的一个数值,可以通过数组中的位置
39、来访问它。,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,创建数组,声明一个引用变量来引用一个数组格式:type 引用变量名 type 引用变量名 (允许但不推荐)数组变量的声明并不创建数组创建一个数组使用new操作符显示地创建数组格式:new elementTypearraySize数组初始化器可以使用简写的语法创建并初始化数组:type 引用变量名 = 数组元素值;,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,使用数组,访问数组元素引用变量名(数组名)index得到数组大小引用变量名(数组名)
40、.length,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,例程,public class ArrayDemo public static void main(String args) int anArray; anArray = new int10; for (int i = 0; i anArray.length; i+) anArrayi = i; System.out.print(anArrayi + ); System.out.println(); ,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Ce
41、nter,对象数组,数组元素可以是基本类型也可以是引用类型当数组元素是引用类型时(也即数组元素为对象时需要注意:数组元素也必须要被创建和初始化,Integer anArray = new Integer5; for (int i = 0; i anArray.length; i+) System.out.println(anArrayi); ,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,数组的数组,数组的数组可以看作是“数组引用”的数组与对象数组一样,必须显示地在数组中创建子数组子数组的长度并不相同例:int aMatrix = new int
42、4 ; aMatrix1 = new int5; aMatrix2 = new int10;,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,复制数组,public static void arraycopy(Object source, int srcIndex, Object dest, int destIndex, int length),华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,例程,public class ArrayCopyDemo public static void main(St
43、ring args) char copyFrom = d, e, c, a, f, f, e, i, n, a, t, e, d ; char copyTo = new char7; System.arraycopy(copyFrom, 2, copyTo, 0, 7); System.out.println(new String(copyTo); ,华中科技大学IBM技术中心,HUST & IBM Computer Tech. Center,问题,public class WhatHappens public static void main(String args) StringBuffer stringBuffers = new StringBuffer10; for (int i = 0; i stringBuffers.length; i +) stringBuffersi.append(StringBuffer at index + i); ,欢迎提问,Question !,