前几天在一次java课上,老师说:“java是完全的面向对象语言,但c++并不是纯粹的面向对象语言”。我想问大家什么是面向对象,能不能举个例子说明一下java和c++在这点上的区别。小妹在此就谢谢大家啦!

解决方案 »

  1.   

    面向对象要不是着重于对实际问题的解决还有什么存在的意义和价值?恰恰相反,面向对象就是只关注实际问题。 
    每次看到那些用OOP语言做面向过程编程习题的都感到无奈,失败的教育... 
    参考下这里 
    http://hi.baidu.com/vrhero/blog/item/1936f319a1420d7adab4bda6.html关于java和c++的问题,老师之所以这么说,完全是因为,在java编程中,代码必须要写在一个与文件同命的public类中,不允许使用者使用面向过程的方法;而c++就没这么严格,为了兼容c,在c++里,可以使用面向过程的编程方法实现功能
      

  2.   

    Java 是完全面向对象的语言,而 C++ 应该说“支持面向对象”。再具体一点就请教楼下了。
      

  3.   

    图2-1 封装:可用来保护私有数据的公共方法
    继承
        继承(Inheritance )是一个对象获得另一个对象的属性的过程。继承很重要,因为它支持了按层分类的概念。如前面提到的,大多数知识都可以按层级(即从上到下)分类管理。例如,尊贵的猎犬是狗类的一部分,狗又是哺乳动物类的一部分,哺乳动物类又是动物类的一部分。如果不使用层级的概念,我们就不得不分别定义每个动物的所有属性。使用了继承,一个对象就只需定义使它在所属类中独一无二的属性即可,因为它可以从它的父类那儿继承所有的通用属性。所以,可以这样说,正是继承机制使一个对象成为一个更具通用类的一个特定实例成为可能。下面让我们更具体地讨论这个过程。
        大多数人都认为世界是由对象组成的,而对象又是按动物、哺乳动物和狗这样的层级结构相互联系的。如果你想以一个抽象的方式描述动物,那么你可以通过大小、智力及骨胳系统的类型等属性进行描述。动物也具有确定的行为,它们也需要进食、呼吸,并且睡觉。这种对属性和行为的描述就是对动物类的定义。
        如果你想描述一个更具体的动物类,比如哺乳动物,它们会有更具体的属性,比如牙齿类型、乳腺类型等。我们说哺乳类动物是动物的子类(subclass ),而动物是哺乳动物的超类(superclass )。    由于哺乳动物类是需要更加精确定义的动物,所以它可以从动物类继承(inherit )所有的属性。一个深度继承的子类继承了类层级(class hierarchy )中它的每个祖先的所有属性。
        继承性与封装性相互作用。如果一个给定的类封装了一些属性,那么它的任何子类将具有同样的属性,而且还添加了子类自己特有的属性(见图2-2 )。这是面向对象的程序在复杂性上呈线性而非几何性增长的一个关键概念。新的子类继承它的所有祖先的所有属性。它不与系统中其余的多数代码产生无法预料的相互作用。
    多态性
        多态性(Polymorphism ,来自于希腊语,表示“多种形态”)是允许一个接口被多个同类动作使用的特性,具体使用哪个动作与应用场合有关,下面我们以一个后进先出型堆栈为例进行说明。假设你有一个程序,需要3种不同类型的堆栈。一个堆栈用于整数值,一个用于浮点数值,一个用于字符。尽管堆栈中存储的数据类型不同,但实现每个栈的算法是一样的。如果用一种非面向对象的语言,你就要创建3个不同的堆栈程序,每个程序一个名字。但是,如果使用Java ,由于它具有多态性,你就可以创建一个通用的堆栈程序集,它们共享相同的名称。
        多态性的概念经常被说成是“一个接口,多种方法”。这意味着可以为一组相关的动作设计一个通用的接口。多态性允许同一个接口被必于同一类的多个动作使用,这样就降低了程序的复杂性。选择应用于每一种情形的特定的动作(specific action )(即方法)是编译器的任务,程序员无需手工进行选择。你只需记住并且使用通用接口即可。图2-2 拉不拉多猎犬继承所有其超类的封装
        再拿狗作比喻,一条狗的嗅觉是多态的。如果狗闻到猫的气味,它会在吠叫并且追着它跑。如果狗闻到食物的气味,它将分泌唾液并向盛着食物的碗跑去。两种状况下是同一种嗅觉器官在工作,差别在于闻到了什么气味,也就是有两种不同类型的数据作用于狗的鼻子!在一个Java 程序中使用方法时,也可以采用这个通用的概念。
    多态性、封装性与继承性相互作用
        如果用得当,在由多态性、封装性和继承性共同组成的编程环境中可以写出比面向过程模型环境更健壮、扩展性更好的程序。精心设计的类层级结构是重用你花时间和努力改进并测试过的程序的基础,封装可以使你在不破坏依赖于类公共接口的代码基础上对程序进行升级迁移,多态性则有助于你编写清楚、易懂、易读、易修改的程序。
        在前面两个与现实生活有关的实例中,汽车更能全面说明面向对象设计的优点,为介绍继承而用狗作类比也很有趣。总的来说,汽车与程序很相似,所有的驾驶员依靠继承性很快便能掌握驾驶不同类型(子类)车辆的技术。不管是接送学生的校车,或是默西迪斯私家轿车,或是保时捷汽车,或是家庭汽车,司机差不多都能找到方向盘、制动闸和加速器,并知道如何操作。经过一段驾驶,大多数人甚至能知道手动档与自动档之间的差别,因为他们从根本上理解这两个档的超类——传动。
        人们在汽车上看见的总是封装好的特性。刹车和踏脚板隐蔽着不可思议的复杂性,但接口却是如此简单,你的脚就可以操作它们!引擎、制动闸及轮胎的大小对于你如何定义踏脚板类的接口没有任何影响。
        最后的属性,多态性,在汽车制造商基于相同的交通工具所提供的多种选择的能力上得到了充分反映。例如,刹车系统有正锁和反锁之分,方向盘有带助力或不带助力之分,引擎有4缸、6缸或8缸之分。无论设置如何,你都得脚踩刹车板来停车,转动方向盘来转向,按离合器来制动。同样的接口能被用来控制许多不同的实现过程。
        正如你所看到的,通过封装、继承及多态性原理,各个独立部分组成了汽车这个对象。这在计算机程序设计中也是一样的。通过面向对象原则的使用,可以把程序的各个复杂部分组合成一个一致的、健壮的、可维护的程序整体。
        正如本节开始时提到的,所有的Java 程序都是面向对象的。或者,更精确地说,每个Java 程序都具有封装性、继承性及多态性。尽管在本章将要介绍的简单示例程序及以后几章的示例程序中并未体现所有这些特性,但也有所体现。你将看到,Java 提供的许多特性是它的内置类库的一部分,这个库使封装性、继承性及多态性得到更广泛应用。  
      

  4.   

    C++中大量用到 DEFINE 宏定义
    全局结构
    全局函数
    或者未封装的API而JAVA是极端的基于类的语言
    除了int等基础类型,其他所有的类型都是派生自超类OBJECT
    所以都是类打个比方说
    在VC里要显示一个提示对话框,可以用
    MessageBox()全局函数或者在MFC中的AfxMessageBox()函数
    这两个函数都是直接在头文件中定义的,所以是不需要类表示的
    int main(){
     AfxMessageBox("提示");
    }JAVA里则必须是在类支持下的
    public static void main(String[] args){
     JOptionPane.showConfirmDialog("提示");
    }
      

  5.   

    面向对象可不能看字面来理解,怎么个"面向"实在说不通.列举几点吧.
    面向对象是对世界的一种看法1.把要开发的系统看成是一个个活体组成,而不是函数组成,活体之间通过发消息(调用别的活体的方法)来交互,并完成工作.
    2.功能的实现仍然是在函数里完成的,但是这是对象自己的事情,跟别的对象没有关系,也就是说在一个对象眼中只有别的对象和它们能干什么,如果是面向过程的,那么系统就是由函数来组成的,函数眼里就只有函数.说C++不是面向对象的,是因为C++语法里有许多不是对象的东西,比如基本数据类型,全局变量,函数指针等这些不是对象.
    说java是纯粹面向对象的并不准确,因为java里有基本数据类型,int,double等这些并不是对象.个人观点,都是实话,未必正确,见仁见智.
      

  6.   

    严格讲,java还不是完全面向对象的,因为它还存在着 int,double,float这些基本数据类型;
      

  7.   

    java并不是完全面向对象的,因为有八种基本类型,
      

  8.   

    BS frilly() 这种COPY行为
    一点没有技术含量 ~`