本章简言

上一章笔者讲到关于ADO.NET相关的知识,知道了如何去访问数据库。本章将来讲关于面向对象的思想。不管在JAVA还是在C#面向对象思想的重要性都是占了一个很大的成份。往往他就像呼吸一样子,更多的时候我们会忽略。面向对象编程有三大特性:封装、多态、继承。关于这三大特性的定义笔者不会过多的介绍。网络上类似这样子的文章一搜一片。相信里面肯定有你需要的。而本系列主要目标是想让JAVA程序员进入C#的开发环境。所以更多会在俩者之间的差别进行讲解。

类和对象

在进入面向对象思想的讲解之前,笔者认为应该先明白什么是类,什么是对象,及他们之间的关系。这样子的话才能更加明白面向对象思想。相关类和对象的讲解在网络上一搜也是一大片资料。笔者不想过多的解讲。笔者只是把自己的理解写出来,希望能给大家一些帮助。通常笔者喜欢把类理解为建房子时候用到的房子结构图纸。而对象便是根据房子结构图纸而建造成功的房子。这里的图纸便是.cs文件,图纸上面的结构图就是类了。而建造成功的房子便是对象,也就是内存中的实例。这是笔者的理解。有了这一个之后,我们就来看一下三大特性。

面向对象的封装

对于封装的里面,笔者是这样子看的。如果有过面向过程开发的读者们就会明白。所谓的封装就是把相关的数据放在同一个区域的,然后给这个区域命个名字。这样子将来开发的时候就可以知道来源。代码中的那个“.”就是最好的证明了。笔者不想讲过多没有用的话。我们就以代码的形式来学习。如下

C#:

  public class Person
{
public string Name { set; get; } public string Sex { set; get; } public void Move()
{ }
}

笔者定义一个叫Person的类。显然最大的区别在代码的中的“{ set; get; }”这一个部分。相信JAVA中我们常常会看到一些习惯的写法。算了。为了方便阅读笔者还是写代码贴出来吧。

JAVA:

 public class Person {

     private String name;
private String sex; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
} public void Move()
{ } }

我们可以看到JAVA这边如果类外面的想要用内部成员的话,就必须通过对应的set或get方法来实现。而在C#中却没有这样子写法。他有自己一个概念叫属性。上面的C#代码就是属性的写法。只不过他还是缩写的。为了学习我们还是在看一下正真的写法吧。

C#:

 public class Person
{
private string _name;
private string _sex;
public string Name
{
set { this._name = value; }
get { return this._name; }
} public string Sex
{
set { this._sex = value; }
get { return this._sex; }
} public void Move()
{ }
}

上面的代码就是C#属性的完整写法。可是C#开发人员往往不喜欢用而以。我们还都清楚知道JAVA在给类的内部成员变量赋值的时候,可能会做一些判断或处理。 对应的C#这边你们看到set后面的大括号了没有。就是在大括号里面写。其中关键字value就是将来外面传进来的值。代码如下

C#:

  public string Name
{
set
{
if (string.IsNullOrWhiteSpace(value))//判断传进来的值是不是空的。其中包括空格键
throw new ArgumentNullException("名字不能赋空值");
this._name = value;
}
get { return this._name; }
}

C#属性的使用:

Person person = new Person();
person.Name = "Aomi";
person.Move();

在我们建设类的时候,往往会定义一个叫常量的成员。JAVA用是关键字final来实现。而C#用的是关键字const。当然这里还有一个关键字readonly。从某种意义来讲他跟常量有一点类似。但又不能说是常量。只能说是一个只读的变量成员。并且他们俩个在赋值的时候又有很大的差别。如下

关键字const:在定义的时候就要给也赋值。

关键字readonly:在定义的时候就要给也赋值。同时候在构造函数里面。

C#:

private readonly string Nick ="aaa";
public const string DefaultName = "Person";

除了赋值和定义不同之外,还有明白他们在使用的时候也不同。关键字const是用类来使用。如  Person.DefaultName。但是关键字readonly是对象内部自己的。这一点要注意。

