博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C02面向对象
阅读量:4319 次
发布时间:2019-06-06

本文共 5247 字,大约阅读时间需要 17 分钟。

笔记内容有

1构造函数/构造方法

2部分类

3常量

4READONLY

5枚举

A需要掌握如何定义枚举

B如何使用枚举。

6结构体

A重点掌握与类的区别

B语法上的区别

B内存存储上的区别

结构体存储在栈空间,类存储在堆空间

1. 构造函数/构造方法

从语文的角度我们发现,构造函数首先是1个方法,只不过是1特殊的方法.

2. 造函数是1特殊的方法.

a. 语法特殊

访问修饰符绝大多数情况下直接是pubic.

构造函数没有返回值. void都不要写.

构造函数的名称必须与所在的类名相同.

b. 执行时机

1).  构造方法不能被程序员手动的调用.

Dog d = new Dog();

创建对象的小括弧.有什么作用.

调用对象的构造方法.

2). 构造函数的执行时机

在创建对象的时候,自动的被new关键字调用.

只有当new关键字的四件事情都做完了的情况下 才算创建对象成功.

c. 在创建对象的时候,必须要调用对象的构造函数.

3. 构造函数可以带参数.   

如果构造函数带了参数,那么在创建对象的时候 必须要给构造函数的参数传值.

把实参的值直接的写在创建对象的小括弧之中.

4. 构造函数也是可以重载的.

也就是说可以有多个构造函数那么在创建对象的时候,可以调用任意的1个构造函数来完成对象的创建.

如何确定调用那1个构造函数呢?

在创建对象的小括弧后面,通过实参的个数和类型自动匹配,匹配到那1个构造函数就调用那1,匹配不到就报错.

 

5. 造函数的作用

a. 构造函数的最大的特点在创建对象的同时自动执行.

b. 什么时候使用构造函数

如果有段代码,我们希望在创建对象的同时就自动执行那么我们就可以把这段代码放在构造函数中.

虽然这样,但是我们建议不要在构造函数写1些特别耗性能和时间的代码.

因为构造函数中的代码执行完毕之后.才算对象创建完毕如果构造函数的执行要花很多时间,就会影响创建对象的效率.

 

大多数程序员使用构造函数来初始化对象的属性的值.

构造函数的参数写上对象的属性的类型

然后在方法中将传入的参数赋值给对应的属性.

这就可以达到强制的效果.让用户在创建对象的时候 必须为属性赋值.

 

6. 当我们没有为类写任意的构造函数的时候编译器在编译的时刻会自动的为这个类生成1个无参数的空方法体的构造函数.我们就把编译器自动生产的这个构造函数叫做 隐式构造函数 

所以,当我们没有为类写任意的构造函数的时候,我们仍然可以调用无参数的构造函数来创建对象.

         *    

如果我们为类写了任意的1个构造函数,那么编译器在编译的时候 就不会再为我们生成那个无参数的构造函数了.

如果我们就是要调用无参数的构造函数 那么就写1个就可以了.

 

7. 构造函数不能被程序员手动的调用:

a. 在普通的方法当中,不能调用构造函数.  但是在构造函数中可以调用普通的方法.

b. 构造函数之间能否相互调用.

构造函数之间是可以相互调用的.

语法:

         *       public Person(string name,int age)

         *         :this()

         *       {

         *       }

         *       public Person()

         *       {

         *       }

执行顺序如果A构造函数调用了B构造函数如果在创建对象的时候调用的是A构造函数.

先调用A构造函数.

再调用B构造函数

再执行B构造函数

再执行A构造函数.

         *     

c. 之所以要调用构造函数,是因为我们想重用构造函数中的代码.

在调用另外的1个构造函数并给其串参数的的时候,参数我们可以直接给1数据.

在传递参数的时候,可以使用本构造函数的参数.

         *      

构造函数不可以同时调用多个构造函数,但是可以1个调1.

部分类

1. 在同1个命名空间中,不允许定义多个类并且他们的名字相同.

             * 

2. 如果在同1个命名空间中,有多个名字相同的类并且他们都被partial关键字修饰.

这样是可以的.

他们叫做部分类/伙伴类

他们实质上是1个类只不过分开写而已.

物理上将他们分开写,实际上他们还是1个类.

所以可以在1个部分类中访问另外1个部分类中的成员.

3. 构造部分类的条件

a. 必须在同1个命名空间下.

b. 类名必须相同

c. 都被 partial 修饰

1. 常量const修饰的数据叫做常量.

常量的值1旦声明,就无法更改.

