【Java面向对象基础(三)】面向对象思想

【喵"的Android之路】【基础篇(三)】【Java面向对象基础】面向对象思想

1 面向对象的WWH

1.1 What--什么是面向对象

首先,要理解“对象”。在Thinking in Java中提到“Everything is an object”,即万物皆对象。这里的“对象”指的是任何实体或者任何可以当作实体看待的“虚幻的事物”。比如现实中的人(男人、女人、老人、小孩而。。。)、动物(大象、狮子、猴子。。。)、桌子、凳子、汽车、ATM机等等,也可以使看不见摸不着的空气(氧气、二氧化碳、氮气。。。)、科幻片里的各种怪物、甚至包括人的意识等等,只要你能想到的客观存在的实体和主观抽象的概念,都可以作为对象。

知道了“对象”的定义,便可理解面向对象编程(Object-Oriented Programming)的概念,下面是我个人的理解:OOP,是软件开发中一种自生而下的编程方式,它通过“对象”模拟现实环境,把环境属性注入到“对象”当中,通过操作对象以及对象之间的关联实现程序功能,这种方式提升了程序结构清晰度,提高了代码的重用性和扩展性,也降低了开发人员对程序理解和开发的难度。

1.2 Why--为什么要面向对象

我们知道面向过程和面向对象两种编程方式。面向过程的C语言已经独霸几十年,随后产生的C++、Java、C#、Object-C等语言大部分采用的是面向对象方式。对于C语言大牛们来说,面向过程已经够用,因为他们把计算机基础甚至底层知识掌握的很牢固,用面向过程的方式开发如行云流水般顺畅。但是结构化设计(面向对象编程)在设计系统的时候,无法解决重用、维护、扩展等问题,而且会导致逻辑过于复杂,代码晦涩难懂。于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路、习惯、步骤来设计向英的应用程序。这样的程序,人们在读它的时候会更容易理解,也不需要把现实世界和程序世界之间来回做转换。

人们发现,在现实世界中存在的实体或概念是问题域中的主角,亦即我们上边所提的“对象”。对象具有属性和行为,属性是稳定的,行为不稳定。而且对象之间往往具有各种关联关系。因此面向对象编程比面向过程编程更稳定。在面对频繁的需求更改时,改变的往往是行为而对象本身一般不会改变,从而保证架构的稳定性。
        人们追求的系统可维护性,可扩展性,可重用性又是怎么在面向对象中体现出来的呢?

首先看看面向对象的三大特征:

封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这就是所有设计模式的基础,就是封装变化,因此封装的作用就是解决程序的可扩展性。

继承:子类继承父类,可以继承父类的方法和属性,实现了多态以及代码的重用,因此解决了系统的重用性和扩展性。但是继承破坏了封装,因为它是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性。所以,继承需要慎用,只有明确的is-a关系才能使用。同时继承是在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发这滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合而不是继承,是面向对象开发中一个重要的经验。

多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装中提到,找到变化部分并封装起来,但是封装起来后怎么适应接下来的变化?这正是接口的作用,主要目的是为不相关的类提供通用的处理服务。设想一下,鸟会飞,但是超人也会飞,可以让鸟和超人都实现飞这个接口,这样维护飞这个行为或者后来又有其他对象实现飞接口就会很方便,如此便体现了系统的可维护性和可扩展性。

 因此面向对象能实现人们追求的系统可维护性,可扩展性,可重用性。面向对象是一种编程思想,起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法,但面向对象的思想已经涉及到软件开发的各个方面,比如现在细分为了面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP) 。

1.3 How--如何进行面向对象开发

那么如何进行面向对象开发呢?

面向对象是一种思想,它让我们在分析和解决问题时把思维和重点转向现实中的客体中来,然后通过UML等工具理清这些客体之间的联系,最后用面向对象的语言实现这种客体之间的联系。它分为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)三大步。

a、分析需求,先不要考虑怎么用程序实现,要先分析需求中稳定不变的客体有哪些,找到这些客体之间的联系。亦即确定面向的“对象”以及相互关系。

  b、设计模型,根据第一步分析出来的需求,通过进一步扩充模型,变成可实现、符合成本、模块化、低耦合高内聚的模型。通常使用UML工具(常用的有IBM的Rose和Microsoft的Visio)实现。

c、编程实现,根据以上两步积累,使用面向对象思想实现模型和需求。