当我们把数据封装成为一个类的时候,我们要用这个类就必须跟类的构造函数打交道。这里有着跟JAVA一个很大差别。如下代码

C#:

 public Person():this("Aomi")
{ }
public Person(string name)
{
this.Name = name;
}

从上面的代码我们就能明白:JAVA的写法是写在构造函数里面。而C#却是在函数名后面。注意思加上“:”。

面向对象的继承

关于继承的话,大多数跟JAVA没有多的差别。主要是extends和implements都要用“:”来写了。这一点到是比较JAVA简单一点。而值得注意还有一点那便是跟构造函数有关系。我们都知道JAVA的super关键字吧。C#是用base关键字。同时用法不同。如下

public class Child : Person
{
public Child()
: base("Aomi")
{ }
}

笔者想了一会儿,觉得好像继承这边没有别的不同了。

面向对象的多态

笔者个人觉得JAVA在多态这边可能理解起来比较简单。为什么这样子讲呢?我们知道多态分为重写和重载。其中最大的差别是在重写身上。

1.重载。即是一名多用的意思。语法跟C#一样子。必须要方法名相同,但是参数类型或是个数不同。

2.重写。意思跟JAVA一样子。只是写法上却有很大的不同。

C#的Person类:

  public class Person
{ private string _name;
private string _sex;
public readonly string Nick ="aaa";
public const string DefaultName = "Person"; public Person():this("Aomi")
{ }
public Person(string name)
{
this.Name = name;
}
public string Name
{
set
{
if (string.IsNullOrWhiteSpace(value))//判断传进来的值是不是空的。其中包括空格键
throw new ArgumentNullException("名字不能赋空值");
this._name = value;
}
get { return this._name; }
} public string Sex
{
set { this._sex = value; }
get { return this._sex; }
} public void Move()
{
Console.WriteLine("person move");
}
}

C#的Child类:

    public class Child : Person
{
public Child()
: base("Aomi")
{ }
public void Move()
{
Console.WriteLine("child move");
}
}

C#的Program类:

 class Program
{
static void Main(string[] args)
{
Person person = new Child();
person.Name = "Aomi";
person.Move();
}
}

执行结果:

我们看到上面代码的执行结果是:person move。Child类重写了Person类的Move方法,在用Person类包装Child类实例。笔者用类似的功能在JAVA做了实验发现执行结果是:child move。在C#这里事实到关系到三个关键字:virtual、new、override。上面C#代码中Child类的Move方法事实上是 public new void Move()。也就是说没有重写原来父类的方法。所以在执行用Person类包装Child类实例的时候,会执行Person类的方法。所以C#这边重写的用法。应该是如下面这样子。

C#的Person类:

public class Person
{
public virtual void Move()
{
Console.WriteLine("person move");
}
}

C#的Child类:

 public class Child : Person
{
public override void Move()
{
Console.WriteLine("child move");
}
}

看到了吧。父类如果将来有方法可能会被重写的话,最好用关键字virtual来修饰这个方法。同样子子类要重写父类的话,就必须用关键override。至于关键new就是重新子类自己在写一个方法,不影响父类。

本章总结

本章主要讲到面向对象在C#时候应该明白的一些地方。我们可以看到差别不大的继承。封装和多态还是有一定的差别。同是就是构造函数上的一些差别。

