4.1 “用户类的设计”实例
【实例目的】
(1)掌握面向对象的基本概念。
(2)掌握类的定义和使用。
(3)掌握对象的创建和使用。
【实例内容】
采用面向对象编程的方式,通过Java语言编写一个用户类,测试创建admin管理员账户,并打印出设置的管理员账户和密码。
【技术要点】
(1)设计用户类,首先需要设置用户类的成员变量,接着设计该类的构造方法,然后设计该类的成员方法。用户类包含三个成员变量,用户名、用户密码和用户类型。
(2)打开Eclipse软件,创建一个名为firstApp的Java工程。然后在该工程src目录中新建一个名为User的class文件,输入源代码,如图4.1所示。
图4.1 User类的源代码
(3)运行User类,在控制台显示程序结果,如图4.2所示。
图4.2 Console控制台的输出结果
【相关知识及注意事项】
4.1.1 面向对象的基本概念
1.理解面向对象
面向对象程序设计是将人们在认识世界的过程中普遍采用的思维方法应用到程序设计中。对象是现实世界中存在的事物,它们是有形的,如某个人、某种物品;也可以是无形的,如某项计划、某次商业交易。对象是构成现实世界的一个独立单位,人们对世界的认识,是从分析对象的特征入手的。
对象的特征分为静态特征和动态特征两种。静态的特征指对象的外观、性质、属性等;动态的特征指对象具有的功能、行为等。客观事物是错综复杂的,但人们总是从某一目的出发,运用抽象分析的能力,从众多的特征中抽取最具代表性、最能反映对象本质的若干特征加以详细研究。
人们将对象的静态特征抽象为属性,用数据来描述,在Java语言中称之为变量;人们将对象的动态特征抽象为行为,用一组代码来表示,完成对数据的操作,在Java语言中称之为方法。一个对象由一组属性和一组对属性进行操作的方法构成。
2.对象和类
不同的物体可能有相同的特征,如两个人都有人的特征,两辆汽车都有汽车的特征等。把一类对象的共性抽象出来,形成一个模型就是类。所以类是一组具有相同特性的对象的抽象化模型。例如,所有的人具有相同的特征,可以抽象化为“人”类,我们每一个具体的人,就是“人”类中的一个实例,即一个对象。
类和对象的关系可以这样理解:把具有相同特征的对象(包括属性和行为)进行抽象化就是类;把类实例化就是对象。简单地说,对象是表示现实世界中某个具体的事物,类是对对象的抽象描述,如图4.3所示。
图4.3 类与对象的关系
类是一个抽象的概念,要利用类的方式来解决问题,必须用类创建一个实例化的具体对象,然后通过对象去访问类的成员变量,去调用类的成员方法来实现程序的功能。这如同“汽车”本身是一个抽象的概念,只有使用了一辆具体的汽车,才能感受到汽车的功能。
3.面向对象的特点
(1)封装性
封装是指把类的基本成分(包括数据和方法)封装在类体之中,使类与外界分隔开。封装性减少了程序各部分之间的依赖性,降低了程序的复杂性,由于隐藏了其内部信息的细节,使内部信息不易受到破坏,安全性有了保证,同时也为外界访问提供了简单方便的界面。
(2)继承性
面向对象程序设计的类也具有“继承”的特性,如果在软件开发中已经建立了一个名为A的类,又想建立一个名为B的类,而后者与前者内容基本相同,只是在前者的基础上增加一些属性和行为,显然不必再从头设计一个新类,而只需在类A的基础上增加一些新内容即可。这就是面向对象程序设计中的继承机制。这种继承的特性能让用户在开发程序时不必从零开始,只要继承现有的类,再新增功能就能产生新的类,这样一来就会大大节省程序开发时间,提高程序开发的效率。
(3)多态性
多态性是指一个类中不同的方法具有相同的名字。其通过方法“重载”和方法“覆盖”实现多态性。方法重载指多个方法具有相同的名字,但参数的个数或类型不同,调用重载方法时,根据传递的参数个数和类型决定调用哪一个方法;方法覆盖指在继承过程中,子类重新定义父类的方法,实现于类中所需要的功能。利用多态性对一些方法只需定义其方法体,不再取新的名字。多态使程序具有良好的可扩展性,并使程序易于编写维护、易于理解。
4.面向对象程序设计语言的优势
面向对象程序设计语言的优势之一是代码重用,主要体现在如下几点:
(1)由于采用大量可重用的类库,提高开发效率,缩短了开发周期,降低了开发成本。
(2)由于采用了已经被证明为正确、有效的类库,提高了程序代码的可靠性,减少了程序的维护工作量。
(3)提高了程序的标准化程度。
4.1.2 类的定义
类是一种用户自己定义的数据类型,它封装了对象的属性和方法,一旦定义后,就可以用这种新类型来创建该类型的对象。这样,类就是对象的模板,而对象就是类的一个实例。事实上一个对象就是一个类的实例。
1.类的声明
声明一个类的基本格式如下:
其中:
(1)类的修饰符用来说明类的特殊性质。主要分为四种类型的修饰符:访问控制类的修饰符、抽象类说明符、最终类的说明符、内部类的说明符。
(2)其中关键字class引导一个类的声明,类名是一个标识符,一般要求单词首字母大写。类的成员变量用于存储对象的属性,方法用于描述对象的行为。类中不能有独立的执行代码,所有的执行代码只能出现在方法中。
2.成员变量
从类的定义中知道,类体分为两部分:成员变量和方法的定义。成员变量定义的一般语法格式为:
[修饰符] 数据类型 变量名 列表[=初值];
其中:
(1)修饰符是可选项,说明了变量的访问权限和某些规则。
(2)数据类型确定了变量的取值范围以及对变量所能进行的操作,关于变量类型可以是基本数据类型,也可以是引用数据类型。
(3)变量列表由一个或多个变量名组成。当要定义多个变量时,各变量之间用逗号分隔。
(4)初值是可选项,变量可以在定义的同时赋初值,也可以先定义,在后续程序中赋初值。
【例4-1】 下列代码定义了一个人类,包含人的姓名和年龄。
程序说明:
(1)程序首先用class声明了一个名为Person的类,这里Person是类的名称。
(2)在第2、3行的代码中声明了两个成员变量name和age,name为String字符串类型,age为int整型。
(3)在第4~7行,声明了一个talk方法,用于向屏幕打印信息。
4.1.3 对象的创建和使用
1.对象的创建
要使用Java类中的属性和方法,必须创建类对象,然后通过类对象来引用类的成员变量和方法。创建对象包括声明对象和为对象分配内存两部分,其格式为:
(1)对象声明的格式
类名 对象名;
类名指已经定义好的类的名字。
对象名指生成的某个类对象的名字,必须是Java中的合法的标识符。
例如声明类Person的对象obj,其代码为:
Person obj;
(2)对象的实例化
使用new运算符和类的构造方法为声明的对象分配内存,也称为实例化对象。如果类中没有构造方法,系统会调用默认的构造方法(默认的构造方法是不带任何参数的)。例如:
obj=new Person();
对于上述的两个步骤可以用一条语句实现,如创建上例中的obj对象,可用如下的代码:
Person obj=new Person(); //声明对象obj的同时为其分配内存,实例化对象obj
2.对象的使用
对象实例化后就可以实现对象的使用。对象使用是由对象通过运算符,对引用的实例成员变量和方法的访问。通过对象对变量和方法的访问,实现了对象的行动。由成员访问权限修饰符限定,允许或禁止对象对它的访问。
引用成员变量的形式如下:
对象名.成员变量名
引用成员方法的形式如下:
对象名.成员方法名(参数表)
例如,创建了Person类的对象obj之后,就可以按照以下方式引用其成员变量:
obj.name="张三";
obj.age=23;
可以按照以下方式调用其成员方法:
obj.talk();
【例4-2】 下面的程序定义了一个类,演示了对象的使用方法。
编译运行程序:
javac Person.java
java Person
运行结果为:
姓名:张三 年龄:23
姓名:李四 年龄:21
其中,上面的类中定义了Person类,类中包含了成员变量name和age,成员方法talk()。在main()方法中使用new关键字实例化两个对象per1和per2。分别给每个对象的成员变量name和age赋值,调用talk方法显示个人信息。
4.1.4 对象的销毁
Java程序运行时系统通过垃圾收集机制,周期性地释放不再被对象引用所占用的内存,完成对象的清除。Java的垃圾收集器自动扫描对象的动态内存区,对被引用的对象加标记,然后把未被引用的对象作为垃圾收集起来并释放。
在确保对象不会遗留任何需保存的信息后,java的内存垃圾清理程序就可以处理了。当对象不再引用,或当前的代码段不属于对象的作用域,或者把对象的引用赋值为NULL,该对象就成为一个无用的对象。
垃圾收集在Java程序的生命周期中自动进行,它解除了取消分配存储器的要求,免了存储器漏洞。
Java在对象作为垃圾被收集前,自动调用finalize()方法,清除自己所占用的资源。如果需要主动释放对象,或者在释放对象时需要执行特定操作,则在类中可以定义finalize()方法。该方法声明的格式以下: