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