第6章类和对象

本文介绍了面向对象编程的基本概念,包括对象、类的定义,封装、继承和多态的特性。对象是具有属性和行为的实体,类是封装这些属性和行为的载体。封装隐藏了对象的实现细节,继承则允许复用和扩展已有类的功能。多态使得父类引用可以操作子类对象,提供了一种统一的编程方式。此外,文章还涉及了Java中的构造方法、成员变量、局部变量、静态变量和方法,以及对象的生命周期和垃圾回收机制。
摘要由CSDN通过智能技术生成

6.1面向对象概述

在程序开发初期,人们使用结构化开发语言。随着软件的规模越来越庞大,结构化语言的弊端也逐渐暴露出来,开发周期越来越长,产品的质量也不尽如人意。这时人们开始将另一种开发思想引入程序中,即面向对象的开发思想。面向对象思想是人类最自然的一种思考方式,它将所有预处理的问题抽象为对象,通过了解这些对象具有哪些相应的属性以及展示这些对象的行为,以解决这些对象面临的一些实际问题。在程序开发中引入面向对象设计的概念,其实质上就是对现实世界中的对象进行建模操作。

6.1.1对象

现实世界中,随处可见的一种事物就是对象。对象是事物存在的实体,如人、书桌、计算机、高大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即静态部分与动态部分。顾名思义,静态部分就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,其属性包括高矮、胖瘦、

的载体,它定 性别、年龄等。动态部分即对象可执行的动作,这部分称为“行为”,也是一个值得探讨的部分,同样

对于一个人,其可以哭泣、微笑、说话、行走,这些都是这个人具备的行为。人类通过探讨对象的属

类的各种方 性和观察对象的行为来了解对象。

在计算机的世界中,面向对象程序设计的思想要以对象来思考问题,首先要将现实世界的实体抽象为对象,然后考虑这个对象具备的属性和行为。例如,现在面临一只大雁要从北方飞往南方这样一个实际问题,试着以面向对象的思想来解决这一实际问题。

(1)从这一问题中抽象出对象,这里抽象出的对象为大雁

(2)识别这个对象的属性。对象具备的属性都是静态属性,如大雁有一对翅膀,黑色的羽毛等。

(3)识别这个对象的动态行为,即这只大雁可以进行的动作,如飞行,觅食等,这些行为都是这个对象基于其属性而具有的动作。

(4)识别出这个对象的属性和行为后,这个对象就被定义完成了。然后可以根据这只大雁具有的特性制定这只大雁从北方飞向南方的具体方案。

6.1.2类

不能将一个事物描述成一类事物,如一只鸟不能成为鸟类。但如果要给某一类事物一个统称,就需要用到类这个概念。

6.1.3封装

面向对象程序设计具有以下特点:封装性、继承性和多态性。

封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。例如,用户使用计算机时,只需要使用手指敲击键盘就可以实现一些功能,无须知道计算机内部是如何工作的。即使知道计算机的工作原理,但在使用计算机时也并不完全依赖于计算机工作原理等细节。

6.1.4继承

类与类之间同样具有关系,这种关系被称为关联。关联主要描述两个类之间的一般二元关系。例如,一个百货公司类与销售员类就是一个关联,学生类与教师类也是一个关联。两个类之间的关系有很多种,继承是关联中的一种。

当处理一个问题时,可以将一些有用的类保留下来,在遇到同样的问题时拿来复用。假如这时需要解决信鸽送信的问题,我们会想到之前说的图里的鸟类。

继承性主要利用特定对象之间的共有属性。

6.1.5多态

继承,父类和子类,其实将父类对象应用于子类的特征就是多态。简单地调用父类也就是图形类绘制图的方法即可绘制任何图形,这就是多态最基本的思想。

多态性允许以统一的风格编写程序,以处理种类繁多的已存在的类及相关类。提到多态,就不得不提抽象类和接口,因为多态的实现并不依赖于具体类,而是依赖于抽象类和接口。

在多态的机制中,比抽象类更方便的方式是将抽象类定义为接口。由抽象方法组成的集合就是接口。

6.2类

类是封装对象的属性和行为的载体。

6.2.1成员变量

对象的属性也称为成员变量,成员变量可以是任意类型,整个类中均是成员变量作用范围使用成员方法对应于类对象的行为。以刚刚那个类为例,它包含getName()和setName()两个方法。例6.1

6.2.2成员方法

使用成员方法对应于类对象的行为。以刚刚那个类为例,它包含getName()和setName()两个方法,格式如下

权限修饰符 返回值类型 方法名(参数类型 参数名){

... //方法体

return 返回值;

}

一个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和不返回任何值的选择,如果方法需要返回值,可以在方法体中使用return关键字,使用这个关键字后,方法的执行将被终止。

6.2.3权限修饰符

Java中的权限修饰符主要包括private(私有的)、public(共有的)、protected(受保护的)、default(默认)

6.2.4局部变量

6.2.2中讲述了成员方法,如果在成员方法内定义一个变量,那么这个变量被称为局部变量。实际上方法中的形参也可作为一个局部变量。例6.1的book类中定义setname(string name)方法,string name这个形参就被看做是局部变量。局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作后被初始化,否则会出现编译错误。例6.2

