本章简言

上一章笔者讲到关于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. sessionStorage/localStorage 本地存储

      if(!sessionStorage.getItem('vote2')||sessionStorage.getItem('vote2')==NaN)sessionStorage.setItem(' ...

  2. IT人士必去的10个网站

    1.Chinaunix 网址:http://www.chinaunix.net/ 简介:中国最大的linux/unix技术社区. 2.ITPub 网址:http://www.itpub.net/ 简介 ...

  3. Backbone源码分析(一)

    距离上一篇博客有一段时间了,期间各种琐事萦绕.最主要的一件是,当我差不多将整个dojo核心源码看完,惊讶的发现dojo1.*的设计以是老态龙钟之象,而我沉溺在dojo中太久,已经不知道前端世界变成了什 ...

  4. Scrum Guide - Scrum指南中文版

    现在公司在使用敏捷开发模式进行日常的开发和管理工作,所以我看了下Ken Schwaber的<Scrum Guide>这本小册子,原本是英文的,这里提供中文的,以供日后复习和参考. Scru ...

  5. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

  6. NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装

    一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经 ...

  7. Redis系列(三)-Redis发布订阅及客户端编程

    阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...

  8. .Net组件程序设计之上下文

    .Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...

  9. [ASP.NET MVC 小牛之路]08 - Area 使用

    ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块.这对于大的工程非常有用,Area 使每个功能模块都有各自的文件夹,文件夹中有自己的Cont ...

  10. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...