* 2. 为什么常量的无法改变?

经过反编译,我们发现声明常量的那句话不见了.

在使用常量的地方 直接用常量的值 代替了.

就算可以改也没有任何意义.

3. 声明常量的时候

a. 常量声明的同时必须要赋值.

b. 常量的值要求在编译的时候就可以确定.

             *    

在编译的时候,编译器无法知道变量的值有在运行起来的时候才知道.

4. 常量可以是局部的,也可以使成员的.

当常量作为成员变量的时候通过类名直接点出来访问.而不是通过对象名,

 

5. 什么时候我们可以定义常量

如果有1个数据在整个程序的运行期间都不会发生变化

那么这个时候我们可把这个数据定义为常量以提高程序的运行效率.

 

readonly

* 1. 类中的成员.

             *    目前为止,我们可以在类中定义如下成员

             *    字段

             *    方法

             *    属性

             *    构造函数

             *    

             *    执行代码只能写在方法中不能直接写在类下面.

             * 

             * 2. 在声明类的字段的时候如果我们赋了默认值.

             *    发现编译的时候,字段并没有默认值.

             *    将赋值的代码放在了构造函数中区了.

             *    

             * 3. 在类里面.只允许定义字段、定义方法、定义属性、定义构造函数.

             *    在定义字段的时候,C#语法允许我们为字段赋初始值 虽然这也是执行代码.

             *    只不过在编译的时候,编译器将赋值的执行的代码放在了构造函数中去了.

4. readonly.  只读字段.

readonly修饰的字段叫做只读字段.

只读字段,一旦声明 其值就无法更改.

a.  访问方式,要通过对象名点出来访问.

b.  并不是像const那样是使用的地方直接用值代替.

只读字段的值只可以在构造函数中更改其他的地方是不能更改的.

const的区别:

const的值必须要在编译的时候就确定就是在写代码的时候就要确定const的值.

             *   readonly的值在运行的时候 在构造函数里面确定.

             *   

             *   什么时候使用readonly

             *   a. 一旦声明 不允许在后面改它.

             *   b. 但是这个数据的值必须要运行代码计算出来.

             * 

             * --------------------------------------------------

             * 1. readonly读字段的值 只允许在 构造函数中更改.

             * 

             * 2. const的最大区别: const是编译时确定   readonly运行时确定.

             * 

             * 3. 如果某1个数据的取值一旦确定,就不允许更改的话.

a. 如果这个数据的取值在编写代码的时候就能确定具体取值这个时候用const最合适.

b. 如果这个数据的取值在编写代码的时候不能确定具体的取值,但是我知道这个数据的值是如何算出来的.

这个时候我们就可以把它定义为只读字段,然后在构造函数中为其赋值.

             * 

             * 

             * 

             */

   -----------------------------------------------------------------------------------------

枚举:

* 1. 如果要声明1个变量来保存1个人的性别.

             *    某个变量的取值只会是两个中的1.  bool类型是最合适的.

             *    

             * 2. 如果某个变量的取值我们要限定在一个范围之内.

             * 3. 使用枚举

作用:来限定变量的取值范围.

 

定义枚举的位置和类一样,定义在命名空间下面,建议1个类型独占1个源文件.

语法:

  enum 枚举的名称

  {

要限定的取值.将每1个值用逗号分隔.

}

定义在枚举中的11个值 我们称之为 枚举成员、枚举值、枚举项.

1个枚举项使用逗号分隔.

特别注意:  枚举项不需要加双引号因为加了双引号就是字符串 而枚举并不是字符串.

*    

*4. 使用枚举

声明1个枚举类型的变量就可以了.

当我们为这个枚举类型的变量赋值的时候,就只能赋定义在枚举中的枚举项值

赋值的时候,必须通过枚举的名称点出枚举成员来.

             * 

5. 默认情况下每1个枚举项都有1个对应的int类型的数.0开始依次的递增

通过强制转换的语法 可以去到枚举项对应的int类型的数.

 Direction dir = Direction.North;

 int i = (int)dir;

             *     

同样我们也可以将int类型的数 强制的 转换为 它对应的枚举值.

  int i = 3;

  Direction dir = (Direction)i;

 

6. 我们可以手动的为每1个枚举项指定它对应的int类型的数.

直接在枚举项的后面通过=号直接指定它对应的int类型的数.

             *    

建议在定义枚举值的时候,一定要为1个枚举项指定1个对应的int类型的数,那么这个数从0开始.

这样方便后期的代码维护.   

7. 将字符串转换为枚举

