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

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

  类的构成:

  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#,有相通之处,学起来很快。这里仅仅关注语法,对于大牛们都在搞协议,搞底层,是看不上这个的。

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

Java和C#在面向对象上语法的区别的更多相关文章

  1. Java基础学习(三)—面向对象(上)

    一.理解面向对象       面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...

  2. Java学习笔记(面向对象上)

    面向对象(上) 面向对象的特点:封装性(是面向对象的核心思想,将对象的属性和行为封装起来).继承性(主要描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展)和多态 ...

  3. java第三节 面向对象(上)

    //第三讲 //面向对象(上) /* 理解面向对象的概念 面向过程 在一个结构体中定义窗体的大小,位置,颜色,背景等属性,对窗口操作的函数窗口本身的定义没有任何关系 如HideWindow, Move ...

  4. 【Java基础】面向对象上

    面向对象上 这一章主要涉及 Java 类及类的成员,包括属性.方法.构造器:代码块.内部类. 面向过程与面向对象 面向过程(Procedure Oriented Programming,POP)与面向 ...

  5. Java在Web开发语言上败给了PHP

    PHP的主要语言开发者之一.Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言.他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java ...

  6. Java面试题全集(上-中-下)及Java面试题集(1-50/51-70)

    阅读量超百万级的文章,收藏并分享一下.感谢原创作者的总结 对初中级java开发人员有特别大的帮助,不论是技术点面试还是知识点总结上. Java面试题全集(上):     https://blog.cs ...

  7. Java面试题全集(上)转载

    Java面试题全集(上)   2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是 ...

  8. Java基础教程:面向对象编程[1]

    Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...

  9. php与java语法的区别

    php与java语法的区别 个人觉得在学习语言时,可以通过比较来进行学习.由于长时间写java代码,对java的基本语法还算熟悉,现在转学php,就php中基本语法与java基本语法差异进行比较. 1 ...

随机推荐

  1. Oracle行列互换 横表和纵表

    /* 在实际使用sql工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换. 比如有如下数据: ID NAME KECHENG CHENGJI -- ---------- ------ ...

  2. hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10

    题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结 ...

  3. 数据仓库之ETL漫谈

    ETL,Extraction-Transformation-Loading的缩写,中文名称为数据抽取.转换和加载. 大多数据仓库的数据架构可以概括为: 数据源-->ODS(操作型数据存储)--& ...

  4. Android的SoundPool

    开发Android软件中我们可能经常需播放多媒体声音文件,一般使用MediaPlayer类但该类占用资源较多,对于游戏等应用可能不是很适合,SoundPool类在SDK的android.media.S ...

  5. [持续更新]android stduio的一些小技巧

    1.导入第三方jar 无法和eclipse一样可以直接刷新就可以导入libs里的jar,要到jar文件上右键按add jar. 2.其他依赖项目里有support-v4包的时候 在Libs里还是要有s ...

  6. 改变seekbar的游标图片大小

    url: http://stackoverflow.com/questions/9699951/changing-size-of-seekbar-thumb The most flexible way ...

  7. Hibernate检索策略

    1. Hibernate的检索策略概述: 检索数据时的 2 个问题:    1.不浪费内存:当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象 ...

  8. vim MiniBufExplorer 插件

    MiniBufExplorer安装好久了,但一直没怎么使用过. 今天查了下资料,作为一个备份. 当你只编辑一个buffer的时候MiniBufExplorer派不上用场, 当 你打开第二个buffer ...

  9. 【转】使用Auto Layout中的VFL(Visual format language)--代码实现自动布局

    本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...

  10. codeforces 617BChocolate

    B. Chocolate time limit per test 1 second memory limit per test 256 megabytes input standard input o ...