zoukankan      html  css  js  c++  java
  • 类是数据类型,对象是内存的具体分配

    对于初学面向对象的人来说,往往很疑惑什么是对象,什么是类。在面向对象的编程领域中,我们需要明确一个事实:所有的类型必须被明确的表示,而不是被其他数据类型来替代。

    类是 C# 中功能最为强大的数据类型,它定义了数据类型的数据和行为。然后,程序员可以创建作为此类的实例的对象。类支持继承,而继承是面向对象编程的基础部分。

    比如我们在前面了解的一个关于洗牌的过程,在前面的代码中,我们计算和产生的不是真正意义上的扑克牌,而是字符串!

    如果要真正的描述扑克牌,我们必须要有一个扑克牌的数据类型,而这个类型.NET Framework显然没有提供,因此我们需要自己编写一个扑克牌的类型。所以我们需要定义一个扑克牌的类型,我们把自己定义的类型一般称为类。

    /// <summary>

    /// 扑克牌

    /// </summary>

    public class Poker

    {

    /// <summary>

    /// 扑克牌的花色

    /// </summary>

    public string Style;

    /// <summary>

    /// 扑克排的牌面

    /// </summary>

    public string Title;

    /// <summary>

    /// 扑克牌的值

    /// </summary>

    public int Value;

    }

    上述代码描述我们使用关键字class定义了一个类,该类的名字叫Poker。这个类中定义了3个变量:Style、Title和Value。

    class 关键字前面是访问级别。由于在该例中使用 public,因此任何人都可以基于该类创建对象。类的名称位于 class 关键字的后面。定义的其余部分是类的主体,用于定义行为和数据。类的字段、属性、方法和事件统称为“类成员”。

    要使用这个类,我们需要对其实例化。所谓的实例化,说白了就是通知编译器到内存中开辟一个空间,以存储一些值。通过使用 new 关键字(后跟对象将基于的类的名称)可以创建对象:

    Poker pokerA = new Poker(); //实例化Poker类

    Poker pokerK = new Poker(); //实例化Poker类

    创建类的实例后,将向程序员传递回对该对象的引用。在前面的示例中,pokerA和pokerK是对基于 Poker的对象的引用。此引用引用新对象,但不包含对象数据本身。

    static void Main(string[] args)

    {

    Poker pokerA = new Poker(); //实例化Poker类

    pokerA.Style = ((char)4).ToString();

    pokerA.Title = "A";

    pokerA.Value = 1;

    System.Console.WriteLine("{0}{1}", pokerA.Style, pokerA.Title);

    Poker pokerK = new Poker(); //实例化Poker类

    pokerK.Style = ((char)4).ToString();

    pokerK.Title = "K";

    pokerK.Value = 13;

    System.Console.WriteLine("{0}{1}", pokerK.Style, pokerK.Title);

    }

    我们得到的结果如图3.3.1:

    clip_image002

    图3.3.1

    Poker pokerA = new Poker()和Poker pokerK = new Poker()代码用以产生一个实例化Poker对象。通俗的说就是,通知编译器,我需要一个新的空间,这个空间请按Poker类的定义来分配空间,并且命名为pokerA或pokerK。而Style、Title和Value是Poker类的值,存储了Poker具体的内容。

    如果要比较两张牌对象有两种方案:

    一、比较两张牌对象是不是在同一个内存空间,如果是的话,这两个对象完全相等。

    二、比较两张牌对象的值是不是各自相等,如果是的话,表示这两张牌的值或牌面一样。

    static void Main(string[] args)

    {

    Poker pokerA1 = new Poker(); //实例化Poker类

    pokerA1.Style = ((char)4).ToString();

    pokerA1.Title = "A";

    pokerA1.Value = 1;

    System.Console.WriteLine("{0}{1}", pokerA1.Style, pokerA1.Title);

    Poker pokerA2 = new Poker(); //实例化Poker类

    pokerA2.Style = ((char)4).ToString();

    pokerA2.Title = "A";

    pokerA2.Value = 1;

    System.Console.WriteLine("{0}{1}", pokerA2.Style, pokerA2.Title);

    System.Console.WriteLine(pokerA1 == pokerA2); //在两个内存空间中,两个对象不相等

    System.Console.WriteLine(pokerA1.Value == pokerA2.Value);//两张牌的值相等

    }

    运行的结果如图3.3.2:

    clip_image004

    图3.3.2

    初学者很不了解对象的相等和对象的值相等是什么意思,用一个通俗的场景来说,有两个双胞胎兄弟,长的是一模一样,它们的衣服值一样,它们的外观值一样,它们的所有的一切的值都一样,但它们就是两个人,而不能说是同一个人。

    而笔者名字叫“王豫翔”,在QQ的昵称上叫“炽天使”,MSN叫“害羞的狮子王”,但其实都是同一个人。

    以下代码描述了两个对象相等,初学者要牢记,如果两个对象相等,任意的对象改变的值,会影响另一个对象的值,因为它们使用的是共同的内存。

    static void Main(string[] args)

    {

    Poker pokerA1 = new Poker(); //实例化Poker类

    pokerA1.Style = ((char)4).ToString();

    pokerA1.Title = "A";

    pokerA1.Value = 1;

    System.Console.WriteLine("{0}{1}", pokerA1.Style, pokerA1.Title);

    Poker pokerA2 = new Poker(); //实例化Poker类

    pokerA2 = pokerA1; //将pokerA1的内存空间的地址赋值给pokerA2

    System.Console.WriteLine(pokerA1 == pokerA2);

    System.Console.WriteLine(pokerA1.Value == pokerA2.Value);

    pokerA2.Style = ((char)5).ToString(); //pokerA2改变了花色

    System.Console.WriteLine("{0}{1}", pokerA1.Style, pokerA1.Title); //pokerA1的花色值也改变了

    }

    观察图3.3.3结果,并理解对象的引用关系。

    clip_image006

    图3.3.3

    初学者注意

    出现上述原因是应为C#的数据类型分为:值类型和引用类型。对象是引用类型。具体的细节在后面我们将逐步介绍,稍安毋躁。

  • 相关阅读:
    Falsy Bouncer(算法)
    Check for Palindromes(算法)
    ecshop 修改模板可输出php代码
    ecshop显示所有分类树栏目
    ecshop首页调用评论及图片
    ECSHOP 商品评论条件修改——购买过该商品且只能评价一次(购买多少次能评价多少次)
    PS4破解
    Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法
    Java中类方法与实例方法的区别
    Java中类及方法的加载顺序
  • 原文地址:https://www.cnblogs.com/shyleoking/p/1539078.html
Copyright © 2011-2022 走看看