




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 类和对象Java语言是典型的面向对象程序设计语言。本章将结合面向对象程序设计思想和Java语言,通过对类和对象的详细介绍,来阐述用Java语言实现面向对象思想中的抽象性和封装性这两大特性。本章内容具体涉及到类和对象的概念、类的定义、对象的初始化和清除、一些特殊形式的类等。4.1 类和对象在面向对象设计语言出现之前,是利用的过程程序语言如Pascal、C等来编写程序的,这些过程程序设计语言是将算法转化成程序代码,由于程序中数据和过程或函数是分开的,如果对程序的功能发生一点变化,假设新增一个功能函数,这可能需要程序员对程序做较大程度的修改。这就使得过程程序设计语言的重用性、可用性、灵活性、
2、适应性等方面不如人意。面向对象程序设计语言是利用面向对象特性可以很好的改善过程设计语言中存在的问题。面向对象语言是立足类和对象概念,能较好地反映和模拟现实世界,充分体现了程序的模块化、重用性、可用性。4.1.1 对象和类的基本概念面向对象程序设计语言中是以类和对象为核心内容。对象实际上就是对现实世界的存在实体的模拟,例如一本书、一双鞋子、一台电脑都可以视为一个对象,甚至一位学生也可以是一个对象。对于每一个对象都有自己的状态和行为。现在以某一学生为例,学生对象的状态可以通过姓名、出生日期、学号、籍贯、系别、专业、选修课程名等属性来说明,用注册学籍、选择选修课程、阅读书籍等动作说明该对象的行为。假
3、设一位名叫张三的学生是一个对象。这一对象有学号(23232)、姓名(张三)、出生日期(1984年2月3日)等属性。“张三”通过注册学籍动作,开始一个学期的学习生活,通过选修“Java语言”课程,可以使“张三”可以参加“Java语言”课程的学习。从上述的简单描述可以知道,对象的状态实际上是描绘对象静态的属性特征,对象的行为是说明对象的会发生变化的动态行为。为此,可以定义整型量表示学号、字符串量表示姓名等属性。定义register()、chooseCourse()等方法表示注册、选修课程等动作。面向对象程序设计是通过具体的数据来描绘对象的状态,而对象的行为往往是通过方法的调用来体现。当该生发生“选
4、择课程”动作的时候,对象“张三”调用方法“chooseCourse()”,方法的参数是“2006-2007学期”。对于外界而言,张三同学基于什么考虑选择课程并不是问题的重点,即“chooseCourse()”方法是如何实现“选择课程”的动作并不重要,重点是通过调用“chooseCourse()”方法可以实现“选择课程”这一动作,改变了“张三”这一对象的内部状态“选修课程名”。数据“选修课程名”隐藏在对象的内部,通过方法“chooseCourse()”实现对数据“选修课程名”的访问和修改。这种外界通过调用对象的方法进行联系的方式体现了对象的信息封装。因此,可以认为对象是数据以及相关操作封装在一起
5、的实体。类是面向对象程序设计中的另一个重要概念。它是对一组具有相同属性、行为、关系以及语义的对象的描述。对于每个类都有别于其他类。在Java语言中,类是对具有相同类型对象的抽象,在一个类中可以用变量来表示对象的抽象状态,而用方法抽象出对象的行为特征。简单的说,一个叫“张三”的学生个体是一个对象,而定义一个“Student”类可以泛指学生类型。从图4-1中可以看到,“Student”类中用变量Id、name、birthday等分别表示学号、姓名、出生日期等静态属性,用register()、chooseCourse()等方法描绘学生的注册、选修课程等动态属性。而“张三”是“Student”类的一个
6、对象,具有的特征如学号(Id=23232)、姓名(name=“张三”)、出生日期(birthday=“1984年2月3日”)等。在用Java语言编写程序的时候可以把类理解为数据类型,而把对象理解为数据类型中的变量实例。图4-1 类和对象的关系4.1.2 类的声明类是面向对象的基础。首先,类的声明格式如下:修饰符class 类名 extends 父类implements 接口名1,接口名n类的成员类的定义有两大部分组成:类体和类头。类体是用“”括起的部分,而其余部分是类头,规定类的一些基本性质。“”包括的内容是可选项。修饰符是一些关键字,用于说明类的可访问性(如public)和其他非访问性质(如
7、final、static、abstract等)。访问控制符限定了类的可访问性,即,对其他类是否可见。非访问控制符是指用于限定类的性质的关键字,它们往往限定类是否是具有某些特征的类。例如,关键字final可以定义一个最终类,关键字static可用于定义静态嵌套类(见4.6.1),而abstract用于抽象类(见第5章5.2)。一些关键字是不能同时修饰类的。例如final和abstract是不能同时定义类。关于这些具有特殊性质的类将在第5章介绍。关键字class表示开始定义一个类。在class后的类名必须符合标识符的命名规则。一般来说,类名可以有一个或多个英文单词构成,每个单词的第一个字符必须是大
8、写,其他字符小写;例如,类名Student,类名JOptionPane。关键字extends用来说明该类的父类。也就是该类是指定父类的子类。二者体现的是继承关系。关键字implements定义了该类实现的接口表,在该接口表中说明可以实现的一个或多个接口。类体说明的是类的成员。类的成员包括两大部分:类的成员变量和类的成员方法。对于类的成员将在4.1.4详细说明。下面有一个类Student声明的实例:public class Student /定义一个Student类/定义成员变量 private int Id; /定义学号属性 private String name; /定义姓名属性 priva
9、te Date birthday; /定义出生日期属性 private String courseName; /定义课程名 ./定义成员方法; public Student(int studentId) .public boolean register(Date d) /定义注册学籍方法 . public void chooseCourse(String cname) /定义选修课程方法 . .4.1.3 类的访问控制类的访问控制是定义类的访问权限,它说明了其他类对本类的访问方式。类的访问方式有两种,一种是由public关键字说明的公共访问方式,另一种是默认访问方式,即没有访问控制关键字修饰的
10、类,有时也称为包私有(package-private)访问方式。关键字public修饰的类,说明该类是公共类,该类能被所有的类进行访问和引用。Java语言提供了大量的公共类,比如在前几章常用的几个类如java.util.Date、javax.swing.JoptionPane、java.lang.String等都是公共类。公共类可处于不同的包,如Date类在java.util包,JOptionPane类在java.swing包里。对于不同包中公共类,可以注明所在的包名直接引用公共类,也可以通过先导入包名再引用公共类。关于包的介绍将在4.2中说明。例如:import java.util.*; /
11、导入java.util包public class Student /定义一个Student类 private Date birthday; /定义出生日期属性,定义java.util.Date变量birthday; private String courseName; /定义课程名 . public Student(int studentId) .public boolean register(Date d) /定义注册学籍方法 . public void chooseCourse(String cname) /定义选修课程方法 .在上面的程序段中,类Student是引用了java.util包
12、的公共类Date。另外,类Student也是一个公共类,可以为其他类所访问和引用。默认访问方式,也称为包私有(package-private)访问方式。这种访问方式只允许本包内的类进行访问,对于包外的类是私有的,无法进行访问。对于包私有类,即使通过导入语句将类所在的包通过import关键字导入,其他包的类仍是无法访问。例如图4-2中的访问控制示例。图4-2展示的Example1包定义了两个类A和B,其中类A是公共类,B是默认的包私有类。类A对于所有的类都是可见的,与类是否是处于同一个包无关。因此,类B和类C均可以访问和引用类A。而处于包Example2的类C需要导入类A所在的包Example1
13、才可访问类A。至于类B,只能对同一个包的类可见。在这个图例中类B只对类A可见。至于Example2包中的类C,它只可以访问类A而不能访问类B。如果类C强行引用类B,会超出类B的可访问权限,导致编译错误。Example1包Example2包package Example1;public class Apublic A()public void testA()System.out.print(A );package Example1;class BA ab=new A();/正确public B()public void testB()ab.testA();System.out.print(B )
14、;package Example2;import Example1.*;/导入包Example1public class CA a=new A();/正确B b=new B()/发生编译错误public void test()a.testA();图4-2 类控制访问示例4.1.4 类的成员类的成员包括类的成员变量和成员方法。注意有时也可以称成员变量为数据成员。用类的成员变量描绘类的属性,用成员方法描绘类的功能和操作。1 成员变量的定义访问控制符staticfinaltransientvolatile 数据类型 变量名;同上“部分”表示可选项,访问控制符包括了public、private、pro
15、tected等关键字。static、final、transient和volatile是非访问控制修饰符,用于说明类的成员变量的性质。例如,关键 static 说明成员变量是静态数据,关键字final修饰符使得变量成为常量,transient变量说明成员变量不能被序列化,关键字volatile的修饰使得变量能从主存读取,进行异步修改。对于数据类型,它可以是基本数据类型如int、char等,也可以是Java语言提供的类如java.util.Date、java.lang.String,也可以是用户自定义的类如上面定义的Student类。变量名必须符合标识符命名规则。在面向对象程序设计语言中,有一个默
16、认规则就是变量名可以由一个或多个英文单词构成,其中第一个单词的第一个字符必须小写,如是由多个单词构成,其他单词的第一个字符必须大写,其他字符小写,例如变量名studentName。表4-1 基本类型的默认值基 本 类 型默 认 值基 本 类 型默 认 值booleanfalseint0charu0000(null)long0Lbyte(byte)0float0.0fshort(short)0double0.0d变量名在定义的同时可以进行初始化。如果数据类型是基本数据类型,可以直接将初始值赋值给成员变量,要是没有声明初始值,系统会根据数据类型的不同自动为成员变量赋一个初始值,表4-1列出了各基本
17、类型的默认值。如果数据类型是一个类,可以通过操作符new创建一个对象赋值给成员变量,形如“类名 成员变量=new 类名(行参表)”例如:name=new String(张三);2成员方法的定义 访问控制符staticfinalabstractnativesynchronized返回值数据类型 方法名(参数表) throws 异常名表 方法体类的成员方法的访问控制符决定其他类是否可以该方法,控制符有public、private和protected;其他非访问修饰符有static、final、abstract、native、synchronized等,这些修饰符说明了成员方法的某些特性。例如, f
18、inal关键字可以说明成员方法是一个不可以修改的最终方法;abstract关键字说明该方法是抽象方法,没有方法体;native可以说明方法是一个本地方法;synchronized说明成员方法是一个同步方法等。返回值类型数据类型的要求同类的成员变量的数据类型,可以是基本数据类型,也可以是类。方法名必须符合标识符命名规则。方法名可以由一个或多个英文单词构成,其中第一个单词的第一个字符必须小写,如是由多个单词构成,其他单词的第一个字符必须大写,其他字符小写,例如方法名chooseCourse。方法体包括方法的局部变量声明和执行语句。例4.1 定义一个圆形类,它可以实现圆面积的计算。 public c
19、lass Circle double radius; public Circle() public Circle(double _radius) radius=_radius; public double getArea() return 3.14*radius*radius; /返回面积; public static void main(String args) Circle circle=new Circle(3); /定义一个半径为3的circle对象 System.out.println(半径为3的圆面积为:+circle.getArea();/求面积; System.exit(0);
20、 3成员访问控制成员访问控制符有三种public、private和protected,它们和成员的默认访问方式(包私有:package-private)一起构成了成员的访问方式。通过它们,有效的控制其他类对类的成员变量和成员方法的访问。(1)public用public关键字修饰成员变量或成员方法,即为公有成员变量或共有成员方法。所有的类可以对类的公有成员进行访问。请观察例4.2的程序代码。例4.2定义一个长方形的类Rectangle,利用一个测试主类RectangleTest求面积。 public class Rectangle /定义一个Rectangle public int length
21、; /定义长度,公共变量 public int width; /定义宽度,公共变量 public Rectangle() /无参构造方法 public Rectangle(int l,int w) /有参构造方法,l表示长度,w表示宽度 length=l; width=w; public int getArea() return length*width; public class RectangleTest /定义测试类 public static void main(String args) Rectangle rectangle=new Rectangle(3,4); /初始化对象rec
22、tangle,长为3,宽为4 System.out.println(长=+rectangle.length); /输出长度 System.out.println(宽=+rectangle.width); /输出宽度 System.out.println(面积+rectangle.getArea(); /输出面积 System.exit(0); 观察程序RectangleTest.java,可以发现其中的main方法中创建了一个Rectangle的对象rectangle,由于rectangle对象的成员变量length和width是公共成员变量,所以在程序中rectangle.length和re
23、ctangle.width成员变量可以被直接引用。同样,由于rectangle对象的成员方法getArea()也是共有的,因此在测试类RectangleTest.java中对该方法也可以直接调用。(2) private用关键字private修饰的成员变量是私有变量。私有变量是不能被其他类和其他类的对象进行直接访问的,它只能被定义它的类直接访问。一般,在设计类时推荐将数据成员定义为私有成员,这样数据成员的变化不会影响到其他类,有效的实现了数据的封装,数据对外界是不可见。假设将例4.2的Rectangle.java进行修改,将表示长和宽的公共成员变量length和width改成私有变量,形式如下:
24、public class Rectangle private int length; /定义长度,私有变量: private int width; /定义宽度,私有变量 public Rectangle() /默认构造方法 public Rectangle(int l,int w) /有参构造方法,l表示长度,w表示宽度 length=l; width=w; public int getArea() return length*width; 这时,调试测试主类RectangleTest,会发现程序出现编译错误,见下列程序代码。原因在于定义的类Rectangle的两个私有数据成员(length和
25、width)只在类Rectangle有效,其他类没有访问权限,不能直接访问。public class RectangleTest /定义测试类RectangleTest public static void main(String args) Rectangle rectangle=new Rectangle(3,4); /初始化对象rectangle,长为3,宽为4 System.out.println(长=+rectangle.length); /输出长度,编译错误 System.out.println(宽=+rectangle.width); /输出宽度,编译错误 System.out.
26、println(面积+rectangle.getArea();/输出面积 System.exit(0); (3) protected关键字protected是保护访问控制符。用于定义保护访问成员,它不仅使得类成员对同一个包的类可见,而且对该类的不在同一个包的子类可见。例如:package P;public class Parentprivate int childNumber;public Parent(int _childNumber)childNumber=_childNumber;protected void testP()/定义protected方法 System.out.printl
27、n(Parent);package C;import P.*;public class Children extends Parent public Children() public void testC() testP();/合法 图4-3 protected成员的示例(4) 默认访问方式默认访问方式是指没有任何访问控制符的类成员,也称这种访问方式为包私有(package-private)访问方式。对于这些类成员,它们对同一个包的类是可见的。例如: /A.javapackage P1; public class A public A() void testA()/包私有 System.ou
28、t.println(Test A); /B.javapackage P1; public class B A a=new A(); public B() void testB() a.testA();/合法 System.out.println(Test B); 观察上述两个文件A.java和B.java。这两个文件分别定义了同在包P1中的类A和类B。类B可以访问类A的默认访问成员方法testA()。如果包P2中定义一个类C,形式如下:package P2;import P1.*;public class C A a=new A(); public C() void testC() a.tes
29、tA(); /错误 System.out.println(Test C); 这时,可以发现在类C调用类A中的默认访问方式的方法testA()会发生编译错误。因为,类A中的成员方法testA()仅在包P1中可见。4类静态成员类的定义中可以看到,类的成员可以用关键字static修饰。一旦用static关键字修饰类的成员,这些类的成员就是静态成员。带有static的成员数据便成为静态成员数据。同样,凡是用static关键字修饰的成员方法认为是静态成员方法。无论是静态成员数据还是静态成员方法,它们的共同的性质是不能被实例化,可直接用类进行调用。这是因为,static修饰符所表示的这些静态成员属于类并不
30、属于类对象的特性,静态成员对于所有的类对象而言是共享的成员。因此,静态成员方法中不能访问对象的状态,只能访问类的静态成员或显式提供的参数。在具体使用类的静态成员可以通过类名直接调用,形如:“类名.静态成员”。这种调用方式与非静态成员只能通过创建对象来访问类的成员(形如:“对象名.成员”)是完全不同的。例4.3 类的静态成员的示例。public class StaticMember static int counter; public StaticMember() counter+; /定义计数器 public static void showMessage() System.out.print
31、ln(信息输出+counter+ 次); public static void main(String args) StaticMember.showMessage(); /通过类名访问静态成员方法 StaticMember sm1=new StaticMember(); sm1.showMessage(); /通过对象名访问静态成员方法 StaticMember sm2=new StaticMember(); sm2.showMessage(); sm1.showMessage(); /访问同一个数据counter System.exit(0); 图4-4 例4.3的运行结果5本地方法用关键
32、字native修饰的方法是本地方法,它表示该方法并不是用Java语言编写,而是用其他语言如C/C+/汇编语言编写的方法。这些方法通过JNI(Java Native Interface:Java本地接口)与Java程序进行连接,扩展Java程序的功能。本地方法概念的提出为解决Java语言无法处理的问题提供了新的思路。例4.4 本地方法的示例。public class NativeExample/NativeExample.javastatic System.loadLibrary(NativeMethod); /装载库文件NativeMethod.dllpublic native void sh
33、owMessage(); /定义一个本地方法public static void main(String args) NativeExample ne=new NativeExample(); ne.showMessage();例4.4中定义了一个本地方法showMessage(),它是由其他语言定义的方法,在Java语言中只是定义了方法体,具体的实现是通过其他语言实现的。现在需要考虑的是如何生成NativeMethod.dll库文件。可以通过javac命令编译Java源程序,生成类文件。例如javac NativeExample.java然后通过命令javah为Java的类文件来生成一个头文
34、件,提示程序员需要定义的方法格式是怎样的。例如,“javah jni NativeExample”。通过该命令可以得到名为NativeExample.h的头文件。现在只需要用C/C+语言对头文件中说明的如下方法进行定义即可。具体用C/C+语言生成库文件请看相关的资料。JNIEXPORT void JNICALL Java_NativeExample_showMessage (JNIEnv *, jobject);4.1.5 对象的实现类通过相同性质对象的描述。对象是通过类来实现的。在实现一个对象的时,可以将类看成数据类型,而将对象看成在该数据类型下的具体的一个值。在实际实现对象时,单独一个值在
35、程序中并没有太大的意义,往往理解为将一个对象赋值给一个对象变量。具体操作涉及到三个步骤:1)声明对象变量;2)实例化对象;3)初始化对象。1) 声明对象变量通过声明对象,限定了对象变量是属于哪个类,可以通过如下格式实现对象的声明。类名 对象名,对象名1,假设要声明一个Student类的对象变量stu,可以表示成:“Student stu;”。2)实例化对象实例化对象实际上就是通过new操作符创建一个对象,允许对象在内存中开辟一个空间。具体形式如下:对象名=new 类名(实参表);例如实例化上述声明的stu对象变量,可以表示为如下形式:stu=new Student(“张三”); /开辟一个内存
36、空间,将实例化对象赋值给对象变量stu3)初始化对象初始化对象就是通过new操作符来调用构造方法(见4.3节),来实现对该对象变量的初始化工作。在语句“stu=new Student(“张三”);”中,通过new操作符,调用了带有一个参数的构造方法Student(“张三”),从而达到实现对对象变量stu的初始化。有时为了书写方便,也把这三个步骤合并,形如:类名 对象名=new 类名(实参表);可以将上面的例子改写成如“Student stu=new Student(“张三”);”。4.2 包包是Java语言的重要特性,有时也称为类库。Java语言本身就提供了大量的包,例如, java.lang
37、包提供了java语言程序设计基础的类和接口。实际上,包是一个命名空间,是用于管理组织功能相近的类和接口的集合。接口的概念将在第5章中详细介绍。为了帮助管理功能不同的文件,如方便查找和使用数据类型,程序员把一组相关的类型组合成包。达到将大量的文件以目录树的形式进行管理的目的。Java语言提供这种便利。4.2.1 包的创建1创建包的格式package 包名;Java语言中用关键字package来创建一个指定包名的包。创建包的语句必须是定义类文件中第一个无注释语句。除了注释语句之外,其他语句不可以出现在创建包语句之前。例如: package mytools.pen; /创建一个包public cla
38、ss Pen /定义类Pen public double leadRadius=0.7; public String color=; public Pen() public Pen(double _leadRadius,String _color) leadRadius=_leadRadius; color=_color; public void showAttributions() System.out.println(笔心标准:+leadRadius); System.out.println(笔的颜色:); 上述例子是为了说明创建包的格式。在现实应用中完全没有必要对一个简单的程序代码进行包
39、的创建。可以基于如下的考虑包的创建:1)编写大量的文件是相关联的,如Sun公司开发的javax.swing工具包,提供大量的轻量级图形界面组件的支持的类和接口。对这些相关的文件可以创建包进行管理;2)在图形处理的文件日益成为软件开发的一个不可缺少的前提下,为方便查找和应用自定义图形处理的类,可以创建包;3)创建自定义的包以避免和其他包产生命名冲突。例如,Sun公司开发的java.util.Date是实用工具包java.util的一个常用的类,为了避免和java.util.Date产生命名冲突,用户自定义的Date类可以放入到一个新的命名空间,即其他包中,如创建mytools.pen包;4)有时
40、为了让一些文件可以相互访问,而对这文件集合之外的文件是不可见的。此时,可以为该文件集合创建一个包进行访问。2 包名的命名约定值得注意的是包名是独一无二的,不能和其他包名重复,否则会产生命名冲突。假如用户开发了一个和Java语言中同名的java.util包,在导入使用java.util包时必将产生问题,编译器会无法判断是使用用户自定义的java.util包还是Java语言提供的java.util包,这种情况就是命名冲突。可是世界上存在大量的由不同程序员开发的Java类文件和接口文件,如何避免命名冲突是程序员必须注意的问题。为了解决命名冲突问题,Java语言对包名的命名有明确约定:1) Java语
41、言规定包名用小写字母表示。如果包名由多个英文单词构成,这些单词也必须是小写的。这样就使得包名和类名、接口名有了明显的不同。例如,java.util是包名,而Date代表一个类名。2) 一般企业会用公司的Internet域名的反向作为包名。因为企业的Internet域名是不同的。假设企业的Internet域名是.region(公司名.com后缀.地域),就可以用.somecorporation作为该公司开发文件的包名。例如,域名为的雅虎中国分公司就可以用.yahoo作为包名。3) 如果企业采用不规范的名
42、称作为Internet域名,在创建包名时,要修改名称。具体情况见表4-2。表4-2 不规范包名规定域名包名处理例子域名出现关键字关键字前加下划线域名写成包名com._char域名出现数字数字前加下划线域名7写成包名com._7char域名出现“-”符号将符号“-”改写为下划线域名写成包名com.char_char3 包名的解析为了让将带有package创建包的语句的java文件进行正确的编译。可采用编译命令如下:javac d . java文件名这时,package语句可以解析成为机器上的一个目录。生成的class类会放置在由packa
43、ge语句在当前目录下生成的目录内。例如,将上面的Pen.java程序保存在当前目录D:chen中,假设该当前目录D:chen已设置在操作系统中的CLASSPATH环境变量(CLASSPATH环境变量的设置见第1.4.1节)中,编译该java文件后会发现生成的类Pen.class放置在D:chenmytoolspen目录下,而.mytoolspen就是由package语句所生成的。4.2.2 包的应用为了使用指定包中的某些类和接口,需要将包导入到程序中,在Java语言中用关键字import实现将包或包中的类或甚至将包中的类的静态成员导入到程序中。在具体应用的时候,要考虑三种格式:(1)直接导入包
44、中类,可以通过语句如下语句格式来实现:import 包名.类名;(2)要求导入包中所有的类,可以通过下列语句格式来实现:import 包名.*;(3)在JDK 5.0中,import语句不仅可以导入类,还可以导入类的静态成员(包括数据成员和成员方法),这称为静态导入。可以通过下列语句格式来实现:“import 包名.类名.*;”。通过静态导入,程序中可以直接访问类的静态成员。而不需要添加类名。例如:import java.lang.Math.*;/导入类Math的所有静态成员则可以直接使用类Math的所有静态成员,如:sqrt(pow(4,2)+pow(5,3); /直接使用了Math.sqr
45、t()和Math.pow()这两个静态成员方法例4.5 设计一个PenTest测试主类,将上述类Pen的属性用信息对话框方式输出。import mytools.pen.Pen;. /导入类Penimport javax.swing.*; /导入包javax.swingpublic class PenTestpublic static void main(String args)Pen pen=new Pen(0.5,红色);String str;str=笔心的半径:+pen.leadRadius+n笔的颜色:+pen.color;JOptionPane.showMessageDialog(nu
46、ll,str);System.exit(0);图4-5 例4.5的运行结果当导入的类第一次创建一个对象时候,编译器会在适当的目录中查找相应的类文件,假设创建类Pen的对象,就需要查找Pen.class。如果在相同的目录中没有找到Pen.class文件,或找到Pen.class但Pen.java文件发生修改(编译器通过比较新旧两个文件的时间标签来确认),编译器就会自动编译Pen.java文件,生成新的Pen.class文件。这种情况称为自动编译。此外有一种情况必须引起注意。如果一个程序中导入的两个包中具有同名的类,编译器无法识别该选用哪个类,会引起冲突。为了解决冲突,可以通过类的完整名具体引用,
47、如:java.util.Date date=new java.util.Date();4.3 构造方法 构造方法就是对象的构造器,专门用于对象的创建和初始化工作。在这一节中将要讨论在Java语言中构造方法的应用和一些常见的性质。4.3.1 构造方法的定义在4.1.5节中曾讨论可以通过调用构造方法来实现对象的初始化。 实际上,构造方法实际上是一种用于对象初始化的特殊的方法,它必须和类名同名,并没有返回值,值得注意的是构造方法和返回值为空的方法是有区别的。返回值为空的方法,实际上用void作为它的返回值,只是该返回值的含义为空。例4.6 定义一个构造方法和返回值为空的示例程序。 public cl
48、ass ConstructorExample1 /定义类ConstructorExample1 public ConstructorExample1() /定义默认构造方法 System.out.println(构造方法); public void ConstructorExample1() /定义返回值为空的方法ConstructorExample1() System.out.println(void 方法); System.out.println(结束); public static void main(String args) /定义主方法 ConstructorExample1 ce=
49、new ConstructorExample1();ce.ConstructorExample1(); System.exit(0);从例4.6中可以观察到,尽管程序中的两个ConstructorExample1()方法同名,但具有不同的含义,前者是构造方法,后者是返回值为空的方法。程序先调用构造方法对对象ce进行初始化,然后在通过ce这一对象调用方法ConstructorExample1(),运行结果正反映了这样的运行过程,见图4-6。图4-6 例4.6的运行结果构造方法具有自己的特点:(1) 构造方法的命名不符合方法的命名规则,它和类名同名,并没有返回值;(2) 成员方法的非访问控制符,如
50、final、static、abstract、native和synchronize等关键字不修饰构造方法;因为这些关键字修饰构造方法无意义;(3) 一般,构造方法由用户自定义,如果用户没有定义构造方法,系统会自动提供一个默认无参构造方法,来实现对对象的初始化工作;具体介绍见4.3.2;(4) 用户可以定义多个带有不同参数的构造方法,这种现象称为重载构造方法。关于构造方法的重载,具体见4.3.3。通过构造方法的重载可以实现对象的不同初始化;(5) 构造方法是通过new操作符来实现方法的调用,而不是象其他方法一样显式调用。4.3.2 默认构造方法默认构造方法就是无参的构造方法。如前述,当用户没有定义构造方法的时候,系统会自动定义一个默认构造方法。当通过new操作符来调用该默认构造方法初始化对象时,实际上,是调用该类父类的无参构造方法。如果所定义类没有明确说明父类,那么,它将是java.lang.Object类的子类。例4.7使用默认构造方法的一个示例。public class Super
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电解铜联营协议合同范本
- 合作协议可以签几家合同
- 2025贵州盘州市淤泥乡卫生院村医招聘备考题库及答案解析
- 2025广东汕头市潮阳区金浦街道乡村公益性岗位招聘笔试备考题库及答案解析
- 2025贵州贵阳市观山湖区金华小学秋季学期招聘临聘教师备考题库及答案解析
- 关于检测照明合同范本
- 2025广西南宁市青秀区新竹街道办事处招聘3人(劳务派遣)笔试备考题库及答案解析
- 婚庆店铺转让合同范本
- 白酒地方销售合同范本
- 运动损伤早期识别-洞察及研究
- MATLAB 应用全套课件
- 双侧壁导坑施工工法
- 单片机原理及应用课件
- 低压出线柜安装施工方案
- 持续质量改进在中长导管护理中的应用及并发症的预防
- 新建砖砌台阶施工方案
- 拆除围墙砖石结构施工方案
- 2023山东济南市长清区教体系统所属事业单位招聘22人(共500题含答案解析)笔试历年难、易错考点试题含答案附详解
- 故宫宫廷文化公司介绍
- 地理学科核心素养与地理学经典思想精简版
- 北京大学情报学考研真题汇总
评论
0/150
提交评论