3.类和对象

3.面向对象-封装-类和对象


3.1 知识点

知识回顾:面向对象概念回顾

  • 万物皆对象
  • 用程序来抽象(形容)对象
  • 用面向对象的思想来编程

什么是类

  • 基本概念
  • 具有相同特征
  • 具有相同行为
  • 一类事物的抽象
  • 类是对象的模板
  • 可以通过类创建出对象
  • 类的关键词: class

类声明在哪里

  • 类一般声明在 namespace 语句块中

类声明的语法

class 类名
{
    // 特征——成员变量
    // 行为——成员方法
    // 保护特征——成员属性

    // 构造函数和析构函数
    // 索引器
    // 运算符重载
    // 静态成员
}

类声明实例

// 这个类是用来形容人类的
class Person
{
    // 特征——成员变量
    // 行为——成员方法
    // 保护特征——成员属性

    // 构造函数和析构函数
    // 索引器
    // 运算符重载
    // 静态成员
}

// 这个类用来表示机器
class Machine
{
    // 特征——成员变量
    // 行为——成员方法
    // 保护特征——成员属性

    // 构造函数和析构函数
    // 索引器
    // 运算符重载
    // 静态成员
}

什么是(类)对象

  • 基本概念
  • 类的声明和类对象(变量)声明是两个概念
  • 类的声明相当于声明了一个自定义变量类型
  • 对象是由类创建出来,相当于声明一个指定类的变量
  • 类对象都是引用类型

实例化对象基本语法

  • 类名 变量名;(只声明没有使用)
  • 类名 变量名 = null; (null 代表空)
  • 类名 变量名 = new 类名();(会调用类的构造函数,相当于开了新房间)

实例化对象

主函数内

Person p1; // 只声明没有使用,在栈上会分配内存,默认为空,不分配堆内存空间
Person p2 = null; // null 代表空,在栈上会分配内存,不分配堆内存空间
Person p3 = new Person(); // 相当于一个人对象
Person p4 = new Person(); // 相当于又是一个人对象,和 p1, p2, p3 完全独立

// 注意
// 虽然他们是来自一个类的实例化对象
// 但是他们的特征、行为等信息都是独有的
// 千万千万不要觉得他们共享了数据,两个人你是你,我是我,彼此没有关系

Machine m1 = new Machine();
Machine m2 = new Machine();

// 面向对象编程就是开启了女娲模式、造物模式,想要什么对象就 new 什么对象
// 一切的对象都是由我们来控制的,我们相当于是整个程序世界的总导演

总结

  • 类的声明和类对象的声明是两个概念
  • 类的声明是声明对象的模板,用来抽象(形容)显示事物的
  • 类对象的声明是用来表示现实中的对象个体的
  • 类是一个自定义的变量类型
  • 实例化一个类对象是在声明变量

3.2 知识点代码

using System;

namespace Lesson1_类和对象
{
    #region 知识回顾 面向对象概念回顾
    //万物皆对象
    //用程序来抽象(形容)对象
    //用面向对象的思想来编程
    #endregion

    #region 知识点一 什么是类
    // 基本概念
    // 具有相同特征
    // 具有相同行为
    // 一类事物的抽象
    // 类是对象的模板
    // 可以通过类创建出对象
    // 类的关键词
    // class
    #endregion

    #region 知识点二 类申明在哪里
    //类一般申明在namespace语句块中
    #endregion

    #region 知识点三 类申明的语法
    class 类名
    {
        //特征——成员变量
        //行为——成员方法
        //保护特征——成员属性

        //构造函数和析构函数
        //索引器
        //运算符重载
        //静态成员
    }
    #endregion

    #region 知识点四 类申明实例

    //命名:用帕斯卡命名法 
    //注意:同一个语句块中的不同类 不能重名

    //这个类是用来形容人类的
    class Person
    {
        //特征——成员变量
        //行为——成员方法
        //保护特征——成员属性

        //构造函数和析构函数
        //索引器
        //运算符重载
        //静态成员
    }

    //这个类用来表示机器
    class Machine
    {
        //特征——成员变量
        //行为——成员方法
        //保护特征——成员属性

        //构造函数和析构函数
        //索引器
        //运算符重载
        //静态成员
    }

    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("类和对象");