Direction dir = (Direction)Enum.Parse(typeof(Direction), strDir);

Direction dir = (Direction)Enum.Parse(typeof(Direction), strDir,true); 忽略大小写的转换

             * 

8. 枚举是1个值类型.

枚举的值直接存储在枚举变量之中.

* 1. 结构体和类非常的相似.

结构体也是用来表示1类具有相同特征和行为的事物的.

2. 定义结构体的位置和类一样,在命名空间下.

定义结构体的语法:

struct 结构名称

{

         *        

}

         * 

3. 结构体中可以定义字段.

结构体中也可以定义方法.

结构体中也可以定义属性

结构体中也可以定义构造函数

结构体只有创建对象,才可以使用对象中的成员.

  

4. 结构体与类到底有没有区别?

1). 语法上的区别

a. 定义结构体使用struct 定义类使用class

b. 虽然结构体可以声明字段,但是在声明字段的时候不允许给字段初始值.

c. 无参数的构造函数在结构体中总是自动存在的,所以我们不能写1个无参数的构造函数.

d. 在结构体的构造函数中,要求为结构体对象的每1个字段赋值.

e. 在构造函数中为属性赋值,并不认为是在为字段赋值要求在构造函数中直接为字段赋值.

 

 

 

f. 创建结构体对象 可以使用new关键字来创建,也可以不使用new关键字来创建.

两种方式创建对象的区别.

如果时候用new创建那么这个结构体对象的所有的字段就有值了因为new调用了构造函数,而结构体的构造函数要求为所有的字段赋值.

就算我们调用无参数的构造函数创建对象,这个结构体对象的字段也是有值的,.所以我们不难猜出无参数的构造函数中为所有的字段赋默认值

         *       

         * 

如果不使用new创建因为没有调用构造函数所以这个结构体对象的字段是没有值的.

所以在使用结构体对象的字段之前 必须要为字段赋值.

2). 结构体如何在内存中存储的?

a. 在声明结构体变量的时候就已经在这个变量中创建好了结构体对象.

new关键字在这里只是调用了构造函数

 

b. 结构体对象并不存储在堆空间中,而是存储在栈空间的变量之中.

         *        

所以结构体与类最大的区别结构体对象存储在栈空间中,类的对象存储在堆空间之中.

         *           

c. 结构体是值类型的因为结构体的对象直接存储在结构体变量中.

5. 为什么不运行为字段给初始值?

因为就算我们为字段赋值,实际上编译器是将赋值的代码放到构造函数中去的,

而我们创建结构体对象完全可以不调用构造函数

6. 结构体变量在相互赋值的时候是将源对象中的字段的值逐个的拷贝个目标对象的字段.

         * 

7. 什么时候使用结构体?

a. 结构体对象的最大的特点 存储 在栈空间.

b. 内存中栈空间比较小堆空间相对较大.

栈空间中的数据访问速度相对较快.

堆空间中的数据访问速度相对较慢.

 

c. 结构体是存储在栈空间中的.所以如果我们把对象以结构体的方式存储在栈中 那么访问速度就会快.

但是如果结构体中有很多成员那么定义成结构体的话  就会在栈中占很多空间 反而会影响效率.

         *       

d. 当我们要表示1个轻量级对象(就是成员很少,特别是字段很少)的时候就可以定义为结构体 让其存储在栈中 提高效率.

当我们要表示1个重量级对象.就表示为类,让对象存储在堆中

         *       

         *    

//R红色G Green  B Blue

     

 

转载于:https://www.cnblogs.com/kksguijiao/articles/3815458.html

你可能感兴趣的文章
HTTPS
查看>>
git add . git add -u git add -A区别
查看>>
CentOS7 重置root密码
查看>>
Centos安装Python3
查看>>
PHP批量插入
查看>>
laravel连接sql server 2008
查看>>
Laravel框架学习笔记之任务调度(定时任务)
查看>>
Swagger在Laravel项目中的使用
查看>>
Laravel 的生命周期
查看>>
Nginx
查看>>
Navicat远程连接云主机数据库
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
【2020-3-21】Mac安装Homebrew慢,解决办法
查看>>
influxdb 命令行输出时间为 yyyy-MM-dd HH:mm:ss(年月日时分秒)的方法
查看>>
jxl写入excel实现数据导出功能
查看>>
linux文件目录类命令|--cp指令
查看>>
.net MVC 404错误解决方法
查看>>
linux系统目录结构
查看>>
git
查看>>
btn按钮之间事件相互调用
查看>>