黑马程序员技术交流社区

标题: 面向对象的概念还是模糊不清 [打印本页]

作者: qinjingbo    时间: 2014-10-23 23:05
标题: 面向对象的概念还是模糊不清
听了教学视频感觉对面相对象和面向过程不是很明白,求教。
作者: 田峻菘    时间: 2014-10-23 23:42
多看几遍视频,思考加敲代码
作者: 张周飞    时间: 2014-10-24 09:28
         面向对象是一种思想,Java 是一种面向对象的程序语言,学习 Java 有助于你理解面向对象,但是不要把 Java 和面向对象画等号。
         面向对象是一种的程序设计方法,或者说它是一种程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。
         既然是面向对象,那最重要的概念无非是对象。我们面对的一切事物其实都是对象。对象有它的固有属性和固有方法,其实对象也就是由一个属性集合和一个方法集合组成的。这可以结合 Java 理解,在 Java 中对象是类的实例,而每个类都定义了一系列的属性和方法。
         然后说到类,这也是一个重要的概念。类,很简单,是一类对象的集合,它不是一个具体的集合,而是一种抽象描述,而描述方式就是此类对象的共有属性和方法。换句话说就是共性,很简单。
           面向对象是当今主流的一种程序设计理念和设计规范,它取代了早期的"结构化"过程设计开发技术,主张一切皆为对象,程序以人的思维模式去解决问题。面向对像的程序是由类组成的,每个类包含对用户公开的特定功能部分和隐藏的实现部分。传统的结构化程序设计通过设计一系列的过程(即算法)来求解问题。这一些过程一旦被确定,就要开始考考虑存储数据的方式,这就明确的表述了程序员的工作方式。但面相对像却调换了这个顺序,它不必关心数据对象的具体实现,只要能满足用户的需求即可。面向对象有三个最基本的特性,即:封装,继承,多态。
             封装(Encapsulation):使用方法把类的数据隐藏起来,遵循了java 一切皆为对象的基本概念和核心思想,达成对类的封装,让普通类型上升为对象级;封装控制用户对类的修改和访问数据的程度,增强了程序的可维护性。
            继承(Implementation):发生在类和类之间,可分为单继承和多层继承描述父子对象之间的血缘关系, 最终达到的目的是:一旦使用了继承,子类便获得了父类所有的成员(变量和方法),但是父类的私有的方法和属性不能被访问,父类的final成员不能被重写。 一旦使用了继承,父类的实例能指向派生类(子类)的引用。
          多态(Multipart):对象在运行期和编译期具有的两种状态,使代码具有灵活性和重用性。编译时多态,也就是函数重载,所谓函数重载就是指同一个函数名可以对应多个函数的实现具体调用哪个按照由参数个数,参数类型等来决定。运行时多态:用一个基类的指针或引用来操纵多个派生类型的能力被称为多态性。
           类和对象的概念是面向对象的基础,有了这两者,我们已经可以描述整个宇宙,从抽象到具体,从时间到空间的任何事物。面向对象的还有一个概念于是出现了:抽象。如果你觉得前面的概念很简单的话,接下来可能就难以理解了。---------面向对象知识点---------
一.面向对象的概念:    1).面向对象是相对于面向过程而言;
    2).面向对象分析(OOA)
       面向对象设计(OOD)
       面向对象编程(OOP)
    3).面向对象的特点:
       A.封装:将成员属性私有化,有选择的对外提供公有的方法;
       B.继承:将一些类的共有的部分抽取出来,形成一个父类,其它类可以继承自这个类;
        达到代码复用的目的;另外也为多态提供前提;
       C.多态:用父类的引用指向子类的对象。有利于程序的扩展;
    4).类和对象的关系:
       A.类:就是对一些事物的定义;它在我们的代码中反映为一个class;它定义了具有相同特征的一些
         事物的属性和行为;它类似于我们现实中的表格;设计图纸;
       B.对象:就是具体存在事物。它在我们的代码中表示为通过new关键字,在内存中会产生堆空间,具有自己
         特有的属性值;
       C.类和对象的关系:一个类可以产生多个对象;类:就是一个对事物的描述性的定义;
                                                                              对象:就是具体的事物;
    5).定义类使用class关键字:
       类中可以包含:
         成员属性;
  与"局部变量不同":
   A.局部基本类型变量:
     a).声明后必须初始化,才能被访问;
     b).存储在栈中
     c).所在的代码块结束,立即从栈中消除;
   B.成员变量:
     a).声明后,系统会自动初始化,赋默认值:整数:0,小数:0.0,布尔:false,字符:'\u0000',其它引用类型:null
     b).存储在堆中;
     c).所在的代码块结束,栈中的引用会立即消除,但堆中的数据不会立即消失,会成为垃圾,后期由JVM中的垃圾回收器自动回收。
  成员方法;
  类;
  接口;
    6).匿名对象:
       1.如果我们不需要对象的名字,可以使用匿名对象:
         new MyTools().getMax(10,20);
       2.当我们调用函数,而函数的形参需要某个引用类,而这个引用我们不需要,此时,可以传一个匿名对象:
         fun(new Student());
    7).封装:
       将成员变量私有化,对外提供公有的方法;
       1.私有:private
       2.公有:public
    8).this关键字:
       1.对于一个类的多个对象,每个对象会有一份"成员变量"的副本,但对于方法体,所有对象共享一个方法体;
         所以一个方法是被多个对象共享的。此时,当运行这个方法时,Java会自动将这个方法绑定到当前运行的
  对象上,隐式的使用this。
       2.this存储当前对象的引用;
       3.同过this可以访问成员变量、成员方法、构造方法;