            #region 知识点五 什么是(类)对象
            // 基本概念
            // 类的申明 和 类对象(变量)申明 是两个概念  
            // 类的申明 类似 枚举 和 结构体的申明  类的申明相当于申明了一个自定义变量类型
            // 而对象 是类创建出来的 
            // 相当于申明一个指定类的变量
            // 类创建对象的过程 一般称为实例化对象
            // 类对象 都是引用类型的
            #endregion

            #region 知识点六 实例化对象基本语法
            //类名 变量名;(只声明没有使用)
            //类名 变量名 = null; (null代表空)
            //类名 变量名 = new 类名();(会调用类的构造函数,相当于开了新房间)
            #endregion

            #region 知识点七 实例化对象 

            //主函数内

            Person p1;//只声明没有使用 在栈上会分配内存 默认为空 不分配堆内存空间
            Person p2 = null;//null 代表空 在栈上会分配内存 不分配堆内存空间
            Person p3 = new Person();//相当于一个人对象
            Person p4 = new Person();//相当于又是一个人对象 和p1p2p3完全独立

            //注意
            //虽然他们是来自一个类的实例化对象
            //但是他们的 特征 行为等等信息 都是他们独有的
            //千万千万 不要觉得他们是共享了数据 两个人 你是你 我是我 彼此没有关系

            Machine m1 = new Machine();
            Machine m2 = new Machine();

            //面向对象编程 就是开启了 女娲模式 造物模式 想要什么对象 就new什么对象
            //一切的对象  都是由我们来控制的 
            //我们相当于是整个程序世界的 总导演

            #endregion

        }
    }

    // 总结

    // 类的申明 和 类对象的申明 是两个概念
    // 类的申明 是申明对象的模板 用来抽象(形容)显示事物的
    // 类对象的申明 是用来表示现实中的 对象个体的

    // 类是一个自定义的变量类型
    // 实例化一个类对象 是在申明变量
}

3.3 练习题

食物分类

  • 机器:机器人、机器、汽车、飞机
  • 人:人、张阿姨、隔壁老王
  • 动物:猫、人、张阿姨、隔壁老王
  • 植物:向日葵、菊花、荷花
  • 星球:星星

GameObject A 和 B 的关系

GameObject A = new GameObject();
GameObject B = A;
B = null;

A 仍然为 new 出来的 GameObject。因为 A 在堆分配内存,在栈上分配了指向堆的地址。GameObject B = A 时,A 和 B 的栈上存的指向堆的地址相同。B = null 后,B 在栈上存的指向堆的地址变为空,相当于指向堆内存的连接断了。但 A 仍然指向原先的内存。

GameObject A 和 B 的关系

GameObject A = new GameObject();
GameObject B = A;
B = new GameObject();

A 和 B 没有关系。因为 A 在堆分配内存,在栈上分配了指向堆的地址。GameObject B = A 时,A 和 B 的栈上存的指向堆的地址相同。B = new GameObject() 后,在堆上新开了一个 GameObject 的房间,B 在栈上存的是新开的 GameObject 的地址,与 A 没有关系。


3.4 练习题代码

using System;

namespace Lesson1_练习题
{
    class GameObject
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("类和对象练习题");

            #region 练习题一
            //将下面的事物进行分类,可重复
            //机器人、机器、人、猫、张阿姨、隔壁老王、汽车、飞机、向日葵、菊花、太阳、星星、荷花

            //机器:机器人、机器、汽车、飞机
            //人:人、张阿姨、隔壁老王
            //动物:猫、人、张阿姨、隔壁老王
            //植物:向日葵、菊花、荷花
            //星球:星星

            #endregion

            #region 练习题二
            //GameObject A = new GameObject();
            //GameObject B = A;
            //B = null;
            //A目前等于多少?

            //A仍然为new出来的GameObject
            //因为A 在堆分配内存 在栈上分配了指向堆的地址
            //GameObject B = A时 A和B的栈上存的指向堆的地址相同
            //B = null后 B在栈上存的指向堆的地址变成空 相当于指向堆内存的连线断了
            #endregion

            #region 练习题三
            GameObject A = new GameObject();
            GameObject B = A;
            B = new GameObject();
            //A和B有什么关系?

            //没有关系
            //因为A 在堆分配内存 在栈上分配了指向堆的地址
            //GameObject B = A时 A和B的栈上存的指向堆的地址相同
            //B = new GameObject()后 在堆上新开了一个GameObject的房间
            //B在栈上存的是新开的GameObject的地址 和A没有关系

            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