c#基础09(类与对象)
文章目录
- 类与对象
- 面向对象概念
- 封装
- 访问修饰符
- 类
- 如何定义类
- 字段与属性
- 类的对象
- 构造方法
- this关键字
类与对象
面向对象概念
- 并不是一个技术,而是一种编程指导思想。
- 把现实世界的具体事物全部看出一个一个的对象来解决实际问题。
面向对象编程共同三大特性:封装、继承、多态。
注意:
在C#中,一切皆为object(对象)
封装
封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象。
访问修饰符
一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:
-
public
:所有对象都可以访问; -
private
:对象本身在对象内部可以访问; -
protected
:只有该类对象及其子类对象可以访问 -
internal
:同一个程序集的对象可以访问; -
protected internal
:访问限于当前程序集或派生自包含类的类型。
实现封装的方式:类的封装、属性封装、方法的封装。
封装的作用
- 隐藏细节,设置访问权限,提高安全性
- 代码复用。
- 提高代码的可读性
类
类是一组具有相同事物和行为的抽象(物以类聚)。
对象:是真实存在的具体实例。
类(设计图):是对象共同特征的描述(抽象)。
在C#中必须先设计类,才能获得对象。
如何定义类
定义类的关键字是class,命名规范为首字母大写。
<访问修饰符>class 类名
{//构造器//字段//属性//方法//事件//索引器
}public class Person
{//字段private string name;//属性public string Name{get{return name;}set{name = value;}}//方法public void eat(){Console.WriteLine("吃饭,我要吃火锅!");}
}
其中,字段,属性,方法,被统称为类的成员。字段,属性被称为成员变量,方法被称为成员方法。访问标识符指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是 internal,成员的默认访问标识符是 private。
字段与属性
字段一般是私有的(private),属于类的私有信息,如:姓名,年龄,身份证号等等信息都是属于人类的私有信息。
public class Person
{private string name;private int age;
}
示例:
public class Person
{private string name;private int age;public string Name{get{return name;}set{name = value;}}public int Age{get{return 18;}set{age = value;}}
}
小贴士:
Get,Set访问器都可以设置访问修饰符,默认的访问修饰符都是public
C#9.0之后还支持Init访问器,调用可使用属性初始化表达式语法,在创建表达式中设置这些值。但构造完成后,这些属性将变为只读。
字段与属性的区别
-
字段是私有的,属性是公开的。
-
属性具有读写器(get,set)
-
字段命名,以小驼峰命名。
-
属性并没有真正存储数据
只读属性
也就是只提供了, Get 访问器,没有Set 访问器。
public class Person
{private short orderStatepublic string OrderState{get{switch(orderState){case 1:return "待支付";case 2:return "待发货";case 3:return "待收货";case 4:return "已完成";default:return "待支付";}}}}
}
只写属性
也就是只提供了, Set 访问器,没有Get 访问
public class Person
{private string pwdpublic string Password{set { value = pwd;}}
}
属性简写
public class Person
{private string name;private int age;public string Name{get { return name; }set { value=name; }}public int Age{get { return 18; }set { value = age; }}
}
// 简化后
public class Person
{public string Name {get; set;}public int Age {get; set;}
}
类的对象
语法:
类名 对象名 = new 类名();
如:
Person per = new Person();
使用对象
访问属性: 对象名.成员属性
访问行为: 对象名.方法名(…)
示例:
using System;namespace leistudy
{internal class Program{static void Main(string[] args){#region 属性的赋值与读取//创建人类的对象Person person = new Person("李四","00156","男");//给属性赋值//person.Name = "李四";//person.Idcard = "00156";//person.Sex = "男";Console.WriteLine($"name = {person.Name}\nidcard = {person.Idcard}\nsex = {person.Sex}");//Console.WriteLine($"name = {person.name}\nidcard = {person.idcard}\nsex = {person.sex}");//方法的调用person.Eat();Person person1 = new Person("王刚","1876","男");person1.Eat();Person person2 = new Person("李白","1006","男");person2.showall();person2.Eat();Person person3 = new Person();Animal animal = new Animal(){Name = "小白",Age = 2,Color = "白色"};Console.WriteLine($"{animal.Name},{animal.Age}");//animal没有分配内存空间,只是指向了animal的地址Animal animal1 = animal;animal.Name = "小黑";Console.WriteLine(animal.Name);Console.WriteLine(animal.Age);updata(animal1);Console.WriteLine(animal.Age);//引用类型在传递参数时,传递的是地址,除了string#endregion}static void updata(Animal a){a.Age = 1000;}}
}
构造方法
构造方法的作用
- 用于初始化一个类的对象,并返回对象的地址。
- 简化对象初始化的过程
语法
修饰符 类名(形参列表)
{...
}
public class Car
{...// 无参数构造器public Car(){...}// 有参数构造器public Car(String n, String b){...}
}
初始化对象的格式
类名 对象名称 = new 构造器;
Car c = new Car();
构造器的分类
- 无参数构造器(默认存在的):初始化的对象时,成员变量的数据均采用默认值。
- 有参数构造器:在初始化对象的时候,同时可以为对象进行赋值。
注意事项
- 任何类定义出来,默认就自带了无参数构造器,写不写都有。
- 一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写一个无参数构造器了。
public class Car
{...// 无参数构造器(默认存在的)
}
public class Car
{public Car(){// 无参数构造器(需要写出来了)}public Car(String n, String b){// 有参数构造器}
}
this关键字
假设有如下一段代码:
public class Person
{private string name;private string age;public Person(string name,string age){name = name; // 此处很有可能会有问题!!age = age; // 此处很有可能会有问题!!}
}
编译器很有可能分不清 name 到底是形参还是成员变量,怎么破? this 关键字就可以帮忙解决。
this关键字
-
this关键字可以出现在成员方法、构造器中,代表当前对象的地址。
-
作用:访问当前对象的成员变量、成员方法。
public class Person
{private string name;private string age;public Person(string name,string age){this.name = name;this.age = age;}
}