Java进击C#——语法之面向对象的更多相关文章

  1. Java进击C#——语法之知识点的改进

    本章简言 上一章我们讲到关于面向对象思想上C#和JAVA之差别.笔者分别从面向对象的三大特性入手.而本章主要讲一些C#改进的知识点.在.NET Framework 2.0之后出现很多新的知识点.这些知 ...

  2. Java进击C#——语法之基础

    本章简言 上一章讲到关于项目工程开发常用的知识点,有了前面俩章的介绍之后.本章正式开始介绍关于C#的基础语法.我们都很清楚C#也是面向对象的计算机语言.而且他跟JAVA的相似度高达80%.所以很多语法 ...

  3. Java进击C#——语法之多线程

    本章简言 上一章中笔者对C#一些独有的语法点进行讲解,相信也可以看C#的一些神奇之处.那么本章主要是放在多线程这方面的知识.不管是C#还是JAVA在开发过程或多或少都会用到关于多线程的编程.当然笔者不 ...

  4. Java进击C#——语法之ADO.NET

    本章简言 上一章讲到关于C#语法的基础部分.了解相关的基础部分之后我们就要去了解一下C#是什么样子访问数库的.C#把访问数据库这一部分的知识点叫作ADO.NET.即是JAVA常常讲到的JDBC这一部分 ...

  5. Java进击C#——语法之IO操作

    本章简言 上一章我们对线程同步进行讲解.了解如何去处理可能发生的脏数据.而本章就要讲有关于C#在读取IO文件的时候,常常用到的操作类.这一章的内容会比较少.但是笔者还是总结出来让读者们有一个学习的方向 ...

  6. Java进击C#——语法之线程同步

    上一章我们讲到关于C#线程方向的应用.但是笔者并没有讲到多线程中的另一个知识点--同步.多线程的应用开发都有可能发生脏数据.同步的功能或多或少都会用到.本章就要来讲一下关于线程同步的问题.根据笔者这几 ...

  7. Java基础语法(9)-面向对象之类的成员

    title: Java基础语法(9)-面向对象之类的成员 blog: CSDN data: Java学习路线及视频 1.面向对象特征--封装 为什么需要封装?封装的作用和含义? 我要用洗衣机,只需要按 ...

  8. Java基础语法(11)-面向对象之关键字

    title: Java基础语法(11)-面向对象之关键字 blog: CSDN data: Java学习路线及视频 1.this this是什么 它在方法内部使用,即这个方法所属对象的引用: clas ...

  9. Java基础语法(10)-面向对象之三大特征

    title: Java基础语法(9)-面向对象之类的成员 blog: CSDN data: Java学习路线及视频 1.面向对象特征--封装 为什么需要封装?封装的作用和含义? 我要用洗衣机,只需要按 ...

随机推荐

  1. windows上面捕获声卡数据

    转自:http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/ 前一段时间接到一个任务,需要采集到声卡的输出信号,以便与麦 ...

  2. 我的ORM汇总

    MyOql是我写的ORM,目前仅支持 MSSql2005+ ,从2009年到今天,已使用过不少项目,之后会写 其它关系数据库的解析器: MySql,Sqlite,Oracle 等. 代码地址(最新版) ...

  3. 高质量,高效率的多国语言软件开发(Web/PC/Mobile),使用接口约束/调用不同语言资源

    偶然间翻出了几年前写的一个小程序,把当时的资料整理整理分享一下. 当时为了给自己的软件实现多国语言功能,而开发的辅助工具:SE String Resource. 这是当时基于自己另一款 IDE 软件抽 ...

  4. 代码提交的时候可以插入表情了-GitHub表情的使用

    GitHub官方有个表情项目,旨在丰富文字信息.意味着你可以在提交代码的时候,在提交信息里面添加表情,同时也可以在项目的ReadMe.md文件里面使用表情.除此之外,当然还有项目在GitHub上的wi ...

  5. Sharing A Powerful Tool For Calculate Code Lines

    最近正好需要统计下某项目代码行数,然后就找代码行数统计工具.以前找到过一个正则表达式,但是只有在VS2010下有用,VS2012和VS2013下的统计就不好使了. 接着搜索了一下代码行数统计绿色工具免 ...

  6. SQL Azure (16) 创建PaaS SQL Azure V12数据库

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China 最新的Azure PaaS SQL Database(SQL Azu ...

  7. LeetCode Note 1st,practice makes perfect

    1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to a ...

  8. php单条件查询,关键字查询

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. fir.im Weekly - 让 iOS 应用更加安全

    攻易防难,关于 iOS 应用安全看起来有些神秘.iOS Security , 源于@吴发伟_则平博客翻译的关于iOS安全的一系列文章,现在站点已经系统收集了大量关于 iOS 逆向.安全.反编译.静动态 ...

  10. Sublime Text执行js

    Sublime Text执行js 在Build Sytem添加以下内容: { "cmd": ["node", "$file"], " ...