按引用传参,方法修改形参,通常实参也会被修改

按值传参,方法修改形参,实参不会被修改

引用类型变量存储的不是对象的值,存储的是对象的地址(复习)
枚举enum,是值类型
枚举中不能定义字段属性和方法
枚举值是从0递增的整数
通过有限范围限定了取值的范围,比string类型更容易防止错误的输入。
若采用枚举enum
public enum Gender{//在类里写,如果不在,就不加public修饰符
男,女
//由于是值类型,系统提示是Gender0和1代表男女,这个被调用时可用强制转换写成(Gender)0、(Gender)1
}
字段采用:
private Gender sex = Gender.男;//不能直接把字符串直接赋值给Gender类型,也可以是(Gender)0
然后是属性:
public Gender Sex{ get{ ; } set { ; } }
构造方法也需要:
public Child(Gender sex){}
初始化对象传入的性别参数也需要
//或者是Child c1 = new Child("刘小牛",(Gender)0);
Child c1 = new Child("刘小牛",Gender.男);
sturct结构关键字
sturct与类class类似,也可以创建字段、属性和方法
sturct结构是值类型,类class是引用类型
与类有四点不同,以下为代码
struct Dog{
string _name;
//1、与类不同,结构里的字段是不能赋值的,类中的字段是可以有初始值的,结构不可以
//string _name="旺财"是错的
public string Name{//Ctrl+R+E字段创建属性的快捷方式
get{
return _name;
}
set{
_name = value;
}
}
public void Speech(){ }
//2、带参结构的构造方法,结构里不允许出现无参的构造方法,类里允许有无参构造(默认隐藏)
public Dog(string name){
_name = name;//3、与类不同,结构里的带参构造方法里面必须让形参为所有的字段赋值
}
}
Main方法里面
static Dog dog;
static void Main(string[] args){
//4、与类不同,结构的对象可以不实例化
//前三行里面的dog对象直接在main方法外生成。
//Dog dog = new Dog();
dog.Name = "小白";
dog.Speech();
}

值类型:int、char、double、bool...
引用类型:类(特别说明:string类型是类,也是引用类型)、数组、接口
值类型存储的特点:值类型变量存储对象的值,赋值会创建值的副本。修改任何一个副本,不会影响其他的副本。
珍妮吃她的棒棒糖,永远不会影响到马克手里的那一支。
引用类型存储的特点:引用类型变量存储对象的内存地址,赋值不会创建值的副本,只会创建地址的副本。修改任何一个副本,也会同时修改其他的副本。
马克和珍妮只能看到经过对方换台后的电视。
Child c1 = new Child();
c1.Name = "张小明";
Child c2 = c1;//注意这里不是实例化,没有产生一个新对象,c2占据取代了c1的存储,c1修改了其属性
c2.Name = "刘小勇";
Console.WriteLine(c1.Name);
Console.WriteLine(c2.Name);
结果输出:
两行刘小勇
c1的值被替代了。

