6.1面向对象概述
c语言是一种结构化的,Java是一种面向对象的
随着软件的规模越来越大,结构化语言的弊端也逐渐暴露出来,开发周期长,结果也不尽如人意。这时Java语言变应运而生,也就是面向对象的开发思想。
6.1.1对象
什么是对象?现实世界中,随处可见的一种事物就是对象.对象是事物存在的实体,如人、书桌、计算机、高楼大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常分为静态部分和动态部分。
动态属性,静态属性。顾名思义,静态部分就是不能动的部分,这个部分称为属性这个属性包括人的高矮胖瘦,性别年龄,而动态属性就是对象可执行的动作,包括人的哭泣,微笑,说话,行走。
世界万物皆对象
(1)从这一问题中抽象出对象,这里抽象出的对象为大雁。
(2)识别这个对象的属性。对象具备的属性都是静态属性,如大雁有一对翅膀、黑色的羽毛等。
(3)识别这个对象的动态行为,也就是这只大雁可以进行的动作,如飞行、觅食等,这些行为都是这个对象基于其属性而具有的动作。
(4)识别出这个对象的属性和行为后,这个对象就被定义完成了。然后可以根据这只大雁具有的特性制定这只大雁从北方飞向南方的具体方案解决问题。
6.1.2类
类包含静态属性和动态属性,类就是对象的设计图
不能将一个事物描述成一类事物,如一只鸟不能统称为鸟类。但如果要给某一类事物一个统称,需要用到类这个概念。
类是封装对象的属性和行为的载体,反过来说,具有相同属性和行为的一类实体被称为类。例如,鸟类封装了所有鸟的共同属性和应有的行为,如上图所示。
定义完鸟类之后,可以根据这个类抽象出一个实体对象,最后通过实体对象来解决相关的实际问题。
在Java语言中,类对象的行为是以方法的形式的,对象的属性是以成员变量的形式定义的,所以类包括对象的属性和方法。
6.1.3封装
面向对象程序设计具有以下特点:封装性、继承性和多态性。
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。例如,用户使用计算机时,只需要使用手指敲击键盘就可以实现一些功能,无须知道计算机内部是怎样工作的。即使知道计算机的工作原理,但在使用计算机时也并不完全依赖于计算机工作原理等细节。
采用封装的思想保证了类内部数据结构的完整性,使用类的用户不能轻易地直接操作类的数据结构,只能执行类允许公开的数据。这样避免了外部操作对内部数据的影响,提高了程序的可维护性。
类是封装对象的属性和行为的载体,反过来说,具有相同属性和行为的一类实体被称为类。例如,鸟类封装了所有鸟的共同属性和应有的行为,如上图所示。
定义完鸟类之后,可以根据这个类抽象出一个实体对象,最后通过实体对象来解决相关的实际问题。
在Java语言中,类对象的行为是以方法的形式的,对象的属性是以成员变量的形式定义的,所以类包括对象的属性和方法。
6.1.3封装
面向对象程序设计具有以下特点:封装性、继承性和多态性。
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。例如,用户使用计算机时,只需要使用手指敲击键盘就可以实现一些功能,无须知道计算机内部是怎样工作的。即使知道计算机的工作原理,但在使用计算机时也并不完全依赖于计算机工作原理等细节。
采用封装的思想保证了类内部数据结构的完整性,使用类的用户不能轻易地直接操作类的数据结构,只能执行类允许公开的数据。这样避免了外部操作对内部数据的影响,提高了程序的可维护性。
6.2.1成员变量
对象的属性也称为成员变量,成员变量可以是任意类型,整个类中均是成员变量作用范围。下面通过一个实例来演示
在上面的实例可以看出,在Java语言中需要用class关键字来定义类,课本实例内容 是它的类名称。同时在这个类中定义了一个成员变量,成员变量的类型为String类型。成员变量就是普通的变量,可以为她设置初始值,也可以不设置初始值。如果不设置初始值,则会有默认值。要注意成员变量前面修饰的关键字。
6.2.2成员方法
使用成员方法对应于类对象的行为。以刚刚那个类为例,它包含getName()和setName()两个方法,格式如下
权限修饰符 返回值类型 方法名(参数类型 参数名){
... //方法体
return 返回值;
}
一个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和不返回任何值的选择,如果方法需要返回值,可以在方法体中使用return关键字,使用这个关键字后,方法的执行将被终止。
6.2.3权限修饰符
Java中的权限修饰符主要包括private(私有的)、public(共有的)、protected(受保护的)、default(默认),这些修饰符控制着对类和类的成员变量以及成员方法的询问,权限如下表
6.2.4局部变量
6.2.2中讲述了成员方法,如果在成员方法内定义一个变量,那么这个变量被称为局部变量
6.2.5局部变量的有效范围
可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止,但是在互相不嵌套时作用域可以同时声明两个名称和类型相同的局部变量,在互相嵌套时不能这样。看课本上的图片
6.2.6 this关键字
this关键字用于表示本类当前的对象,当前对象不是某个new出来的实体对象,而是当前正在编辑的类。this关键字只能在本类中使用。
6.3类的构造方法
在类中,除了成员方法外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。
构造方法有两个特点1.没有返回值 2.构造方法的名称要与本类的名称相同。
构造方法的定义语法格式如下:
public Book(){
... //构造方法体
}
public:构造方法修饰符。
Book:构造方法的名称。
6.4静态变量和静态方法
在介绍静态变量和静态方法之前,首先需要介绍static关键字,因为由static修饰的变量和方法被称为静态变量和静态方法。
static(静态),这个词可以修饰函数,方法,变量,属性等,被声明为static的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员。
6.4静态变量和静态方法
在介绍静态变量和静态方法之前,首先需要介绍static关键字,因为由static修饰的变量和方法被称为静态变量和静态方法。
static(静态),这个词可以修饰函数,方法,变量,属性等,被声明为static的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员。
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.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打电话通知医院来救护病人的道理一样,主动告知垃圾回收器来进行清理。