2 相关知识点的Q&A

 a、面向对象的基本特性是什么?

抽象,封装,继承,多态

抽象:忽略事物中对当前目标无关的非本质特性,充分关注本质特性。找出事物的共性,并把具有共性的事物划为一类,得到一个抽象的概念。

封装:把对象的属性和行为结合成一个独立的单位,并尽可能隐藏对象的内部细节。

继承:指特殊类的对象拥有其一般类的属性和行为(子类继承父类)。继承意味着“自动拥有”被继承类的属性和行为。

多态:简单来说,多态是具有表现多种形态的能力的特征,根据对象的不同形态以不同方式处理,特别是方法重载和类的继承。多态还分为编译时多态和运行时多态。

 b、面向对象和基于对象有什么区别?

“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些。因此在我们进行WEB开发,普通三层开发中,基本上是基于对象的实现,因为只是实现了封装,但是没有使用继承和多态。

c、创建对象的方式有哪几种?

  • 用new语句创建
  • 利用反射,调用java.lang.Class或者java.lang.reflect.Constructor的newInstance()实例方法
  • 调用对象的clone()方法
  • 使用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法
  • 字符串常量以及字符串+操作符都会产生新String对象

d、简述对象的初始化顺序

  • 所有静态成员初始化(父类-->子类)
  • 父类初始化(普通成员-->构造方法)
  • 子类初始化(普通成员-->构造方法)
  • static成员初始化吮吸只和类定义中的顺序有关

e、简述Java的垃圾回收机制

在Java中,内存回收任务由JVM(Java Virtual
Machine)来担当。在程序的运行环境中,JVM提供了一个系统级的垃圾回收器现成,它负责自动回收那些无用对象所占用的内存空间。这种内存回收的过程被称为垃圾回收。

一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它的时候,这个对象就可以被垃圾回收机制回收。

但是,并不是对象被抛弃后立即回收。JVM进程做空间回收有较大的系统开销,如果每当应用进程丢弃一个对象就立即回收空间,势必会使整个系统的运转效率非常低下。

将引用设为null或者调用System.gc()、Runtime.gc(),JVM就会接收到消息,然后对几个垃圾回收算法做加权处理,使垃圾回收操作容易发生或提早发生。

由于垃圾回收器的运行时间不是固定的,所以清理工作的实际运行时间也是不可预知的。

 f、Java包含几种内部类?各有什么特点?

Java内部类有两种情况共四类:

(1)在类中定义一个类(私有内部类,静态内部类)

(2)在方法中定义一个类(局部内部类,匿名内部类)

内部类的特点:

(1)私有内部类

外部类和内部类可以互相访问自己的私有成员

内部类中不能定义静态成员变量

(2)静态内部类

只能访问外部类的静态成员

(3)局部内部类

该内部类没有任何的访问控制权限

外部类无法访问局部内部类,但是局部内部类可以访问外部类的任何成员

方法体中可以访问局部内部类,但是访问语句必须在定义局部内部类之后

局部内部类只能访问方法体中的常量,即用final修饰的成员

(4)匿名内部类

没有构造器,取而代之的是将构造器参数传递给超类构造器

g、如何继承内部类?需要注意什么?

首先,只有私有内部类和静态内部类才可以被继承,局部内部类和匿名内部类由于访问权限限制,外部无法继承。

(1)私有内部类的继承方式和普通继承方式略微不同: class  A extends Outer.Inner 
即需要调用外部类。另外,需要为子类A创建以外部类Outer为形参的构造方法,并调用形参的super方法。

(2)静态内部类和普通类的继承方式一样,可以直接继承。

示例代码如下:

 1 class  Outer {
 2      /**私有内部类*/
 3      class  Inner {
 4
 5     }
 6
 7      /**静态内部类*/
 8      static   class  SInner {
 9
10     }
11 }
12 /** 通过外部类继承 私有内部类 */
13 class  A  extends  Outer.Inner {
14      /**
15      * 必须创建该构造方法,否则编译不通过
16      *  @param  outer
17      */
18      public  A(Outer outer) {
19         outer. super ();
20     }
21 }
22 /** 直接继承静态内部类 */
23 class  B  extends  SInner {
24 }

h、持续更新补充中。。。

本文系Nodin原创,转载请注明出处!http://www.cnblogs.com/monodin/p/3841198.html

【Java面向对象基础(三)】面向对象思想,布布扣,bubuko.com