6.2.5局部变量的有效范围

可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止。下图描述了局部变量的作用范围。

在相互不嵌套的作用域中可以同时声明两个名称和类型相同的局部变量。

但是在相互嵌套的区域中不可以这样声明,如果将局部变量id在方法体的for循环中再次定义,编译器将会报错。

6.2.6this关键字

this关键字用于表示本类当前的对象,当前对象不是某个new出来的实体对象,而是当前正在编辑的类。this关键字只能在本类中使用。

6.3类的构造方法

在类中,除了成员方法外,还存在一种特殊类型方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。

构造方法的特点如下:

1构造方法没有返回值

2构造方法的名称要与本类的名称相同

构造方法的定义语法格式如下

public book(){

... //构造方法体

}

public:构造方法修饰符

book:构造方法的名称

在构造方法中可以为成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。例6.3

6.4静态变量和静态方法

在介绍静态变量和静态方法之前,首先需要要介绍static关键字,因为由static修饰的变量和方法被称为静态变量和静态方法

静态变量和静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着public,private和protected修饰符的约束。

6.5类的主方法

主方法是类的入口点,它定义了程序从何处开始,主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。

6.6对象

Java是一门面向对象的程序设计语言,对象是由类实例化而来的,所有问题都通过对象来处理,对象可以通过操作类的属性和方法来解决相应的问题,所以了解对象的产生、操作和消亡是十分必要的。

6.6.1对象的创建

在6.1节讲解过对象,对象可以认为是在一类事物中抽象出某一个特例,可以通过这个特例来处理这类事物出现的问题。在Java语言中,通过new操作符来创建对象。前文在讲解构造方法时介绍过,每实例化一个对象就会自动调用就会自动调用一次构造方法,实质上这个过程就是创建对象的过程。准确说,可以在Java语言中使用new操作符调用构造方法创建对象。语法如下:

Test test =new Test();

Test test =new Test("a");

设置值 描述 设置值 描述

Test 类名 new 创建对象操作符

test 创建Test类对象 “a” 构造方法的参数

test对象被创建出来时,就是一个对象的引用,这个引用在内容中为对象分配了存储空间。6.3节介绍过,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法。也就是说,在Java语言中,初始化与创建时被捆绑在一起的。

每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由Java虚拟机自带的垃圾回收机制处理,不能再被使用(对于垃圾回收机制的知识将在6.6.4节中进行讲解)

6.6.2访问对象的属性和行为

用户使用new操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。前文已经提到过,对象的属性和行为在类中是通过类的成员变量和成员方法的形式来表示的,所以当对象获取类成员时,也相应地获取了对象的属性和行为。

6.6.3对象的引用

在Java语言中,尽管一切都可以看作对象,但真正的操作标识符实质上是一个引用,那么引用在Java中是如何体现的呢?语法如下:

类名 对象的引用变量

例如,一个people类的引用可以使用以下代码:

people tom;

通常一个引用不一定需要有一个对象相关联。引用与对象相关联的语法如下:

people tom=new people();

在上述代码中含义如下

people(类名) tom(引用)=new people(对象的实体);

实际上真正的对象是new people()这段代码。为了方便开发者保存、调用对象,于是创建了一个people类型、名叫tom的引用变量。

实际上,tom只是一段内存地址,用于标记“new people()”对象在内存中的位置。因为内存地址又长又乱,很难让人记住,所以Java语言利用引用变量帮开发者标记内存地址。开发者只要记住引用变量的名字,就能够在内存里找到对象数据。简单地说tom是new people()的“代理人”,那么“new people()"对象能做的事,tom也能做到。例如下面这段代码:

new people().getclass();

等价于:

people tom=new people();

tom getclass();

6.6.4对象的销毁

每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址需要被回收。在其他语言中,需要用户手动回收废弃的对象。Java拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器会自动回收无用却占用内存的资源。

在学习立即回收机制之前,读者首先需要了解何种对象会被Java虚拟机视为”垃圾“。主要包括以下两个情况:

1.对象引用超过其作用范围,这个对象将被视为垃圾,比如

Example e =new Example();

这里的对象e超过其作用范围,将消亡

2.将对象赋值为null,如

Example e=new Example();

e =null;

当对象被赋值null值时,将消亡

虽然Java的垃圾回收机制已经很完善,但垃圾回收器只能回收那些由new操作符创建的对象。某些对象不是通过new操作符在内存中获取空间的,这种对象无法被垃圾回收机制所识别。在Java中,提供了一个finalize()的方法,这个方法时object类的方法,它被声明为protected,用户可以在自己的类中定义这个方法。如果用户在类中定义了finalize()方法,在立即回收时会首先调用该方法,在下一次垃圾回收动作发生时,才真正回收被对象占用的内存。

需要明确的时,垃圾回收或finalize()方法并不保证一定会发生。如果Java虚拟机内存消耗殆尽,它将不会执行垃圾回收处理

由于垃圾回收不受人为控制,具体执行时间也不确定,所以finalize()方法也就无法执行。为此,Java提供了System.gc()方法来强制启动垃圾回收器,这与给120打电话通知医院来救护病人的道理一样,主动告知垃圾回收器来进行清理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值