面向对象的基本思想

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面向对象的基础思想

1 类与对象(重点)

1.1类与对象的基本关系

类与对象是整个面向对象概念之中的最为重要的组成部分。

类:类是对整个现实世界的一种合理的抽象,是一种共性的产物,在类之中主要有两个组成部分:属性(变量)、行为(方法);

对象:是一个具体的,可以使用的产物,是一种个性的表示。

实际上类中规定了一个对象的具体行为,而对象是一个类的具体表现。类只有通过对象才可以使用,所以在开发之中一定要先有类之后再定义对象。

但是一个类产生之后就好比汽车的设计图纸那样,本身并不能直接使用,必须按照图纸生产出具体的汽车之后才可以开,所以需要对象,而对象定义格式如下:

格式一:声明并实例化对象

格式二:分步完成

通过以上的格式可以发现,依然存在了关键字new,所以这一操作也一定表示要开辟堆内存空间,同时需要注意的是,当一个对象开辟空间之后可以按照如下的两个方式来操作类中的内容:

·操作类中的属性:对象.属性;

·操作类中的方法:对象.方法();

范例:声明并实例化对象

但是类本身属于引用数据类型,所以以上的程序依然要牵扯到内存的划分,同样使用两块内存:·堆内存:保存的是每一个对象所具备的属性;

·栈内存:保存的是一块堆内存的使用地址,可以简单理解为对象名称。

1.2浅深入引用传递

清楚了以上的内存关系之后,下面再来对另外一个类似的程序进行观察。如果说现在同时产生了两个

只要发现了关键字new,那么一定表示要开辟的是一块新的内存空间,每一块堆内存空间都有一个栈内存指向它。

范例:观察如下程序

发现现在一个per对象没有进行实例化的操作,这个时候程序编译没有任何的语法错误,但是程序执行的时候出现了以下的错误提示:

现在给出的是“NullPointerException”,表示空指向异常。此异常肯定会伴随你的开发人生走完的那一刻,此异常只有在引用数据类型操作的时候才会出现。NullPointerException更准确的讲法是指使用只声明而未开辟空间的引用类型所造成的问题,所以为了区分此概念,以后对于对象而言,在操作上就会给出两个不同的名词:

·声明对象:只开辟了栈内存空间的对象,无法直接使用;

·实例化对象:有了对应的堆内存空间指向,可以使用;

以上的分析流程和数组是完全一样的,因为数组也属于引用数据类型,在数组学习的时候强调过,所谓的引用传递实际上指的就是一块堆内存空间可以同时被多个栈内存所指向的操作,那么对于类也是一样的,引用传递指的是一块堆内存同时被不同的对象(不同的栈)所指向。

范例:观察引用传递

}

范例:分析以下的程序运行

}

所谓的垃圾空间实际上就是指的没有任何的栈内存指向的堆内存空间,所有的垃圾空间要等待JVM不定期的进行垃圾回收(GC),以释放内存空间,不过虽然有了所谓的垃圾回收机制,从实际的开发来讲,应该尽量的去避免垃圾的产生。

2 封装性的基本实现(重点)

封装性是作为面向对象第一大特征,但是需要提醒的是,本次所讲解的封装性只是针对于一种基本的实现,而Java之中的封装性是与权限有关的。

在真正的去研究封装操作之前,首先来观察这样的一个程序:

这个时候程序依然可以执行,因为在int的数据范围之中本身就包含了负数,所以从技术上来讲,本程序没有任何的问题,但是从实际生活这样也完全不靠谱,所以这个时候按照开发的术语来讲是业务上有问题了。

而造成这一问题的本质在于属性没有经过任何的检查,并且可以在类的外部直接操作,所以要想解决问题,就必须让属性对外部不可见,可以使用private进行属性的定义。

现在给出的提示是name和age两个属性在Person类之中是属于私有的访问,所以类的外部无法使用,即:使用private定义的内容只能在当前类中起作用。

而当属性使用了private封装之后,按照Java EE的标准来讲,此时就必须使用如下的方法格式进行属性的操作,以name属性为例,现在已经使用了private封装:

·设置属性内容(setter):public void set N ame(String n); setter要检查

以后只要是类中的属性都必须使用private封装,封装之后的属性一定要使用setter、getter设置和取得。

3 构造方法(重点)

现在可以对以上的格式分析一下:“类名称对象名称”,这个操作意味着声明一个指定类型的对象。而后new表示要开辟一个新的堆内存空间,但是在最后有一个“类名称()”,一旦操作后面有“()”表示的是一个方法,那这个就是构造方法,所以对于构造方法在之前一直在使用。

范例:观察构造

在一个类之中,构造方法的定义要求如下:

·构造方法的名称和类的名称要求完全一样,如果class Person,则构造:Person();

每当使用关键字new实例化新的对象时,构造方法都要被调用,但是这个时候也出现一个问题了,在之前貌似没有编写过构造方法,那么为什么之前没有错呢?

为了保证每一个类操作的方便,所以如果在一个类之中没有明确的定义一个构造方法的话,则会在编译的时候自动的生成一个无参的,什么都不做的构造方法:

结论:在一个类之中至少存在一个构造方法,如果一个类之中已经明确定义一个构造的话,则无参的什么都不做的构造方法将不会再自动生成了。

构造方法的基本概念介绍完了,但是构造方法有什么用呢?在之前所进行的操作可以发现是按照如下的流程:

·实例化对象:Person per = new Person() ;;

·调用类的setter方法设置内容:per.setName("张三") ;、per.setAge(20) ;;

很明显,当一个对象实例化之后就特别希望类中的属性就有内容了,这样分别调用setter方法设置实在是不方便,所以可以使用构造方法进行属性内容的传递。

相关文档
最新文档