已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章面向对象编程基础,本章要点:对象及对象句柄类构造器、方法访问控制符静态关键字重载包注释及添加文档,5.1对象,5.1.1什么是对象有3个主要的特征:对象的行为(behavior)这个对象能做什么,也就是我们可以让这个对象完成什么样的功能。比如自行车可以载我们去想去的地方,节省体力。对象的状态(state)当通过一个操纵对象的方法时,对象所保持的一种包含特定属性的状态。比如我们可以通过扭转车头使自行车拐弯;刹车时,可以让自行车减速或停下来。对象的标识符(identity)可以通过标识符,区别具有相同行为或类似状态的对象。说到自行车,可以有很多种样子的,很多生产厂家的,都可以说是自行车,那如何能区分我使用的这一辆呢?可以根据颜色、生产厂家及自行车号牌等与其他的自行车区分。,5.1.2对象句柄变量名是内存地址(栈)的一个别名,对于基本类型来讲,它的值就是存放在这个内存地址的空间内,对于对象类型来讲,它的值是一个指向实际对象的一个地址(堆),而真正的对象是存放于堆中,我们就可以理解为:这就是一个对象的句柄。我们可以想像一下我们是如何用遥控器(对象句柄)操纵电视机(对象)的。只要你拥有这个遥控器,你就可以操纵电视机,一旦需要“换频道”或“增大声音”,你操纵的是遥控器(句柄),由遥控器去操纵电视机(对象),你也可以将这个遥控器交给其他的人(按址传递),别人也就有操纵这个对象的权力了,无论有多少个人来操纵遥控器,电视机始终是唯一的(对象只有一个)。,此外,即使没有电视机,你仍然可以拥有遥控器,也就是说,你可以只有句柄,没有实际性的对象(电视机)与句柄(遥控器)相关联。例如:Stringstr;这里只是拥有了一个对象句柄,句柄(str)并没有与任何对象内容相关联。这时,你去操纵句柄(str),并向它发送一条消息(操作),系统会提示你错误。所以我们建议读者在创建对象句柄时,一定不要忘记将句柄与实际的对象内容相关联(也就是对象变量的初始化)。,5.1.3对象变量的初始化当创建一个对象句柄时,总是希望马上进行相应的初始化工作,也就是将句柄与内容关联在一起。在Java中,这是一个非常简单的过程,它是通过new关键字来完成对象的创建过程的。可以理解为new就是新建的意思,它就是向内存堆中申请一个空间,将这个对象内容放到这里,然后将内容与对象句柄(存在于栈中)关联起来。是谁起到的作用呢?那就是等号(“=”),例如:Stringstr=newString(Hello);String是Java中用到最多的字符串对象,它生成一个具体的内容“Hello”,我们把这个过程称为对象的实例化,并将这个实例与句柄(str)通过等号关联在一起。,5.2类,5.2.1类的含义类在Java中用class关键字表示,在第3章中我们已经强调过,要想声明一个类,必须使用class关键字。类是对象的抽象,类是模板,类是一类事物经过抽象所共有属性的集合。比如说我们现在声明一个汽车类:publicclassCar接着进行一个类的实例化,也就是说创建一个类的实例:newCar();/这样就产生了一个类的实例,也就是一个具体的对象一个类的实例是针对一个具体的对象的,它是一些具体属性的集合。,5.2.2设计自己的类1.需求分析(1)对于一个学生类(Studentclass),作为整个系统的最核心的类,我们希望它能包括学生公有的基本信息:学生姓名、学号、性别、出生年月、专业和籍贯等。(2)作为学生类的实例,我们希望能通过设置或访问来修改这些学生的不同信息。,2.编写代码例5-1程序清单:StudentTest.java/*学生类,包括学生的基本信息*/publicclassStudentTestpublicstaticvoidmain(Stringargs)Studenttom=newStudent(Tom,20020410);tom.setStudentSex(man);tom.setStudentAddress(America);System.out.println(tom.toString();classStudentprivateStringstrName=;/学生姓名privateStringstrNumber=;/学号privateStringstrSex=;/性别privateStringstrBirthday=;/出生年月privateStringstrSpeciality=;/专业privateStringstrAddress=;/地址,publicStringtoString()Stringinformation=学生姓名=+strName+,学号=+strNumber;if(!strSex.equals()information+=,性别=+strSex;if(!strBirthday.equals()information+=,出生年月=+strBirthday;if(!strSpeciality.equals()information+=,专业=+strSpeciality;if(!strAddress.equals()information+=,籍贯=+strAddress;returninformation;,5.2.3分析你的类1.构造器通过关键字new来生成对象的实例,是通过构造器(constructor)来实现的。那究竟什么是构造器呢?简单的说,构造器是同类名相同的特殊方法。让我们研究一下学生类的构造器:publicStudent(Stringname,Stringnumber)strName=name;strNumber=number;当构造一个学生类的实例时,学生类的构造器就被启动,它给实例字段赋值。,2.方法提到方法(method)都是针对于某一个类的,也就是说方法都是类中的程序段。方法究竟是做什么用的呢?在探讨方法之前我们有必要先探讨一下另外一个概念封装。封装:所谓封装,就是把数据和行为结合在一个块中,对于对象的使用者隐藏了数据的实现过程,对象的使用者只能通过特定的方法访问类的实例字段。一个特定的对象是类的一个实例,一个对象实例中的数据叫做对象的实例字段,操作实例字段的函数和过程称为方法。这个实例保持属于它本身的特定的值,这些值被称为对象的当前状态,任何想改变对象当前状态的动作必须通过调用对象的方法。对于封装,我们重点强调的是,绝对不允许方法直接访问除它自己的实例字段以外的其他的实例字段。程序只能通过对象的方法来与对象的数据发生作用。封装的实际作用就是一个“黑盒子”的作用,对于使用者,只需要知道对象的输出数据与输入数据,而不再去关心、也没必要关心数据的内部具体实现流程。对于封装的详细解析我们在本书后面有专门的介绍。,方法的定义:学生类中的方法都很简单,可以通过方法访问类的私有实例字段,因为任何实例字段都可以被它们所在的类的方法访问。在一个类中,声明方法的格式如下:访问标识符返回值类型方法名(变量类型变量名称,)比如在刚才我们声明的学生类中,声明了11个方法,我们就以籍贯为例来分析一下方法的实质。publicStringgetStudentAddress()returnstrAddress;publicvoidsetStudentAddress(Stringaddress)strAddress=address;,设置器和访问器在JavaAPI文档中,我们经常可以发现类似于上面学生类中的很多以get或set开头的方法。get方法只是查看对象的状态,并没有改变对象的任何状态,例如:publicStringgetStudentName()returnstrName;publicStringgetStudentNumber()returnstrNumber;publicStringgetStudentSex()returnstrSex;publicStringgetStudentBirthday()returnstrBirthday;,3.使用多个源文件(1)通过统配符来调用编译器javacStudent*.java或javac*.java这时,与统配符相匹配的所有源文件都会被编译成类文件。(2)编译主文件也可以采用如下的方式编译主文件:javacStudentTest.java,4.访问控制符我们在前面几章中,经常看到在类、方法、实例字段前有public、private等,这就是访问控制符。所谓访问控制符,就是控制某个类、方法、实例字段被外界所能看到或访问到的范围。在Java中访问控制符主要有3个:public(“公开”)、private(“私有”)和protected(“受保护”)。在这里,我们重点探讨前两个,对于portected等到后面的章节再探讨。public:当使用关键字public时,就意味着在它后面的内容被声明为适用于所有人使用。在所有的访问控制符中,public的访问权限最大,那它究竟是如何被访问的,我们先不做探讨,只有把它同其他控制符进行比较,我们才能真正体会到它的意义。,private:关键字private是访问控制符中被访问范围最小的控制符,它是私有的。它意味着,除非是个特定的类,并且只有从这个类的方法里才能访问到的,否则没有人能访问这个成员。比如在我们的学生类中:privateStringstrName=;/学生姓名privateStringstrNumber=;/学号privateStringstrSex=;/性别privateStringstrBirthday=;/出生年月privateStringstrSpeciality=;/专业privateStringstrAddress=;/地址,例5-2程序清单:StudentTest1.java/*学生类,包括学生的基本信息*/publicclassStudentTest1publicstaticvoidmain(Stringargs)Student1tom=newStudent1(Tom,20020410);Student2jack=newStudent2(Jack,20030911);System.out.println(tom.toString();System.out.println(jack.toString();System.out.println(通过公开字段,修改实例字段值。);/tom.strName=唐僧;jack.strName=孙悟空;System.out.println(jack.toString();,classStudent1privateStringstrName=;/学生姓名privateStringstrNumber=;/学号publicStudent1(Stringname,Stringnumber)strName=name;strNumber=number;publicStringgetStudentName()returnstrName;publicStringgetStudentNumber()returnstrNumber;publicStringtoString()return学生姓名=+strName+,学号=+strNumber;,classStudent2publicStringstrName=;/学生姓名publicStringstrNumber=;/学号publicStudent2(Stringname,Stringnumber)strName=name;strNumber=number;publicStringgetStudentName()returnstrName;publicStringgetStudentNumber()returnstrNumber;publicStringtoString()return学生姓名=+strName+,学号=+strNumber;,方法的私有性在设计一个类时,我们会使所有的实例字段都是私有的,因为通过上面的程序示例,读者可以看出公开的数据是危险的。数据是这样的,那么对于方法呢?虽然在大多数的情况下,方法都是公开的,但私有的方法也是经常用到的。这些私有的方法只能被类中其他的方法调用。既然私有方法只能被类内的方法使用,为什么还要有私有方法呢?原因很简单,为了实现逻辑的分离。对于某些方法,我们有时需要进行复杂逻辑的分离,这种分离出来的逻辑只是对某个特定的方法有用,或者说对于类的使用者来说是没有意义的,在这种情况下,我们一般将方法声明为私有的。,5.静态字段与方法在我们所列举的示例中,可以看到main方法都被标记上static标识符。下面我就对static关键字进行深入探讨。静态字段如果在一个类中,把一个字段声明为static(静态的),那么在这个类中只能有这么一个类字段,而每个实例都共享同一个字段。我们用示例来说明这个问题,比如,每个学生都有唯一的一个学号字段,这个学号字段不再需要人工输入,而是由程序自动计算的。我们追加一个静态字段nextNumber:,例5-3程序清单:StudentTest2.java/*学生类,包括学生的基本信息*静态字段的测试*/publicclassStudentTest2publicstaticvoidmain(Stringargs)inti;for(i=0;i10;i+)Studenttom=newStudent(Tom+i);if(i%2=0)tom.setStudentSex(man);elsetom.setStudentSex(female);tom.setStudentAddress(America);tom.setStudentNumber();System.out.println(tom.toString();,publicStringtoString()Stringinformation=学生姓名=+strName+,学号=+number;if(!strSex.equals()information+=,性别=+strSex;if(!strBirthday.equals()information+=,出生年月=+strBirthday;if(!strSpeciality.equals()information+=,专业=+strSpeciality;if(!strAddress.equals()information+=,籍贯=+strAddress;returninformation;,静态常量类似于我们上面的定义的静态变量是不经常使用的。然而,静态常量却是很普遍的,例如我们经常使用的System.out。它在System类中被声明为:publicclassSystempublicstaticfinalPrintStreamout=;out静态字段被声明为公开的,如果去掉static这个关键字,out就是类的实例字段。我们在访问控制符中强调过,将类中实例字段公开是一个不好的主意,因为每个人都可以修改公开的类实例字段,但是使用公开常量(final字段)却没有问题。因为out被声明为final是不可被更改的。,静态方法main方法就是一个静态方法,一个方法想变成静态方法,只要在前面加上static就可以了。静态方法可以说是一类特殊的方法,它并不操纵具体的对象,它同静态字段是类似的,是属于类的方法。因为静态方法不操纵具体的对象,所以在一个静态方法中不能访问类的实例字段,但可以访问一个自己类中的静态字段。例5-4程序清单:StaticMethod.java/*静态方法访问实例字段及静态字段*/publicclassStaticMethodinta=15;intb=2;publicstaticvoidmain(Stringargs)System.out.println(a+/+b+=+(a/b);,静态方法的使用对于方法的使用,在前面已经有所讲述。对于静态方法的调用则是一种特殊的情况,它的使用是通过类名直接调用方法名。格式如下:类名.方法名(参数列);在下面我们将会学习Java中两个重要的类:Math类与Date类,会多次用到静态方法的调用。请读者深入体会。,工厂方法这节我们接触Java中一个非常重要的概念工厂方法。对于工厂我们通常的理解就是生产产品的地方,这是非常正确的。对于Java程序设计来说,首先工厂方法就是生产对象的地方,也就是生产类的实例的地方。其次,它还是一个方法,这个方法的目的就是生产对象。到目前为止,读者只要记住工厂方法是创造对象的地方,通过工厂方法的调用可以得到一个类的实例。在以后的章节中我们会更加详细的探讨工厂方法。,main方法我们曾经多次接触到main方法,main方法是一个静态方法。通过前面的描述读者已经了解到静态方法不需要对象去调用。实际上,当程序开始执行时,还不存在任何对象。静态方法main执行后,开始创建所需要的对象。例如:我们在学生类中追加一个main方法。classStudentpublicstaticvoidmain(Stringargs)StudentaStudent=newStudent(沙和尚);aStudent.setAddress(通天河);,例5-5程序清单:StudentTest3.java/*学生类,包括学生的基本信息*/publicclassStudentTest3publicstaticvoidmain(Stringargs)Studenttom=newStudent(Tom,20020410);tom.setStudentSex(man);tom.setStudentAddress(America);System.out.println(tom.toString();classStudentprivateStringstrName=;/学生姓名privateStringstrNumber=;/学号privateStringstrSex=;/性别privateStringstrBirthday=;/出生年月privateStringstrSpeciality=;/专业privateStringstrAddress=;/地址,publicStringtoString()Stringinformation=学生姓名=+strName+,学号=+strNumber;if(!strSex.equals()information+=,性别=+strSex;if(!strBirthday.equals()information+=,出生年月=+strBirthday;if(!strSpeciality.equals()information+=,专业=+strSpeciality;if(!strAddress.equals()information+=,籍贯=+strAddress;returninformation;,6.final实例字段可以把一个实例字段定义为final(不可改变的)。对于final字段,在对象被构造时,这种字段必须被初始化。也就是说,必须保证在每一个构造器结束之前,该类型字段已经被设定。一旦被设定值,以后将不能再改变。例如Student类中的strName字段可以被声明为final。因为对象被构造之后,它的值将永远保持不变,并且在类中,并没有setStudentName之类的方法。classStudentprivatefinalStringstrName;,5.3使用已有的类,5.3.1Math类Math类包含了不同分类的数学函数,它不同于一般的类,我们可以使用Math类的方法,而不需要知道它的内部实现。Math类只是封装了各种功能,不需要隐藏数据,所以在Math类全是静态方法及静态字段。1.查阅API在Java中有成百上千个类,每个类中又有很多不同的方法,要记住所有的类和方法是不可能的。因此,熟练掌握如何查阅API是相当重要的。API文档是JavaSDK的一部分,它是以HTML形式发布的。关于API文档的下载及安装在第2章已经有详细的介绍,并且已经在桌面建立了一个指向aip/index.html的快捷方式。,2.Math类应用通过查阅Math类的API文档,读者可以看到Math类的所有方面及字段都是静态的。这就是说,我们可以通过Math.方法名或常量名直接使用Math类的方法及常量。Math类包括两个静态常量:Math.PIMath.E它们分别表示了数学常数和e的最可能接近的近似值。,例5-6程序清单:MathTest.java/*Math类数学函数的运用,由于Math类中的方法全部是静态的,所以可以直接利用类名调用*/publicclassMathTestpublicstaticvoidmain(Stringargs)doublex=4.51;System.out.println(Math.sqrt(x);System.out.println(Math.round(x);,3.大数字在Math类中,我们主要应用的是基本整型和浮点型,它们对数据的长度都有一定的限制,在进行某些特殊的问题数字计算时,精度是不能满足要求的。这时可以利用Java提供的专门用于处理大数字的BigInteger和BigDecimal类。这两个类位于java.math包中,用于操作具有任意长度的数字,即大数字(BigNumber)。BigInteger类实现了任意精度的整数运算,而BigDecimal实现了任意精度的浮点数运算。可以使用大数字类的静态方法valueOf将一个普通的数字转换成一个大数字:BigIntegera=BigInteger.valueOf(1000)/将普通数字转换成大数字操作普通数字我们可以用熟悉的数学运算符比如+和*,但不能用这些数学运算符来操作大数字。操作大数字必须利用大数字类中的方法add和multiply来实现大数字的操作。例如:BigIntegera=BigInteger.valueOf(100);BigIntegerb=BigInteger.valueOf(1000);BigIntegerc=a.add(b);/c=a+b;BigIntegerd=a.multiply(b);/d=a*b,例5-7程序清单:BigIntegerTest.java/*用户输入两个数字,程序将通知你中奖的机率有多大*/importjavax.swing.*;importjava.math.*;publicclassBigIntegerTestpublicstaticvoidmain(Stringargs)/JOptionPane.showInputDialog(String)它会在屏幕上输出一个简单的图形框,/这个类为在外面的章节中详细介绍Stringinput=JOptionPane.showInputDialog(请输入彩球总数:);intn=Integer.parseInt(input);/将字符串转化为整数input=JOptionPane.showInputDialog(请输入投注总数:);intm=Integer.parseInt(input);/*中奖计算公式(n*(n-1)*(n-2)*(n-m+1)/(1*2*m)*/BigIntegeroption=BigInteger.valueOf(1);for(inti=0;im;i+)option=option.multiply(BigInteger.valueOf(n-i).divide(BigInteger.valueOf(i+1);System.out.println(你的中奖机率为每+option+次中一次!);System.out.println(祝你好运!);System.exit(0);,5.3.2Date类接下来,我们学习另一个非常重要的类Date类。Date类是关于日期操作的一些方法。从这个类中,我们学习对象及对象变量的构造。要使用对象,必须要构造对象,并指定它们的初始状态,然后将方法应用于对象。在Java中,构造一个类的对象是通过类的构造器来实现的。对于构造器,我们在本章的前面已经有所讲述,并初步了解了构造器的一些特殊规定。下面我们结合Date类再来强调一下。构造器的作用:(1)构造对象(2)初始化对象构造一个对象时,是通过在构造器的前面加上new来实现的。由于构造器的名字与类名相同,所以Date类的构造器肯定叫做Date。构造一个Date对象时,可以采用如下代码:newDate();这个表达式构造了一个日期对象,并把这个对象初始化为当前的日期与时间。,对象变量的初始化对象变量作为变量的一种,在程序使用的过程中也需要被初始化。在第4章中我们讲述了基本类型变量的初始化。那么作为对象变量是不是也会像基本类型一样:作为全局变量系统会自动初始化呢?下面请读者先编译、运行InitObject.java。例5-8程序清单:InitObject.java/*对象变量的初始化*/importjava.util.Date;publicclassInitObjectprivateDatetoday;/构建一个对象变量publicstaticvoidmain(Stringargs)newInitObject().print();publicvoidprint()System.out.println(today.toString();,5.3.3GregorianCalendar类GregorianCalendar类实际上是对Calendar类的扩展,Calendar类是从总体上描述历法的类。理论上说,只要扩展了Calendar类就可以用来实现中国人的阴历等,但在标准库中只是实现了阳历。Date类中也有少量的用于得到日期的算法,如getDay、getMonth等方法,但这些方法已经不被推荐使用了(deprecated)。在我们的程序中,尽量或者完全不要再用deprecated的方法。GregorianCalendar类中的方法比Date类多得多,尤其是对于日期操作的相关方法。,1.构造不同的日期对象查阅GregorianCalendar类的API文档,可以发现这个类有7个不同的构造器,分别用于构造不同目的的日期对象。无参数构造器无参数构造器也被称为默认构造器。newGregorianCalendar();构造一个新的对象,这个对象表示了该对象被构造的日期和时间。也可以通过如下的方式构造一个特定年、月、日的对象:newGregorianCalendar(2003,11,24);请注意,在这里的11指的是12月,也就是GregorianCalendar类的月份是从0开始计算的。如果读者对此容易引起混淆,也可以采用Calendar类的一些日期常量。,2.设置器与访问器通过查阅GregorianCalendar类的API文档,我们可以看到,包括从Calendar类继承来的一些方法与常量,大部分都是以get或set开头的方法,这种类的方法在前面已经有所讲述,也就是我们所说的设置器与访问器。,例5-9程序清单:CalendarTest.java/*GregorianCalendar类的设置器与访问器*/importjava.util.*;publicclassCalendarTestpublicstaticvoidmain(Stringargs)newCalendarTest().print();publicvoidprint()Calendarcalendar=newGregorianCalendar();DatetrialTime=newDate();calendar.setTime(trialTime);/printoutabunchofinterestingthingsSystem.out.println(YEAR:+calendar.get(Calendar.YEAR);System.out.println(MONTH:+calendar.get(Calendar.MONTH);System.out.println(WEEK_OF_YEAR:+calendar.get(Calendar.WEEK_OF_YEAR);,System.out.println(WEEK_OF_MONTH:+calendar.get(Calendar.WEEK_OF_MONTH);System.out.println(DATE:+calendar.get(Calendar.DATE);System.out.println(DAY_OF_MONTH:+calendar.get(Calendar.DAY_OF_MONTH);System.out.println(DAY_OF_YEAR:+calendar.get(Calendar.DAY_OF_YEAR);System.out.println(DAY_OF_WEEK:+calendar.get(Calendar.DAY_OF_WEEK);System.out.println(DAY_OF_WEEK_IN_MONTH:+calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);System.out.println(AM_PM:+calendar.get(Calendar.AM_PM);System.out.println(HOUR:+calendar.get(Calendar.HOUR);System.out.println(HOUR_OF_DAY:+calendar.get(Calendar.HOUR_OF_DAY);System.out.println(MINUTE:+calendar.get(Calendar.MINUTE);System.out.println(SECOND:+calendar.get(Calendar.SECOND);System.out.println(MILLISECOND:+calendar.get(Calendar.MILLISECOND);System.out.println(CurrentTime,withhourresetto3);calendar.clear(Calendar.HOUR_OF_DAY);/sodoesntoverridecalendar.set(Calendar.HOUR,3);,System.out.println(YEAR:+calendar.get(Calendar.YEAR);System.out.println(MONTH:+calendar.get(Calendar.MONTH);System.out.println(WEEK_OF_YEAR:+calendar.get(Calendar.WEEK_OF_YEAR);System.out.println(WEEK_OF_MONTH:+calendar.get(Calendar.WEEK_OF_MONTH);System.out.println(DATE:+calendar.get(Calendar.DATE);System.out.println(DAY_OF_MONTH:+calendar.get(Calendar.DAY_OF_MONTH);System.out.println(DAY_OF_YEAR:+calendar.get(Calendar.DAY_OF_YEAR);System.out.println(DAY_OF_WEEK:+calendar.get(Calendar.DAY_OF_WEEK);System.out.println(DAY_OF_WEEK_IN_MONTH:+calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);System.out.println(AM_PM:+calendar.get(Calendar.AM_PM);System.out.println(HOUR:+calendar.get(Calendar.HOUR);System.out.println(HOUR_OF_DAY:+calendar.get(Calendar.HOUR_OF_DAY);System.out.println(MINUTE:+calendar.get(Calendar.MINUTE);System.out.println(SECOND:+calendar.get(Calendar.SECOND);System.out.println(MILLISECOND:+calendar.get(Calendar.MILLISECOND);,3.格式化日期输出在我们实际进行日历使用的时机与场合,经常对日期的输出有一些特殊的要求,也就是说,日历必须符合某种特定的格式。如考试的时间是倒计时的;在某些场合要求是按照“YYYYMMDD”格式输出;在某些场合是要求“YY-MM-DD”格式输出,那么如何使日历按照我们需要的格式进行输出呢?现在我们编写一个程序,当用户输入任何一个有效的年份后,系统会自动计算出该年一共有多少天,每个月有多少天,并按照指定的格式进行输出。,例5-10程序清单:FormateDateOutput.java/*日历按照格式输出*/importjava.util.Calendar;importjavax.swing.JOptionPane;importjava.text.SimpleDateFormat;publicclassFormateDateOutputprivateintyear;publicstaticvoidmain(Stringargs)Stringinput=JOptionPane.showInputDialog(请输入有效的年份(YYYY):);intyear1=Integer.parseInt(input);/将字符串转化为整数FormateDateOutputout=newFormateDateOutput();out.setYear(year1);if(year1!=0,System.exit(0);publicvoidFormateDateStr()SimpleDateFormatformatter=(SimpleDateFormat)SimpleDateFormat.getDateInstance();formatter.applyPattern(yyyy-MM-dd);Calendarcal=Calendar.getInstance();for(inti=0;i12;i+)cal.set(year,i,1);inttemp=cal.getActualMaximum(Calendar.DAY_OF_MONTH);for(intj=1;j=temp;j+)cal.set(year,i,j);Stringstr=formatter.format(cal.getTime();System.out.println(当前的时间是:+str);publicvoidsetYear(intyear)this.year=year;,5.3.4对象重构1.重载在我们前面学习Date类及GregorianCalendar类中,可以分别通过不同的构造器,构建不同的对象。例如:newDate();/构建一个当前时间点的对象newDate(2000000000);/构造一个2000000000毫秒的日期对象我们也可以通过newGregorianCalendar();/构建一个默认地区、默认时区的日历对象newGregorianCalendar(2003,4,23);/构造一个2003年5月23日的日历对象构造不同的对象。这种特征在Java中叫做重载(overloading)。重载在Java中是一个非常重要的特性,所谓重载就是当多个方法具有相同的名字,含有不同的参数时的这种特性就叫重载。,下面仍然以我们设计的学生类,来实现重载。pubicclassStudentpublicStudent()publicStudent(Stringname)strName=name;publicStudent(Stringname,Stringnumber)strName=name;strNumber=number;,在Java中,要完整的描述一个方法,需要指定方法的名字以及它的参数类型。这些内容就称作方法的型构。例如Math类中的4个max方法,它们的声明是这样的:max(inta,intb)max(longa,longb)max(doublea,doubleb)max(floata,floatb)这4种方法有以下4种型构:max(int,int)max(long,long)max(double,double)max(float,float)方法的返回值不属于型构的一部分。所以当我们实现重载时,不必担心系统会调用不正确的方法,Java编译器会自动找到型构匹配的方法。,2.默认构造器在我们重载的学生类构造器中,有一个特殊的构造器,那就是没有参数的构造器,我们习惯上称这种构造器为默认构造器(也称为无参数构造器)。如:学生类的默认构造器是:publicStudent()Date类的默认构造器是:publicDate()this(System.currentTimeMillis();而GregorianCalendar的默认构造器是:publicGregorianCalendar()this(TimeZone.getDefault(),Locale.getDefault();,对于默认构造器有以下几点,请读者一定要注意。(1)一个类如果没有构造器,系统会自动提供一个空的默认构造器,以构建类的对象。如:我们设计一个花园类。例5-11程序清单:Garden.java/*测试类的默认构造器*/publicclassGardenpublicFlowergetFlower(StringstrFlowerName)if(strFlowerName.equals(rose)returnnewRose();elseif(strFlowerName.equals(peony)returnnewPeony();returnnull;,(2)一个类,如果已经有了构造器,系统不能提供空的默认构造器。例如:我们设计的学生类。pubicclassStudentpublicStudent(Stringname)strName=name;publicStudent(Stringname,Stringnumber)strName=name;strNumber=number;,3.字段初始化对于字段的初始化,如果程序编写人员没有显式地进行字段的初始化,则系统会自动初始化字段默认值。基本类型有自己的默认值,对象类型为null。采用系统默认初始化,对于程序员来说是个非常不好的习惯,因为字段以不可见的形式初始化会使程序变得很难懂。显式地在构造器或字段声明中初始化字段值,以确保字段都被赋于有意义的值是一种很好的习惯。,4.参数的命名5.类内调用构造器,5.4包,5.4.1命名空间提到包,我们不得不先接触一个新的概念“命名空间”。故名思义:空间就是一块容积,里面可以容纳内容。命名空间也就是说为了容纳名字(Java类名)而设定的一个空间,所有的名字都是在这个空间之内。,5.4.2包的概念及作用Java中为了便于管理各种的类,将多个功能类似的类放到了一组,这个组就称为包(package)。包就像是硬盘上嵌套的不同目录结构一样,在Java中采用包的目的是为了管理不同的类,区分不同的任务,以及使自己编写的代码与别人提供的类库能更好地区分开。例如,在Java中有java.lang、java.util及等,所有的Java公开类都是在java或javax包内。在Java中使用包的主要原因是保证类名的唯一性。类的设计者在某些时候完全不知道别的设计者的类名,如果产生相同的类名,则会产生冲突,如果使用包的机制,则可以避免这方面的问题。为了保证包的唯一性,Sun公司提倡使用自己公司的倒写的Internet域名(这是独一无二的),然后对不同的项目使用子包。例如是被注册的一个域名,以相反的顺序写,则变成包com.coffeelab,如果在这个包下再添加子包,则可以变成com.coffeelab.javadesign。这样就保证了类名的唯一性。,5.4.3包的实现在Java中要想使用包,必须声明一个包,用关键字package实现。例如:packagecom.chapter06;声明一个包时,声明语句必须放在类所有语句的最前面(注释除外)。如将我们设计的学生类加入包com.chapter06中:/*包的使用说明*/packagecom.chapter06;publicclassStudent,5.4.4使用包在编写程序的过程中,我们不可避免的要用到其他包的类。在前面的例子中,我们已经多次使用到。如何在自己的类中使用其他包中的public类呢?现在我们试着编译下面的一个简单的小程序。例5-13程序清单:ImportTest.java/*包名的引用*/publicclassImportTestpublicstaticvoidmain(Stringargs)System.out.println(newDate();,5.4.5类路径与默认包我们查阅API文档时,可以看到String、Math类等一些类,是位于包java.lang中,为什么我们在使用这些类时不需要使用import语句来导入类呢?Java虚拟机在运行时,会自动装载java.lang包,也就是说java.lang包对于任何类的使用来讲都是可见的,是不需要进行导入的,程序编写都可以像使用本包类一样可以在任何需要的时候使用这些类,我们称该包为Java虚拟机默认包。除java.lang包以外的其他的包,在使用的时候必须手工导入这些类。在第2章介绍配置类路径时,我们加入了很多类似于rt.jar的jar文件,这些jar文件就是为Java编译器在编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年广东省河源市辅警考试公安基础知识考试真题库及参考答案
- 福建省农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(典型题)
- 2026年衡水市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(培优)
- 2025年高血压病人的护理试题及答案
- 达州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(真题汇编)
- 南京市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解ab卷
- 张掖市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及一套完整答案详解
- 2025年建筑施工特种作业人员考试(建筑架子工普通脚手架专业知识)模拟试题及答案
- 2026年河源市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(各地真题)
- 2025年云南省特种作人员取证培训以及特种设备作业人员取证培训考试磺化工艺作业复习题及答案
- VTE相关知识培训课件
- 2025年公开遴选公务员笔试复习策略与计划制定
- 湖南省永州市2025年-2026年小学六年级数学期末考试(上学期)试卷及答案
- 第十三讲蛋白质分子设计
- 扭力扳手知识培训课件
- 英语竞赛备赛训练计划制定
- 2025年职业技能鉴定考试(动物检疫检验员)历年参考题库含答案详解(5卷)
- 河南省焦作市县级重点中学2021-2022学年高二上学期期中考试历史试卷
- 四手操作理论试题及答案
- 统编版(2024)八年级上册历史全册教材问题参考答案
- 注册安全工程师-建筑安全高频考点
评论
0/150
提交评论