day7:
一.初始化数据成员:
    1).初始化代码块:是位于类体中的一对大括号{}内的代码块。每次构造一个此类对象时,会执行一次。
                     它比构造函数先期执行;用于初始化成员变量;
           2).构造函数:
       A.构造函数的名字跟类名相同;
       B.构造函数不能声明返回值类型,即使是void;
       C.构造函数是在实例化对象时被自动调用,只被调用一次;
       D.一个类可以有多个构造函数(构造函数的重载);
       E.如果我们的类不写构造函数,系统会自动添加一个默认构造函数(无参,无方法体,什么都不做的);
         如果我们定义了构造函数,系统将不会给我添加默认构造函数;
       F.构造函数不能return一个具体值,但可以写return;语句;表示结束方法执行;
       G.构造函数之间可以互相调用,使用this()或者带参数this(实参);
       H.构造函数的访问修饰符可以是private;意味着外部不能实例化一个此类对象。(单例模式)
    3).静态初始化代码块:
       A.普通代码块之前加static关键字:static{};
       B.第一次实例化此类对象时,只执行一次;
       C.执行顺序:静态初始化代码块、初始化代码块、构造函数
       D.静态初始化代码块如果访问数据成员,那么数据成员一定要是静态;
二.static关键字:
    1).修饰类的成员;
    2).静态成员会在没有类的对象产生前,先期被加载,并分配空间;
    3).静态成员可以通过类名调用,可以通过对象名调用;
    4).静态的成员变量,存储在方法区的"静态区",对多个对象是共享的;
    5).静态方法只能访问静态成员;
    6).静态方法中不能使用this,super关键字;
    7).main方法是静态的;
三.main方法:
    A.格式:public static void main(String[] args)
    B.public :公有的;
    C.static :静态的,不需要类的实例就可以被访问;
    D.void : 不返回值;
    E.main : main不是关键字。它是一个约定的名称,必须要main,由虚拟机自动寻找并加载运行;
    F.String[] args : 用于从控制台接受参数;
四.制作帮助文档:
    A.使用javadoc.exe,在JDK安装目录/bin/,同java.exe和javac.exe在相同目录下;
    B.源码中需要使用"文档注释":以:/**开头,以*/结束;
五.生成随机数:
    A.java.lang.Math类中的random。random()是一个静态的方法,直接使用类名就可以调用;
    B.每次生成一个大于或等于0.0,小于1.0的一个浮点数;
    C.生成1——10的数字:(int)(Math.random() * 10) + 1;





作者: 王世虎    时间: 2014-10-24 09:46
我的理解是,面向对象是需要调用对象的方法,就是说使用对象的功能,在函数方法中被调用,而调用者并不一定具备该功能。面向过程就是自己具备该功能,使用自己的功能,不需要调用。比如说,我们乘车去上班,我们只需要知道在哪上车和下车就行了,不需要知道车是怎么走的,这时候我们是面向对象。如果我们是开车的司机,那么我们就要知道具体的执行方法,这时候候我们就是面向过程了。
作者: cxdzh    时间: 2014-10-24 13:35
简单点说,一个是所有环节亲力亲为,,一个是指挥别人做事.
比如我要吃饭,
面向过程就是我想要吃饭了,我要煮饭,买菜,择菜,烧菜,盛饭,吃饭.每一步都要我自己来操作.
面向对象就是,我事先把这些功能细节都封装起来,或者找到一个具有这些功能的对象---例如招聘个厨师.这个厨师就是一个对象.
当我需要吃饭的时候,只需要告诉这个对象:"我要吃饭了",然后他直接返回做好的饭给我,我只需要吃,不需要再去理会每一步的细节要怎么实现,
作者: Eagle    时间: 2014-10-24 13:39
看我发的一个关于面向对象的帖子。大神们回复得比较形象。你可以看一下。
http://bbs.itheima.com/thread-146222-1-1.html面向对象与面向过程
作者: 戏言丶    时间: 2014-10-24 15:18
我是来学习的
作者: 。冰封    时间: 2014-10-24 15:59
面向过程就是,要吃饭只能自己做,面向对象就是,找个老婆(对象)给我做饭,我就不需要做了,直接吃就行了。
老婆就是对象,你自己做饭就是过程。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2