1、第3章 面向对象的编程(I基本语法),应该重点掌握以下内容:面向对象程序设计的基本概念类和对象的定义和使用类中方法的定义和使用构造函数的定义和使用访问控制,目 录,3.1 面向对象程序设计概述 3.2 类的定义 3.3 类中的方法 3.4 方法中的参数传递 3.5 访问控制,3.1 面向对象程序设计概述,面向对象程序设计方法是一种以对象为中心的思维方式。它包括以下几个主要概念:抽象、对象、类和封装、继承、多态性、消息、结构与关联。3.1.1 面向对象方法的特征不同于面向过程的程序设计中以“数据结构+算法”为研究和实现的主体,面向对象的程序设计是以解决问题域中所设计的各种对象为中心的。(1)抽象
2、 抽象就是抽出事物的本质特性而暂时不考虑它们的细节。,(2)对象对象是客观世界存在的具体实体,具有明确定义的状态和行为。对象可以是有形的如:一本书、一只钟表等。也可以是无形的如:记账单、一项记录等。对象是封装了数据结构及可以施加在这些数据结构上的操作的封装体。属性和操作是对象的两大要素。属性是对象静态特征的描述,操作是对象动态特征的描述。,(3)类类是一组具有共同特性的所有对象成员的集合。它是一个抽象的概念。类是对象模版,用于创建具有相同属性和相同操作(服务)的对象。它包括属性和方法(注:类的服务、行为和操作只是叫法上的区别)。,如学生类的声明:,类一旦确定下来,就可以构建系统实现所需的各种对
3、象,实例化就是指在类定义的基础上构造对象的过程。如“学生”类定义后,就可以创建许多该类的对象/实例,如同现实世界中利用点心模子可以做出许多点心一样。见下图学生类和学生类的一个具体对象。,(4)封装封装是把对象的属性和操作结合在一起,构成一个独立的封装体。封装性也就是信息隐藏,通过封装把对象的实现细节对外界隐藏起来了。(5)继承继承使得一个类可以继承另一个类的属性和方法。这样通过抽象出共同的属性和方法组建新的类,便于代码的重用。如下图电梯系统中电梯按钮和楼层按钮的层次关系。,子类电梯按钮和楼层按钮继承了父类Button的全部属性和服务,同时又具有自身新的属性和服务。,(6)多态性多态性是指不同类
4、型的对象接收相同的消息时产生不同的行为。如电梯系统中,当向按钮对象发送消息pressButton()时,不同按钮对象如电梯内部按钮(ElevatorButton)和楼层按钮(FloorButton)会自动判断自己的所属类并执行相应的服务。(7)消息向某个对象发出的服务请求称作消息。对象提供的服务的消息格式称作消息协议。包括:被请求的对象标识、被请求的服务标识、输入信息和应答信息。如向电梯按钮类发送请求按下电梯按钮的消息elvatorButton.pressButton()。,(8)结构与关联对象间存在着各种各样的关系。其主要包括部分/整体、一般/特殊、实例连接、消息连接。 部分/整体,该关系中
5、有两种方式:组合和聚集。组合关系中部分和整体的关系很紧密。聚集关系中则比较松散,一个部分对象可以属于几个整体对象。如下图组合关系。,一般/特殊,也就是继承关系。有时称作泛化和特化关系。如前面电梯系统中的继承关系。实例连接。实例连接表现了对象之间的静态联系。对象之间的实例连接称作链接,对象类之间的实例连接称作关联。消息连接。消息连接表现了对象之间的动态联系,它表现了这样一种联系:一个对象发送消息请求另一个对象的服务,接收消息的对象响应消息,执行相应的服务。,3.2.1 类的声明类可理解成java一种新的数据类型,这种数据类型中封装了数据的内容和对数据内容的操作。类的基本定义方法如下:修饰符 cl
6、ass 类名 extends 父类 implements 接口名类成员变量声明类方法声明,3.2 类的定义,例如图书管理系统中有关图书类的声明如下: public class BookDetails private String name; private double price; public void setName(String name);public void setPrice(double price); 其中:public、private为修饰符,可修饰类和方法,分别代表公有和私有的修饰,具体含义可见后继说明。,1修饰符 (1) 类的修饰符说明了类的属性,分为访问控制符、抽象类
7、说明符和最终类说明符。 访问控制符 :public公共类、private私有类、protected受保护类。public(公共) 后续定义的任何类均可访问。private(私有)仅能被类自身的内部函数成员访问,其他任何类都不能直 接访问。protected(受保护的)同private,但能被继承类访问受保护的成员,不能被访问私有成员。如没有前三种修饰,系统默认为 friendly(友好的)类型,意味着它只能被同一个包的中的类直接使用,但并不存在该关键字。 抽象类说明符:abstract抽象类。abstract不仅用于类的声明,也适用于方法。当用于类的声明时,则该类不能创建对象;,最终类说明符:
8、final最终类。final不仅用于类的声明,也适用于变量或方法。当用于类的声明时,则该类不能有子类;当用于变量声明时,该变量最初赋予的初值在以后的调用中只能引用不能被修改;同样声明为final的方法,在以后只能使用不能重载。(2)class类的修饰符后面的class标志一个类定义的开始(注意不将class写成Class) ,class后面应跟新定义的类的名字,类名应符合java对标识符的有关规定,能体现该类的主要功能或作用。,(3)extends该关键字后面为类的父类的名字,用来说明当前类是哪个已经存在类的子类,存在继承关系。继承是类与类之间的一种非常重要的关系。(4)implements
9、该关键字后面为类所实现的接口列表,用来说明当前类中实现了哪个接口定义的功能和方法。接口是Java语言用来实现多重继承的一种特殊机制,我们将在后面详细介绍它的使用方法。,2成员变量的声明(类的属性)类的属性描述该类的内部信息,又称类的静态属性。一个类的属性可以是简单数据变量,也可以是其他类的对象,或数组等其他复杂的数据结构。成员变量的声明方式如下:public | protected | private static final transient volatile type variableName; 其中:static: 静态变量(类变量;相对于实例变量)final: 常量transient
10、: 暂时性变量,串行化该对象时将排除该变量 volatile: 共享变量,用于并发线程的共享type :变量类型variableName:变量名称,(1)Java中声明类属性为简单变量的语法修饰符 变量类型 变量名 =变量初值 ,.变量名=初值 ; 修饰符为public、private和protected;变量的类型是简单数据类型,如String、int、double等或其他复杂类型。如图书管理系统中有关图书类的属性声明如下:class BookDetailsprivate String name = “java面向对象程序设计” ; / 书名private double price = 50
11、.0; / 定价,(2)Java中声明类属性为对象的语法修饰符 变量类型 变量名 =new 类名(实际参数列表)变量初值; 修饰符可见上面类头的声明;类名代表该类可以包含另一个类的对象。例如图书详细信息类中属性为类对象的声明如下:public class BookDetailsDialog extends JDialog protected BookDetails book; / 声明图书类 BookDetails的对象protected Frame parent; / 声明框架Frame的对象parentprotected JTable bookInLibTable; /声明标签 Jtabl
12、e的对象bookInLibTable,3成员方法的声明类的方法,有称类的成员函数,用来规定类属性上的操作。方法的实现包括两部分内容:方法声明和方法体。public | protected | private static final | abstract native synchronized returnType methodName(paramList) throws exceptionList /方法声明statements /方法体其中:static: 类方法,可通过类名直接调用 abstract: 抽象方法,没有方法体 final: 方法不能被重写 native: 集成其它语言的代码
13、 synchronized: 控制多个并发线程的访问例java中应用程序主类的方法:public static void main(String args) 。,3.2.2 创建类的实例对象对象是类的一个实例,在程序中创建个对象时,将在内存中开辟一块存储空间,其中包括该对象的属性和方法。创建对象使用关键字运算符new,例如下面的语句将创建BookDetails的对象:BookDetails book = new BookDetails(); /无初始值的book对象BookDetails book = new BookDetails(“7-5084-1798-4“, “高等数学“,“李玉“,“
14、高等教育出版社“,29); /有初始值的book对象,【例3-1】 自定义类BookDetails,创建并使用类BookDetails的三个对象。注释:本程序的功能是定义一个图书类BookDetails,并声明一个具有三个元素的数组,数组中的每个元素都是BookDetails的对象,并输出三个BookDetails对象的具体信息。,文件名:test_BookDetails.java,3.3.1 方法的声明Java中声明方法的语法如下:修饰符 返回值类型 方法名(参数列表) throws 例外名1,例外名2, /方法体局部变量声明;语句序列;,3.3 类中的方法,方法头一般由方法名、返回类型、参
15、数列表、方法修饰符和方法抛出的例外五部分组成。本节只讲述方法的基本声明,而方法修饰符的使用和方法抛出的例外见其他章节。方法名可以是任何有效的标识符,命名规则与标识符命名规则相同。返回值类型说明符用来指定方法返回值的类型,方法最多只能返回一个值。,参数列表是方法接收的外来参数,它列出了一系列形式参数的类型和名称,参数列表必须包括在方法名后面的小括号里,参数列表可以为空,如果参数列表中有多个形式参数,则参数表以逗号为分隔符,在方法参数表的右括号后加一个分号是语法错误。方法调用时必须有一个实际参量与形式参数一一对应,而且实参变量的类型必须与对应形式参数类型相一致。,3.3.2 方法的创建在java中
16、可直接在类外对类中公有的数据成员赋值,但从数据安全的角度考虑,大多时候都必须在类中定义不同的方法来存取类定义的实例变量。如例3-1图书管理系统中BookDetails类中定义方法如下:public void setAuthors(String Authors) /设置图书的作者名authors = Authors;public String getAuthors() /返回图书的作者名return authors;,3.3.3 方法的调用类自身的方法,可以直接使用这个方法的名称;调用其他对象或类的方法,则需要使用该对象.方法()或类.方法()(类为静态的)。例如在BookDetails类中为数
17、据成员isbn赋值的方法setIsbn()和获取isbn的getIsbn()方法中的调用book.setIsbn( “7-5643-89“);book.getIsbn();在java程序设计中称这种方法的调用叫“向对象发送一条消息”,在上面的例子中消息分别是setIsbn()和getIsbn(),而对象时book。,3.3.4 构造函数1. 构造函数的概念要使用对象,首先必须构造它们,并指定它们的初始状态,然后将方法应用于对象。在Java程序设计语言中,使用构造函数(constructor)来构造类的实例。一个构造函数是类的一个特殊方法,它的作用是构造并初始化对象。 构造函数的特殊性体现在以下
18、几个方面: 构造函数的方法名与类名相同。 构造函数没有返回类型,但可携带0个、1个或多个参数。 构造函数的主要作用是完成对类对象的初始化工作。 构造函数不能由编程人员显式地直接调用。 当new一个类的新对象时,系统会自动调用该类的构造函数为新构造对象初始化。 构造函数可以重载,2. 创建构造函数构造函数语法格式:() /方法体 其中:修饰符为类声明中的public、protected、privateargu_list 为参数,可以为空statements 构造函数的语句体,也可为空,首先看例3-1中的BookDetails类的构造函数: class public BookDetails .Bo
19、okDetails(String isbn, String name, String authors,String publisher,double price)/带参数的构造函数,完成每个对象的初始值的赋值isbn = Isbn;name = Name;authors = Authors;publisher = Publisher;price = Price; . ,构造函数的名字和类的名字是相同的。当构造BookDetails类的对象时,此构造函数被启动,为每一个对象的数据成员赋初值。如语句:book2 = new BookDetails(“7-5084-1798-4”, “高等数学”,“
20、李玉”,“高等教育出版社”,29)则创建BookDetails类的一个对象book2时,系统自动调用构造函数为该对象赋初值。结果如下:isbn = 7-5084-1798-4name = 高等数学authors = 李玉publisher = 高等教育出版社price = 29,3. 构造函数的作用 (1)对象初始化构造函数是创建对象时为对象赋初值。 (2)引入更多的灵活度(变量赋值或更复杂的操作)通过给构造函数设置不同的自变量,也就是通过方法的重载(overload)来为一个类提供多个不同的构造函数,为类的不同对象赋不同的初始值。 (3)Java中可以不定义构造函数如果类的定义者没有显式的定
21、义任何构造方法,系统将自动提供一个默认的构造方法:默认构造方法没有参数默认构造方法没有方法体Java类中,一旦类的定义者显式定义了一个或多个构造方法,系统将不再提供默认的构造方法。,Java可用垃圾收集器回收由不再使用的对象占据的内存。但垃圾收集器只知道释放那些由new分配的内存,所以不知道如何释放对象的“特殊”内存。为解决这个问题,Java提供了一个名为finalize()的方法,可为我们的类定义它。要给一个类增加终结(finalizer),只需要定义finalize()方法即可。Java回收该类的一个对象时,就会调用这个方法。在finalize()方法中指定对象撤销前必须执行的操作,这样在
22、对象释放之前,java运行系统调用该对象的finalize()方法。,3.3.5 finalize()方法的作用,使用finalize()方法的一般格式如下:protected void finalize()/ finalization code here 其中关键字protected是防止该类之外的其他对象或代码访问该方法。在Java中没有用于销毁和清理对象的析构函数,Java提供了垃圾回收(Garbage Collection,简称gc)机制负责释放对象所占用的内存空间及相关的其它资源。,3.4.1 参数传递的方式对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这
23、些参数的值。如果要改变参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。【例3-2】 简单数据类型与引用数据的区别。,3.4 方法中的参数传递,文件名:test_simpleRef.java,3.4.2 对象作为参数的传递对象也可以作为实参传递给方法。如下面的简单程序。【 例3-3】对象作为实参传递的实例。,文件名:test_parameter_object.java,3.4.3 命令行参数的使用main()方法是一个重要而又特殊的方法。它是Java应用程序的入口,JVM在运行字节码文件时,做完初始化之后,就会查找main()方法
24、,从这里开始整个程序的运行。在main()方法的括号里面有一个形式参数“String args”,args是一个字符串数组,可以接受系统所传递的参数,而这些参数则来自于用户的输入。在命令行执行一个程序通常的形式是:java 类名 参数列表其中的参数列表中可以容纳多个参数,参数间以空格或制表符隔开,它们被称为命令行参数。,系统传递给main()方法的实际参数正是这些命令行参数。由于Java中数组的下标是从0开始的,所以形式参数中的args0,argsn-1依次对应第1,n个参数。下面这个例子展示了main()方法是如何接收这些命令行参数的。【例3-4】 命令行参数使用的实例。,文件名:test_
25、commandLine_arguments.java,3.5.1 java中的访问控制在面向对象程序设计时,如何使某些类对象的数据和成员不被其他对访问,以保证数据的隐私和信息隐藏,在Java中引入了“访问控制修饰符”的概念,通过修饰符的限定使得信息隐藏得以实现。Java中类的访问控制符有public、protected、private和缺省值(无关键字),下面给出java中访问控制符的含义:,3.5 访问控制,1public访问控制符一个类被声明为公共类,表明它可以被所有的其他类所访问和引用,这里的访问和引用是指这个类作为整体对外界是可见和可使用的,程序的其他部分可以创建这个类的对象、访问这个
26、类内部可见的成员变量 和调用它的可见的方法。一个类作为整体对程序的其他部分可见,并不能代表类内的所有属性和方法也同时对程序的其他部分可见,前者只是后者的必要条件,类的属性和方法能否为所有其他类所访问,还要看这些属性和方法自己的访问控制符。,2缺省访问控制符假如一个类没有访问控制符,说明它具有缺省的访问控制特性。这种缺省的访问控制权规定该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用,这种访问特性称为包访问性。通过声明类的访问控制符可以使整个程序结构清晰、严谨,减少可能产生类间干扰和错误。,3private私有访问控制符用private修饰的属性或方法只能被该类自身所访问和修改,而
27、不能被任何其他类,包括该类的子类,来获取和引用。如图书管理系统中图书类BookDetails中的私有数据private String isbn; / ISBN号private String name; / 书名private对这些属性的修饰确保他们只能被本类BookDetails自身的方法访问,任何其他类的方法无法访问这些属性。方法大多数是公有的,但是私有方法也经常使用。这些私有的方法只能被同一个类的方法调用。,4protected保护访问控制符用protected修饰的成员变量可以被类自身、与它在同一个包中的其他类、在其他包中的该类的子类。如下表所示:,3.5.2 static关键字的使用s
28、tatic是静态修饰符,可以修饰类的属性,也可以修饰类的方法。被static修饰的属性不属于任何一个类的具体对象,是公共的存储单元。任何对象访问它时,取得的都是相同的数值。当需要引用或修改一个static限定的类属性时,可以使用类名,也可以使用某一个对象名,效果相同。,1静态属性定义静态数据的简单方法就是在属性的前加上static关键字。例如,下述代码能生成一个static数据成员,并对其初始化:class StaticTest static int i = 47;StaticTest st1 = new StaticTest();StaticTest st2 = new StaticTest
29、();此时,无论st1.i还是st2.i都有同样的值47,因为它们引用的是同样的内存区域。上述例子采用对象引用属性的方法,也可直接通过类直接使用该类的静态属性。正如上面展示的那样,可通过一个对象命名它,如st2.i。亦可直接用它的类名引用,如StaticTest.i,而这在非静态成员里是行不通的。,StaticTest.i+;其中,+运算符会使静态变量i的值增加1。此时,无论st1.i还是st2.i的值都是48。通样对静态方法而言既可通过一个“对象”引用静态方法,亦可用“类名.方法()”加以引用。如类中添加静态方法的incr()后的类:class StaticTeststatic void i
30、ncreat() StaticTest.i+; 调用incr()方法可以通过对象加以调用,具体代码段如下:StaticTest st1 = new StaticTest();st1.incr();也可以通过类名直接调用该静态的方法。具体代码如下:StaticTest.incr();,2静态代码块在类中,也可以将某一块代码声明为静态的,这样的程序块叫静态初始化段。静态代码块的一般形式如下:static 语句序列 ,如下面代码定义一个静态代码块static/这是一个局部变量,只在本块内有效int stVar = 12; System.out.println(“This is static bloc
31、k.“ + stVar);编译通过后,用java命令加载本程序,程序运行结果首先输出:This is static block. 12接下来才是main()方法中的输出结果,由此可知静态代码块甚至在main方法之前就被执行。,3静态方法(1)静态方法的声明和定义在声明为静态的方法头加上一个关键字static。它的一般语法形式如下:访问权限修饰符 static 返回值类型 方法名(参数列表) 语句序列例如java主控类的main()方法的定义:public static void main(String args)System.out.println(“java主类的静态的main()方法“);
32、,(2)静态方法和非静态方法的区别静态方法和非静态方法的区别主要体现在两个方面:在外部调用静态方法时,可以使用“类名.方法名”的方式,也可以使用“对象名.方法名”的方式。而实例方法只有后面这种方式。静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不能访问非静态的成员变量。 【例3-5】 静态方法访问成员变量的实例。,文件名: test_accessStatic.java,3.5.3 final关键字的使用1. final成员当变量前面加上final关键字,那就是说该变量一旦被初始化便不可改变,对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以
33、在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。不能同时既在定义时给了值,又在构造函数中给另外的值。如下面程序代码:,public class test_finalfinal PI=3.14; / 定义final变量时便给数值final int I; / 在构造函数中对final变量初始化,定义时不能再赋初值public test_final()I = 100;上述类很简单的演示了final的常规用法。这样在程序的随后部分会可以直接使用这些变量,就像他们是常数一样。,2. final方法 将方法声明为final,那就说明该方法不需要进行扩展,也不允许任何
34、从此类继承的类来覆写这个方法,但是可以继承这个方法,也就是说可以直接使用。3. final类 当将final用于类身上时,那就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。,本章主要介绍了java中有关类的定义,类中属性和方法的声明。其中方法是类对外提供的接口,类与类之间的交流时通过类中方法而实现的,因此着重介绍了方法的定义、方法的调用以及方法调用过程中参数的传递,另外也详细介绍了类的特殊方法构造函数的创建及使用。最后又介绍了java中访问控制的实现和几个主要关键字的使用。,本章小结,import java.io.*;public class tes
35、t_BookDetails public static void main(String args) /主类的main方法/构造一个图书BookDetails数组,并给他赋三个图书BookDetails对象BookDetails book = new BookDetails3; book 0 = new BookDetails(“7-5084-1798-4“, “软件工程“,“张海藩“,“清华大学出版社“,34);book 1 = new BookDetails(“7-5084-1798-7“, “java程序设计语言“,“王海“,“西安电子出版社“,27);book 2 = new Book
36、Details(“7-5084-1798-4“, “高等数学“,“李玉“,“高等教育出版社“,29);System.out.println(“三个图书对象的输出信息如下:“);for (int i = 1; i staff.length+1; i+) / 输出每本图书的信息BookDetails e = book i-1; /获取每个图书对象System.out.println(“第“+ i + “本图书的信息 :“ + e.getIsbn() + “ “ + e.toString() + “ “ +e.getPrice();,【例3-1】 自定义类BookDetails,创建并使用类Book
37、Details的三个对象。,for (int i = 0; i book.length; i+) /修改图书对象的价格信息staffi.setPrice(staffi.getPrice() + 5);System.out.println(“价格修改后的三个图书对象的输出信息如下:“);for (int i = 1; i book.length+1; i+) / 输出每本图书的信息BookDetails e = book i-1; /获取每个图书对象System.out.println(“第“+ i + “本图书的信息 :“ + e.getIsbn() + “ “ + e.toString()
38、+ “ “ +e.getPrice(); ,class BookDetails /图书类private String isbn; / ISBN号private String name; / 书名private String authors; / 作者private String publisher; / 出版信息,包括出版地点、出版社名、出版日期private double price; / 定价public BookDetails() /无参的构造函数,public BookDetails(String Isbn, String Name, String Authors,String Pub
39、lisher,double Price) /带参的构造函数,完成每个对象的初始值的赋值isbn = Isbn;name = Name;authors = Authors;publisher = Publisher;price = Price;public String getIsbn() /返回图书的isbnreturn isbn;,public void setIsbn(String Isbn) /设置图书的isbnisbn =Isbn;public String getName() /返回图书的名称return name;public void setName(String Nme) /设
40、置图书的名称name = Name;public String getAuthors() /返回图书的作者名return authors;public void setAuthors(String Athors) /设置图书的作者名authors = Authors;,public String getPublisher() /返回图书的出版社return publisher;public void setPublisher(String Pblisher) /设置图书的出版社publisher = Publisher;public double getPrice() /返回图书的价格retu
41、rn price;public void setPrice(double Price) /设置图书的价格price = Price;public String toString() /返回图书的基本信息,如作者、出版社等return name + “ , “ + authors + “ , “ + publisher; ,程序输出结果如图所示(点击图片返回该程序的调用处),class SimpleRefTypefloat Value;public void changeInt(int value) / 修改值参数的方法value = 34;public void changeRef(Simpl
42、eRefType tt) /修改引用参数的方法tt.Value = 45.6f; ,【例3-2】 简单数据类型与引用数据的区别。,public class test_simpleRef public static void main(String args) int val ;val =33;System.out.println(“val的初值为 :“+ val);SimpleRefType tt =new SimpleRefType(); /创建SimpleRefType的对象tt.changeInt(val); /修改值参数的方法调用/值参数值的修改,没有影响值参数的值System.out
43、.println(“调用方法changeInt()后val的初值为 :“+ val); / 引用参数Value的调用tt.Value=12.6f;System.out.println(“类的成员Value的初值为 :“+ tt.Value);tt.changeRef(tt); / 引用类型的参数方法调用/ 引用参数值的修改,改变了引用参数的值System.out.println(“引用方法changeRef()调用后Value的值为 :“+ tt.Value); ,程序输出结果如图所示:(点击图片返回程序的调用处),【例3-3】对象作为实参传递的实例。,import java.io.*;imp
44、ort javax.swing.JOptionPane;class BookInLibrary /书库类private String bookName; /书名private String bookAuthor; /作者private int bookPages; /书的页数private boolean available; /可借的状态,为true则可借,反之不能借阅BookInLibrary(String name,String author,int pages,boolean status)bookName = name;bookAuthor = author;bookPages =
45、pages;available = status;,public void isAvailable() /判断图书是否可借的方法if(available=true)System.out.println(“该图书可以借阅!“);elseSystem.out.println(“该图书不可以借阅!“);public String toString() /输出图书基本信息的方法return (bookName +“ “+ bookAuthor + “ “+String.valueOf(bookPages) +“ “+ String.valueOf(available); ,class Borrower
46、 /借阅者类/Borrower的属性、构造函数在该例中忽略/Bookde 的对象book形参,使得每个借阅者调用该方法可查看图书的在库状态public void getBookStatus(BookInLibrary book) book.isAvailable();,public class test_parameter_objectpublic static void main(String args)BookInLibrary objBook = new BookInLibrary(“软件工程“,“张海藩“,340,true);System.out.println(objBook.toS
47、tring();/输出图书的基本信息/借阅者查看图书是否可以借阅Borrower borrower = new Borrower(); /创建借阅人/查看图书的状态,该方法接受Book的对象作为实参borrower.getBookStatus(objBook); ,程序输出结果如图所示:(点击图片返回程序的调用处),class test_commandLine_arguments public static void main(String args /依次获取命令行参数并输出for(int i=0;iargs.length;i+)System.out.println(“args“+i+“:
48、“+argsi); ,【例3-4】 命令行参数使用的实例。,程序输出结果如图所示:(点击图片返回程序的调用处),class test_accessStaticprivate static int count; /定义一个静态成员变量,用于统计对象的个数private String name; /定义一个非静态的成员变量public test_accessStatic(String Name)name = Name;count+; /定义一个静态方法,测试静态的方法是否能够调用非静态的数据成员和方法public static void accessStaticMethod()int i = 0; /正确,可以有自己的局部变量count+; /正确,静态方法可以使用静态变量anotherStaticMethod(); /正确,可以调用静态方法name = “静态对象”; /错误,不能使用实例变量resultMethod (); /错误,不能调用实例方法,【例3-5】 静态方法访问成员变量的实例。,