我的理解:构造方法初始化对象就叫实例化
带参构造方法初始化对象和无参构造方法初始化对象各有利弊
对象初始化器初始化对象:
使用用类的无参构造方法,但与无参构造方法初始化对象有所不同
类名 对象名 = new 类名() { };||或者是类名 对象名 = new 类名 { };
类名后不加括号也一样
Child _child = new Child{Name = "张三",Age = 5 };
好处:
相对于无参构造方法初始化对象,可读性更好一点。
并且在创建此初始化语句时括号内会有编译提示,对个人而言编译更好
注意一点,构造方法重载与普通方法重载几乎相同。
重载方法若形参类型和形参数量相同不可行(但多个参数顺序不同是可行的)(复习)
系统会在调用方法时按调用时输入的实参类型和实参数量自动选择执行那个重载方法
但带有参数构造方法存在,则默认无参的构造方法就没了。
你可以重载默认的构造方法(就是写一个无参数的构造方法,避免无参调用时编译出错)
带参构造方法的形参名与当前类里的字段/属性名字相同时,用this关键字解决
this关键字可以用来访问当前类里的字段、属性和方法
this.PlayBall();//如果没有命名冲突,不写this前缀也可以
private string sex;
public Child (string sex){
//this 当前对象(this.sex代表当前类里的这个sex字段)(后面没有this的sex是带参构造方法里的形参)
this.sex = sex;
}
视频里面的带参构造方法,是把调用的形参的值赋值给属性和字段,
里面的_sex虽然被private修饰符已经赋值是“男”,但可以在构造方法赋值成“女”
一个类可以有多个重载方法,只要参数类型和参数数量不同就行
构造方法,常见于实例化类对象中
Child child = new Child();//这个Child()就是构造方法
但是我们这个类里面并没有直接创建这个方法,默认是隐藏的。
如果没有显示定义构造方法,则会有一个默认的无参数的构造方法;如果定义了构造方法(类名+()),则没有了默认构造方法
构造方法的作用:为属性赋值
(属性非字段,字段往往我们不希望别人直接改和赋值,往往是private私有修饰符,属性有get(获得字段值return返回获得字段值)set(字段赋值于value)访问器,为public修饰符)
构造方法调用,只能用“new 方法名()”的形式调研构造方法(就是实例化)
以Child类为例
(自写构造方法,写了这个默认构造方法作废,实例化调用不能再无脑写“new 方法名()”要看构造方法里面有没有类型定义的值)
//1、构造方法通常声明为public
//2、构造方法没有返回值类型void、int等
//3、构造方法名要与类名相同
public Child(string name)
{
}
方法返回值过程
方法返回值类型应该写成返回值相同的类型
方法执行到最后,return关键字返回计算结果
调用时需要一个与返回值类型相同的变量,来接受调用语句的结果
这样就完成了,有返回值方法的调用
方法里的return关键字作用之一是结束调用这个方法。
方法重载:
同一个类中
1、方法名字相同,
但参数(形参)类型不同,重写方法实现对不同类型参数的操作!
(已存在方法名字相同,相同类型和相同数量的参数再重载的方法会报错!)
(比如已存在一个int形参重载的方法,再来一个int形参且只有一个形参的重载方法就不行)
调用时,调用方法输入的实参会被自动识别实参类型调用的是哪一个重载方法
2、方法名字相同
但参数(形参)数量不同,针对参数关联操作
调用此方法注意调用方法里面参数(实参)要全
方法的
形参:只是通过数据类型修饰符创建了个(字段)参数,没有实际值
实参:有实际值的参数,拥有实际值的变量或常量,方法调用括号里面的字符串是常量
调用时main方法调用的方法会把实参赋值给被调用类里面的方法的形参,但往往省略了字段赋值过程,直接在方法括号内输入赋值,比如EatSugar("榴莲糖")其实是EatSugar(suger = "榴莲糖")
Ctrl+R+E:
封装快捷键
封装
目的:不建议其他代码使用此类随意进行实例化进行赋值
将字段通过属性封装(隐藏,类外无法睡意访问,修饰符为public),get、set特别方法(访问器)
get用于读
set用于赋值(写),如果不想类外方法随意进行对此类的赋值,可以在这里进行限制甚至是不写set
意义:
初学感觉没有多大的意义
但是这个类的字段,几个月后发现不能为空
如果有属性,可直接在属性的set里面加入条件
如果没有,则需要找到这个类所有被实例化的地方,一一改正,并加上条件
(这个时候加属性已经晚了,因为属性名字不能跟字段名字一样,你字段的实例化还要一一找出来并改成属性名字,不要想着偷鸡)
封装:隐藏对象的信息,留出访问的接口
类和对象 定义类 对象的实例化
把字段封装成属性 封装 访问修饰符 只读…
方法 无参方法 有参方法 重载 返回值
构造方法 带参构造this对象初始化器
值类型与引用类型 结构 枚举 out ref
结构是值类型,类是引用类型
用对象初始化器为对象赋初值:
1)Child child3=new Child { Name=“周润发”,Age=5};//使用的是类的无参构造方法,代码更简洁。
定义了有参构造方法后,就不会有默认的无参构造,需添加定义语句才可执行
当定义字段与形参重名时,可用this.形参代替,this表示当前对象
参数封装快捷方式:ctrl+r+e
只读属性无法赋值
每个属性赋值需要一个单独语句,代码可读性变差,可以定义带参方法
一个类中可以定义多个方法的重载:
public Child() { }
public Child(string name,string sex,string age) { }
构造方法的作用:为属性赋值
如果没有显示定义构造方法,则会有一个默认的无参数的构造方法
如果显示定义了有参构造方法,则不能有无参的构造方法
只能用new 方法名()的形式调用构造方法
构造方法通常声明为public
构造方法名没有返回值类型
构造方法名必须与类名相同
F11为逐步调试快捷键
return只能返回一个值,out能返回多个值
ref:使值类型参数,可以按引用传参,声明时加ref,引用时同样加ref
按引用传参,方法修改形参,通常实参也会被修改;
按值传参,方法修改形参,实参不会被修改
枚举是值类型;
枚举中不能定义字段属性和方法;
枚举值是从0递增的证书,可以用枚举值赋值,也可以用枚举项序列号赋值
结构struct(对应类class):
结构是值类型,类是引用类型
结构中可以定义字段、属性和方法
不能为结构中的字段赋初始值
结构的构造方法中必须为所有字段赋值
不能为结构显式定义无参数的构造方法(public void struct不允许)
结构类型的对象可以不实例化
值类型变量存储对象的值,赋值会创建值的副本,修改任何一个副本,不会影响其他的副本
引用类型变量存储对象的内存地址,赋值不会创建值的副本,指挥此案件地址的副本,修改任何一个副本,也同时修改其他的副本
值类型:int char double bool
引用类型:类(包括string) 数组 接口