首页 > 代码库 > Java和C#在面向对象上语法的区别

Java和C#在面向对象上语法的区别

做了几年了开发一直没有总结什么,回到了家乡的小城做了一名培训班的教员,教授软件开发的知识。细小的知识从头细细嚼来,别有一番滋味。或是以前遗漏的太多,或是确实没有系统的学习过,教学生的过程中自己也对教材有了一遍系统深入的学习。虽然教的和学的都很肤浅,但是为了帮助学生们理解,然后自己也会思考为什么会这样?这种来自于最基础的思考,一直向上反馈,发现这种思考原来可以令自己进步的非常快。虽然目前还在思考入门阶段的问题,已经受益良多了。那么如果把之前的开发中的问题都思考一遍,又能收获多少能?写写博客吧,一直告诉学生们这是一个好的习惯,可自己却从来没有身体力行。那么,就从现在开始......   面向对象

  面向对象是一种开发思想,最应该记住的一句话是万物皆对象。为了让程序更好的被理解和编写,把现实生活中描述事物的方式和思路融合进入,就成了面向对象的思想。把生活中的事物融合进程序中那么就需要描述,描述分为特征和行为两方面,而不同类别的对象特征和行为具有巨大的差异,为了更好的制定描述每一类事物的方式,那么提取来一个编程世界中的类的概念,等同于生活中的类型的概念,每一种事物都应该是有类型的。然后生活中的事物按不同的方面进行分类的话,可以划入不同的类别,所有编程中的类也是一个公说公有理,婆说婆有理的玩意,相当的抽象,具有相当的不确定性和随意性。

  类的构成:

  Java中的类,包含属性和方法。属性即类中的变量,可分静态变量、实例变量(全局变量)、局部变量(存在于方法中,声明周期仅限于该方法的调用阶段)

  C#中的类,包含字段、属性和方法。字段对应java中的属性,C#中的属性对象java中的get和set访问器,是对字段的封装,方法一样,都是描述行为。

  类成员的调用:

  实例成员由对象调用。静态成员由类调用。但是在java中静态成员也可以被实例调用,相当于班上的每一个学生都可以任意的支配班费了,很不好的一个问题。C#在这方面严格限制了,静态成员只能有类进行调用。

  三大特性-封装

  封装:为了隐藏内部的实现细节,达到对数据安全性的保护和代码重用的效果的一种手段。

  封装无处不在,看似简单却可无限延伸。并没有一个明确的关键字来表示封装。既然是思想,是手段,所有在java中和c#中是没有语法区别的。仅仅是他们在借助访问修饰符来达到封装的效果时,两种语言的访问修饰符是不一样的。

  Java中:

  private:私有的,仅内部可以访问

  dufault:默认的,同一包的内部可以访问。

  protected:受保护的,同一包中或者是不同包的子类中可以访问。

  public:公共的,任何地方可以访问。

  特点:有明确的大小统属关系:private < default < protected < public

  C#中(引入程序集的概念。命名空间类似于java中的包,但它是逻辑分组不同于java中的包是物理分组,程序集类似于一个项目):

  private:私有的,仅内部可以访问。

  intenal:内部的,同一程序集的内部可以访问,同default。

  protected:受保护的,子类中可以访问,和java中protected是不同的,此处范围要小些,同程序集的非子类不能访问。

  proteted intenal:是intenal和protected访问范围的并集。

  public:公共的,任何地方可以访问。

  特点:没有明确的大小统属关系,intenal和protected的访问范围大小是分不清的。

 

三大特性-继承   继承:目的是为了让一个类拥有另一个类的属性和方法。

  Java中:使用extends表示使用继承

  重写的要求:a、方法名、返回值类型、参数相同;b、访问修饰符访问范围要大于或等于父类方法访问修饰符;

  访问父类成员:使用super关键字,可使用super(参数);在构造方法中指定调用父类一个构造方法。

  C#中:使用:表示使用继承

  重写的要求:a、方法名、返回值类型、参数、访问修饰符相同;b、父类方法被virtual修饰,子类方法被override修饰

  访问父类成功:使用base关键字,在构造方法后使用:base(参数);指定调用父类构造方法,base不能使用在静态环境中,不能调用父类静态成员。

  覆盖:使用new关键字。在c#中引入覆盖的内容,对父类的非virtual方法,也就是不可重写的方法,使用覆盖,可以覆盖掉父类的方法。对覆盖我的看法是为了弥补必须被virtual修饰的方法才能重写这个限制可能带来的问题,但是能不用就不用,覆盖意义不大,或者说是我还没有真切体会到覆盖的实际作用和使用场合,有高人可以评论解惑。

  判断是否重写成功的依据:使用父类的引用指向子类的对象,如果该方法调用的是父类方法说明重写不成功,如果调用到子类方法,说明重写成功。

  三大特性-多态

  多态:同一种行为的多种存在形态。表现形式有:重载、重写。

  重载要求:a、同一类中;b、方法名相同;c、参数不同(参数个数、类型、顺序)。

  调用时根据传入的参数来决定调用到哪一方法。

  抽象类和接口

  抽象类:使用abstract修饰的类称为抽象类。

  来源:在我看来,抽象类的来源是值得仔细琢磨一下,有利于加深理解。现实生活中存在很多这样的问题,也就是我们知道这一类事物都会做这个动作(方法),但是并不知道它如何去做,比如我们都知道动物为动,但是每个动物你不知道它如何去动。这个时候定义这个Animal类时,就需要一个move方法,只有方法头(描述会做什么事情),没有方法体(描述如何去做这件事情),那么这个方法比较特殊,我们就标记为抽象方法,使用abstract修饰。

  那么Animal类中有了抽象方法,假如你实例化了Animal类,当你调用move方法时,会出现什么样的问题呢?未知,因为它并没有描述如何去做。所以为了避免出现这种未知的情况,比如把Animal类定义为抽象类,显著特点就是不能实例化。一个不能实例化的类,他的非静态成员是不可被调用的,那么这样的类存在的意义在于什么呢?

  所以总结:抽象类存在的意义在于被继承。抽象类是为了抽象方法而存在的,有构造方法却不能被实例化。语法上java和c#在这方面是一样的,不再细说。

  接口:制定的一组规则和规范,让实现类都满足这个规则和规范,在实际应用中能很大程序增加程序的灵活性。面向接口编程,我的理解也不是特别深,也不是我一两句可以讲清楚。有高人可以在后面贴贴自己的心得,学习学习。

  区别:C#中,实现类如果没有实现接口中所有的方法,则比如把自己定义为抽象类并且把未实现的方法重新抄写一遍定义为抽象方法。

  总结

  一直以来是做java开发的,教学的需要才学习c#,有相通之处,学起来很快。这里仅仅关注语法,对于大牛们都在搞协议,搞底层,是看不上这个的。

  仅以此文抛砖引玉,该喷喷,该砸砸,别人身攻击就好了。