时间: 2024-10-11 09:49:47

【Java面向对象基础(三)】面向对象思想的相关文章

Java面向对象基础三

1.函数的重载 2.构造函数的作用 (构造函数可以重载) 1.函数名必须和类名相同 2.没有返回值 3.使用 New 来调用构造函数 4.如果类中没有构造函数,编译器会自动帮忙加载一个参数为空.方法体为空的构造函数 5.如果类中已经存在构造函数,编译器就不会帮忙生成构造函数了.

{Java初级系列三}----面向对象和类

一:面向对象----Object 本人为自学Java系列,内容来自于中国大学mooc华东师范大学陈育良教授<Java核心技术>,在此感谢老师! 在Java中引入了对象和类的概念 对象是一个变量--------具体的东西: 类就是类型(是规范,是定义),从万千对象中抽取共性: 类规定了对象应该有的属性内容和方法: 对象就是类的具体实现,是活生生的: 例如:土豆丝菜谱是类,一盘土豆丝就是对象 从程序员的发展角度来理解,OO-Oriented Object是对OP—Oriented Procedur

黑马程序员——JAVA学习笔记三(面向对象)

1,    面向对象设计程序(oriented object pragraming)  ,其程序是有对象组成,只要对象能满足要求,就不需要关心其功能的具体实现.面向对象的特征:封装(encapsulation)继承(inherence)多态(polymorphism). 2,    类是对事物的属性和行为的描述,构造对象的模板和蓝图.对象是类的实例,它具有三个特征:行为(behavior)状态(state) 对象标示(identity如何辨别具有相同状态和行为的对象).成员函数默认有一个隐含参数

C++进阶 面向对象基础(三)

类的的定义: 初始化一般建议使用构造函数初始化列表形式: Person(const string nm, const string addr):name(nm), address(addr){} this指针: 类中使用this指针,特别是有些情况不能省略,例如在子类的方法中调用父类的某个成员变量,得加上this,不然有些编译器不通过,又例如 class Per{ Per& getName(){ return *this; } Per& getAge(){ return *this; }

java语言基础之面向对象之变量

---恢复内容开始--- 定义变量的语法: 数据类型 变量名=值 ----------------------------------------------------------- 变量根据在类中定义位置的不同,分成两大类: 成员变量:全局变量/字段(Field),不要称之为属性(错误).直接定义在类中,方法外面. 1):类成员变量 使用static修饰的字段. 2):实例成员变量 没有使用static修饰的字段. 局部变量:变量除了成员变量,其他都是局部变量. 1):方法内部的变量. 2)

python基础三——面向对象

1.用dir命令可以查看一个对象的所有属性: s='How are you' #s 被赋值后就是一个字符串类型的变量 l=s.split() #l是一个list类型的变量 dir(s) dir(l) 2.创建类 class Myclass: pass #pass语句表示一个空的代码块 mc=Myclass() print mc 输出结果:<__main__.Myclass instance at 0x01C5BEE0> 表示mc是__main__模块中Myclass类来的一个实例(instan

面向对象基础和面向对象的三大特性之一:封装(20161024)

面向对象 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Con

2018.6.13 Java语言基础复习总结

Java语言基础与面向对象编程实践 第一章 初识Java 1.1机器语言 机器语言是指一台计算机全部的指令集合.机器语言室友0和1组成的二进制数,是一串串由0和1组成的指令序列,可将这些指令序列交给计算机执行. 1.2汇编语言 负责把汇编语言翻译成二进制的机器语言,这种翻译程序就是汇编程序. 1.3高级语言 1954年第一个完全脱离机器硬件的高级语言FORTRAN诞生 1.3.1C语言 是一种计算机程序设计语言,它既有高级语言的特点,又具有汇编语言的特点. 1.3.2 C++语言 是具有面向对象

java面向对象基础知识

一.面向对象与面向过程的区别: ①所处的角色不同:前者指挥者,后者执行者:②所需知道的事情不同:前者知道哪些是做这些事情的人就可以,不需了解具体的事情操作的过程.后者需要具备应有的技能来做这些事情. 二.面向对象的基本操作过程 指挥者采用面向对象思想,通过创建类,来创建统一的属性值[成员属性]和(做事的)方法[成员方法]. 通过创建的类或者jdk已有的类,来创建具体的对象,属性值明确,方法明确. 举例:创建类 1 package com.oracle.demo02; 2 3 public cla