4.类的基本概念
目录
4.1 类的概述
类是一种活动的数据结构
4.2 程序和类:一个快速实例
4.3 声明类
4.4 类成员
4.4.1 字段
1.显示和隐式字段初始化
2. 声明多个字段
4.4.2 方法
4.5 创建变量和类的实例
4.6 为数据分配内存
合并这两个步骤
4.7 实例成员
4.8 访问修饰符
私有访问和共有访问
1.公有访问和私有访问图示
2.成员访问实例
4.9 从类的内部访问成员
4.10 从类的外部访问成员
4.11 综合应用
4.1 类的概述
在上一章中,我们看到C#提供了用户6种用户定义类型。其中最重要的,也是首先要阐述的是类。因为类在C#中是个很大的主题,关于它的讨论将会延伸到接下来的几章。
类是一种活动的数据结构
在面向对象的分析和设计产生之前,程序员们仅把程序当做指令的序列。那时的焦点主要放在指令的组合和优化上。随着面向对象的出现,焦点从优化指令转移到组织程序的数据和功能上来。程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并被称为类。
类是一个能存储数据并执行代码的数据结构。它包含数据成员和函数成员。
- 数据成员 它存储与类或类的实例相关的数据。数据成员通常模拟该类所表示的现实世界事物的特性。
- 函数成员 它执行代码。通常会模拟类所表示的现实世界事物的功能和操作。
一个C#类可以有任意数目的数据成员和函数成员。成员可以是9种可能的成员类型的任意组合。这些成员类型如表4-1所示。本章将会阐述字段和方法。
4.2 程序和类:一个快速实例
一个运行中的C#程序是一组相互作用的类型对象,他们中的大部分是类的实例。例如,假设有一个模拟扑克牌游戏的程序。当程序运行时,他有一个名为Dealer的类的实例,它的工作就是运行游戏。还有几个名为Player的类实例,他们代表游戏的玩家。
Dealer对象保存纸牌的当前状态和玩家数目等信息。它的动作包括洗牌和发牌。
Player类有很大不同。它保存玩家名称以及用于押注的钱的信息,并实现如分析玩家当前手上的牌和出牌这样的动作。运行中的程序如图4-1所示。类名显示在方框外面,实例名显示在方框内。
一个真正的程序无疑会包含除Dealer和Player之外的许多其他的类,还会包括像Card和Deck这样的类。每一个类都模拟某种扑克牌游戏中的事物。
4.3 声明类
或许你能猜到,虽然类型int、double和char由C4#定义,但像Dealer和Player这样的类不是由语言定义的。如果想在程序中使用他们,你必须自己定义,通过编写类的声明定义类。
类的声明定义类的特征和成员。它并不创建类的实例,但创建了用于创建实例的模板。类的声明提供下列内容:
- 类的名称;
- 类的成员;
- 类的特征。
下面是一个最简单的类声明语法示例。大括号包含了成员的声明,他们组成了类主体。类成员可以在类主体内部以任何顺序声明。这意味着成员的声明完全可以引用另一个在后面的类声明中才定义的成员。
4.4 类成员
字段和方法是最重要的类成员类型。字段是数据成员,方法是函数成员。
4.4.1 字段
字段是隶属于类的变量。
- 它可以是任何类型,无论是预定义类型还是用户定义类型。
- 和所有变量一样,字段用来保存数据,并具有如下特性;
- 他们可以被写入;
- 它们可以被读取。
声明一个字段最简单的语句如下:
1.显示和隐式字段初始化
因为字段是一种变量,所以字段初始化语句在语法上和上一章所描述的变量初始化语句相同。
- 字段初始化语句是字段声明的一部分,由一个等于号后面跟着一个求值表达式组成。
- 初始化值必须是编译时可确定的。
class Myclass
{
int F1 = 17; //字段初始值
}
- 如果没有初始化语句,字段的值会被编译器设置为默认值,默认值由字段类型决定。简单类型的默认值见表3-1(第三章)。可是总结起来,每种类型的默认值都是0,bool型是false,引用类型默认为null。
例如,下面的代码声明了4个字段,前两个字段被隐式初始化,另外两个字段被初始化语句显示初始化。
2. 声明多个字段
可以通过用逗号分隔名称的方式,在同一条语句中声明多个相同类型的字段,但是不能再一个声明中混合不同的类型。例如,可以把之前的4个字段声明结合成两条语句,并有相同的语义结果。
4.4.2 方法
方法是具有名称的可执行代码块,可以从程序的很多不同的地方执行,甚至从其他程序中执行。(还有一种没有名称的匿名方法,将在第13章讨论)
当方法被调用(call/invoke)时,他执行自己所含的代码,然后返回到调用它的代码并继续执行调用代码。有些方法返回一个值到他们被调用的位置。方法相当于C++中的成员函数。
声明方法最简单的语法包括以下组成部分。
- 返回类型 它声明了方法返回值的类型,如果一个方法不返回值,那么返回值被指定为viid。
- 名称 这是方法的名字。
- 参数列表 它至少由一对空的圆括号组成。如果有参数(参数将在下一章阐述),将被列在圆括号中间。
- 方法体 他由一对大括号组成,大括号内包含执行代码。
例如,下面的代码声明了一个类,带有一个名称为PrintNums的简单方法。从这个声明中可以看出下面几点关于PrintNums的情况:
- 他不返回值,因此返回类型指定为void;
- 他由空的参数列表
- 它的方法体有两行代码,第一行打印数字1,第二行打印数字2.
4.5 创建变量和类的实例
类的声明只是用于创建类的实例的蓝图。一旦类被声明,就可以创建类的实例。
- 类是引用类型,正如你从上一章学到的,这意味着它们要为数据引用和实际数据都申请内存。
- 数据的引用保存在一个类类型的变量中。所以,要创建类的实例,需要从声明一个类类型的变量开始。如果变量没有被初始化,它的值是未定义的。
图4-2阐明了如何定义保存引用的变量。左边顶端的代码是类Dealer的声明,下面是类Program的声明,它包含Main方法。Main声明了Dealer类型的变量TheDealer,因为变量没有初始化,它的值是未定义的,如图4-2的右边所示。
4.6 为数据分配内存
声明类类型的变量所分配的内存是用来保存引用的,而不是用来保存类对象实际数据的。要为实际数据分配内存,需要使用new运算符。
- new运算符为任意指定类型的实例分配并初始化内存。他依据类型不同从栈或堆里分配。
- 使用new运算符组成一个对象创建表达式,它的组成如下;
- 关键字new;
- 要分配内存的实例的类型名称;
- 成对的圆括号,可能包括参数或没有参数(后面会进一步讨论参数);
- 如果内存分配给一个引用类型,则对象创建表达式返回一个引用,指在堆中被分配并初始化的对象实例。
要分配和初始化用于保存类实例数据的内存,需要做的工作就是这些。下面是使用new运算符创建对象创建表达式,并把它的返回值赋给类变量的一个例子:
图4-3左边的代码展示了用于分配内存并创建类Dealer实例的new运算符,随后实例被赋值给类变量。右边的图展示了内存的结构。
合并这两个步骤
可以将这两步骤合并起来,用对象创建表达式来出初始化变量。
4.7 实例成员
类声明相当于蓝图,通过这个蓝图想创建多少个类的实例都可以。
- 实例成员 类的每个实例都是不同的实体,他们有自己的一组数据成员,不同于同一类的其他实例。因为这些数据成员都和类的实例相关,所以被称作实例成员。
- 静态成员 实例成员时默认类型,但也可以声明与类而不是实例相关的成员,称为静态成员,我们将会在第6章阐述。
下面代码是实例成员的示例,展示了由3个Player类实例的扑克牌程序。图4-4表明每个实例的Name字段都有不同的值。
4.8 访问修饰符
从类的内部,任何函数成员都可以使用成员的名称访问类中任意的其他成员。
访问修饰符是成员声明的可选部分,指明程序的其他部分如何访问成员。访问修饰符放在简单声明形式之前。下面是字段和方法声明的语法:
5种成员访问控制如下。本章将阐明前两种,其他的在第7章阐述。
- 私有的(private);
- 共有的(public);
- 受保护的(protected);
- 内部的(internal)
- 受保护内部的(protected internal)。
私有访问和共有访问
私有成员只能从声明它的类的内部访问,其他的类不能看见或访问它们。
- 私有成员是默认的访问级别,所以,如果一个成员在声明时不带访问修饰符,那他就是私有成员。
- 还可以使用private访问修饰符显示的将一个成员声明为私有。隐式地声明私有成员和显式地声明在语义上没有不同,两种形式是等价的。
例如,下面的两个声明都指定了private int 成员:
实例的公有成员可以被程序中的其他对象访问。必须使用public访问修饰符指定公有访问。
1.公有访问和私有访问图示
本文中的插图把类表示为标签框,如图4-5所示;
- 类成员被表示为类框中的小标签框;
- 私有成员被表示为完全封闭在它们的类框 中;
- 公有成员被表示为部分伸到它们的类框之外。
2.成员访问实例
类C1声明了公有和私有的字段和方法,图4-6阐明了类C1的成员的可见性。
4.9 从类的内部访问成员
如前所属,类的成员仅用其他类成员的名称就可以访问它们。
例如,下面的类声明了类的方法对字段和其他方法的访问。即使字段和两个方法被声明为private,类的所有成员还是都可以被类的任何方法(或者任何函数成员)访问。图4-7阐明了这段代码。
4.10 从类的外部访问成员
要从类的外部访问实例成员,必须包括变量名称和成员名称,中间用句点(.)分隔。这称为点运算符(dot-syntax notation),将会在以后更详细地讨论。
例如,下面代码的第二行展示了一个从类的外部访问方法的实例:
举个例子,下面的代码声明了两个类:DaysTemp和Program。
- DaysTemp内部的两个字段被声明为public,所以可以从类的外部访问它们。
- 方法Main是类Program的成员。他创建了一个变量和类DaysTemp的对象,并赋值给对象的字段。然后把它读取字段的值打印出来。
4.11 综合应用
下面的代码创建两个实例并把它们的引用保存在名称为t1和t2的变量中。图4-8阐明了内存中的t1和t2.这段代码示范了目前为止讨论的使用的3中行为:
- 声明一个类;
- 创建类的实例;
- 访问类的成员(也就是写入和读取字段)。
相关文章:
4.类的基本概念
目录 4.1 类的概述 类是一种活动的数据结构 4.2 程序和类:一个快速实例 4.3 声明类 4.4 类成员 4.4.1 字段 1.显示和隐式字段初始化 2. 声明多个字段 4.4.2 方法 4.5 创建变量和类的实例 4.6 为数据分配内存 合并这两个步骤 4.7 实例成员 4.8 访问修饰…...
有图解有案例,我终于把 Condition 的原理讲透彻了
哈喽大家好,我是阿Q! 20张图图解ReentrantLock加锁解锁原理文章一发,便引发了大家激烈的讨论,更有小伙伴前来弹窗:平时加解锁都是直接使用Synchronized关键字来实现的,简单好用,为啥还要引用Re…...
Linux之找回root密码
文章目录前言一、启动系统二、进入编辑界面三、修改密码前言 当我们使用root用户登陆Linux时,忘记了登陆密码,改怎样修改登陆密码呢,接下来将介绍如何修改root密码 一、启动系统 首先,启动系统,进入开机界面&#x…...
stack_queue | priority_queue | 仿函数
文章目录1. stack 的使用2. stack的模拟实现3. queue的使用4. queue的模拟实现5. deque ——双端队列deque优缺点6. priority_queue ——优先级队列1. priority_queue的使用2. priority_queue的模拟实现push——插入pop ——删除top —— 堆顶仿函数问题完整代码实现1. stack 的…...
第十四届蓝桥杯三月真题刷题训练——第 14 天
目录 第 1 题:组队 题目描述 运行限制 代码: 第 2 题:不同子串 题目描述 运行限制 代码: 思路: 第 3 题:等差数列 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码: 思…...
【Hadoop-yarn-01】大白话讲讲资源调度器YARN,原来这么好理解
YARN作为Hadoop集群的御用调度器,在整个集群的资源管理上立下了汗马功劳。今天我们用大白话聊聊YARN存在意义。 有了机器就有了资源,有了资源就有了调度。举2个很鲜活的场景: 在单台机器上,你开了3个程序,分别是A、B…...
技术掉:PDF显示,使用pdf.js
PDF 显示 场景: 其实直接显示 pdf 可以用 iframe 标签,但产品觉得浏览器自带的 pdf 预览太丑了,而且无法去除那些操作栏。 解决方案:使用 pdf.js 进行显示 第一步:引入 pdf.js 去官网下载稳定版的 pdf.js 文件 然后…...
有关pytorch的一些总结
Tensor 含义 张量(Tensor):是一个多维数组,它是标量、向量、矩阵的高维拓展。 创建 非随机创建 1.用数组创建 将数组转化为tensor np.ones([a,b]) 全为1 #首先导入PyTorch import torch#数组创建 import numpy as np anp.arr…...
基础IO【Linux】
文章目录:文件相关知识C语言文件IOstdin & stdout & stderr系统文件 IOopenclosewriteread文件描述符文件描述符的分配规则重定向dup2系统调用FILEFILE中的文件描述符FILE中的缓冲区理解文件相关知识 文件 文件内容 文件属性(每一个已经存在的…...
Vue3——自定义封装上传图片样式
自定义封装上传图片样式 一、首先需要新建一个自组建完善基础的结构,我这里起名为ImgUpload.vue <el-upload name"file" :show-file-list"false" accept".png,.PNG,.jpg,.JPG,.jpeg,.JPEG,.gif,.GIF,.bmp,.BMP" :multiple"…...
ChatGLM-6B (介绍以及本地部署)
中文ChatGPT平替——ChatGLM-6BChatGLM-6B简介官方实例本地部署1.下载代码2.通过conda创建虚拟环境3.修改代码4.模型量化5.详细代码调用示例ChatGLM-6B 简介 ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 General Language Model (GLM) 架构&…...
react的基础使用
react中为什么使用jsxReact 认为渲染逻辑本质上与其他 UI 逻辑内在耦合,比如,在 UI 中需要绑定处理事件、在某些时刻状态发生变化时需要通知到 UI,以及需要在 UI 中展示准备好的数据。react认为将业务代码和数据以及事件等等 需要和UI高度耦合…...
letcode 4.寻找两个正序数组的中位数(官方题解笔记)
题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 1.二分查找 1.1思路 时间复杂度:O(log(mn)) 空间复杂度:O(1) 给定…...
【面试题系列】K8S常见面试题
目录 序言 问题 1. 简单说一下k8s集群内外网络如何互通的吧 2.描述一下pod的创建过程 3. 描述一下k8s pod的终止过程 4.Kubernetes 中的自动伸缩有哪些方式? 5.Kubernetes 中的故障检测有哪些方式? 6.Kubernetes 中的资源调度有哪些方式ÿ…...
字符函数和字符串函数(上)-C语言详解
CSDN的各位友友们你们好,今天千泽为大家带来的是C语言中字符函数和字符串函数的详解,掌握了这些内容能够让我们更加灵活的运用字符串,接下来让我们一起走进今天的内容吧!写这篇文章需要在cplusplus.com上大量截图,十分不易!如果对您有帮助的话希望能够得到您的支持和帮助,我会持…...
全连接神经网络
目录 1.全连接神经网络简介 2.MLP分类模型 2.1 数据准备与探索 2.2 搭建网络并可视化 2.3 使用未预处理的数据训练模型 2.4 使用预处理后的数据进行模型训练 3. MLP回归模型 3.1 数据准备 3.2 搭建回归预测网络 1.全连接神经网络简介 全连接神经网络(Multi-Layer Percep…...
深度学习目标检测ui界面-交通标志检测识别
深度学习目标检测ui界面-交通标志检测识别 为了将算法封装起来,博主尝试了实验pyqt5的上位机界面进行封装,其中遇到了一些坑举给大家避开。这里加载的训练模型参考之前写的博客: 自动驾驶目标检测项目实战(一)—基于深度学习框架yolov的交通…...
ubuntu不同版本的源(换源)(镜像源)(lsb_release -c命令,显示当前系统的发行版代号(Codename))
文章目录查看unbuntu版本名(lsb_release -c命令)各个版本源代号(仅供参考,具体代号用上面命令查)各版本软件源Ubuntu20.10阿里源:清华源:Ubuntu20.04阿里源:清华源:Ubunt…...
linux入门---程序翻译的过程
我们在vs编译器中写的代码按下ctrl f5就可以直接运行起来,并且会将运行的结果显示到显示器上,这里看上去只有一个步骤但实际上这里会存在很多的细节,比如说生成结果在这里插入代码片之前我们的代码会经过预处理,编译,汇…...
springboot复习(黑马)
学习目标基于SpringBoot框架的程序开发步骤熟练使用SpringBoot配置信息修改服务器配置基于SpringBoot的完成SSM整合项目开发一、SpringBoot简介1. 入门案例问题导入SpringMVC的HelloWord程序大家还记得吗?SpringBoot是由Pivotal团队提供的全新框架,其设计…...
C++指针详解
旧文更新:两三年的旧文了,一直放在电脑里,现在直接传上CSDN 一、指针的概念 1.1 指针 程序运行时每个变量都会有一块内存空间,变量的值就存放在这块空间中。程序可以通过变量名直接访问这块空间内的数据,这种访问方…...
tauri+vite+vue3开发环境下创建、启动运行和打包发布
目录 1.创建项目 2.安装依赖 3.启动项目 4.打包生成windows安装包 5.安装打包生成的安装包 1.创建项目 运行下面命令创建一个tauri项目 pnpm create tauri-app 我创建该项目时的node版本为16.15.0 兼容性注意 Vite 需要 Node.js 版本 14.18,16。然而&#x…...
安卓进阶系列-系统基础
文章目录计算机结构冯诺依曼结构哈弗结构冯诺依曼结构与哈弗结构对比安卓采用的架构安卓操作系统进程间通讯(IPC)内存共享linux内存共享安卓内存共享管道Unix Domain Socket同步常见同步机制信号量Mutex管程安卓同步机制安卓中的Mutex安卓中的ConditionB…...
10 Wifi网络的封装
概述 Wifi有多种工作模式,比如:STA模式、AccessPoint模式、Monitor模式、Ad-hoc模式、Mesh模式等。但在IPC设备上,主要使用STA和AccessPoint这两种模式。下面分别进行介绍。 STA模式:任何一种无线网卡都可以运行在此模式,这种模式也是无线网卡的默认模式。在此模式下,无线…...
手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常实用)
简介 Jetbrains家族和Pycharm版本划分: pycharm是Jetbrains家族中的一个明星产品,Jetbrains开发了许多好用的编辑器,包括Java编辑器(IntelliJ IDEA)、JavaScript编辑器(WebStorm)、PHP编辑器&…...
开发板与ubantu文件传送
接下来的所以实验都通过下面这种方式发送APP文件到开发板运行 目录 1、在ubantu配置 ①在虚拟机上添加一个桥接模式的虚拟网卡 ②设定网卡 ③在网卡上配置静态地址 2、开发板设置 ①查看网卡 ②配置网卡静态ip 3、 测试 ①ping ②文件传送 传送报错情况 配置环境&#…...
如何成为一名优秀的网络安全工程师?
前言 这是我的建议如何成为网络安全工程师,你应该按照下面顺序学习。 简要说明 第一件事你应该学习如何编程,我建议首先学python,然后是java。 (非必须)接下来学习一些算法和数据结构是很有帮助的,它将…...
面试问题之高并发内存池项目
项目部分 1.这个项目是什么? 高并发内存池的原型是谷歌一个开源项目,tcmalloc,而这个项目,就是tcmalloc中最核心的框架和部分拿出来进行模拟。他的作用就是在去代替原型的内存分配函数malloc和free。这个项目涉及的技术有,c&…...
如果阿里巴巴给蒋凡“百亿补贴”
出品 | 何玺 排版 | 叶媛 2021底,阿里内部进行组织架构大调整,任命蒋凡为阿里海外商业负责人,分管全球速卖通和国际贸易(ICBU)两个海外业务,以及Lazada等面向海外市场的多家子公司。 一年时间过去&#x…...
Linux版本现状
Linux的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Red Hat(RHEL红帽)为代表,后者以Debian为代表。Red HatRedhat,应该称为Redhat系列&…...
广州专门做网站的公司/推广计划书范文
求职 地图 网页 应用 更多 关键词:C/C面试技巧及试题? C/C 试题有难有易,不能因为容易,我们就轻视,更不能因为难,我们就放弃。我们面对高薪就业的态度永远不变,那就是坚持、坚持、再坚持。出现问…...
网站建设详细方案/大一html网页制作作业简单
上网查了一下,官方貌似没有提供flash builder 4.5的下载,但是既然是基于eclipse的,那么应该能被安装在linux下。 首先,安装eclipse sudo apt-get install eclipse 然后,下载eclipse的flash builder 插件 最后就是安装了…...
web开发是做网站/宁德市人社局官网
说明本文假定读者已具备基本的C编译知识。如非特殊说明,文中“源文件”指 * .c文件,“头文件”指 *.h文件,“引用”指包含头文件。一、头文件作用C语言里,每个源文件是一个模块,头文件为使用该模块的用户提供接口。接口…...
重庆中小企业建站价格/惠州seo外包公司
海伊布控球对接海康Ehome协议平台安装调试手册 1、进入布控球机芯设置: 打开 浏览器登录海康机芯网页192.168.1.64,登录账号:admin 密码:abcd1234 2、路由网关设置: 打开Netplay配置软件查看设备的IP信息,在浏览器网…...
福州自适应网站建设/海淀区seo全面优化
1.安装git2.如图所示:在AS 的File->Settings->Version Control->Git 配置git.exe命令路径,然后点击Test,提示successfully,则配置成功。3.在gitosc上创建仓库,获取仓库地址。4.创建AS项目。5.在AS中选择项目,…...
wordpress制作xml/专业黑帽seo
C#与Javascript变量、函数之间的相互调用 问:1.如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在C#中访问JavaScript函数?问题1答案如下:javaScript函数中执行C#代码中的函数:方…...