C#面向对象三大特性的封装
面向对象三大特性
封装、继承、多态
封装
广义上:任何只要把一些代码和数据集中到封闭的作用域区间中我们都认为是一种封装
狭义上:将类的某些信息(字段)隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的一些特有的方法(Get和Set访问器)来实现对隐藏信息进行操作和访问
意义:
隐藏类中实现细节。
只能通过规定的方式或者是方法来访问数据
方便在程序中添加一些控制性语句
方便后续的代码的迭代和更新
如何使用封装步骤:
1.设置类中的字段为私有的,即使用关键字private
2.创建公有的属性,在属性中添加get和set方法-->用于对私有字段进行读和写操作。
3.在Get和Set方法中添加对私有字段的一些控制性语句(对一些些合法性数据的校验)
属性
类中的属性是为了对类中的字段进行读写操作
一般情况下,属性本身不作为数据的存储容器
属性也可以设置默认值
语法格式:
public 数据类型 属性名称
{
get{
return 字段名称;
}
set{
字段名称=value;
}
}
public数据类型属性名称{get;set}=属性值;------->这种情况下可以设置属性值一般不用
读写属性
我们可以灵活的通过添加Get和Set访问器来对属性进行读写操作
添加get属性.....>读操作权限
添加set属性----->写操作权限
示例:
//定义一个教室类 internal class Tacher {private string _name;private int _age;public string Name { get { return _name; } set { _name = value;}} public int Age { get { return _age; } set { _age = vaalue;}} }
构造方法
构造方法主要是用来创建类的对象的(类的实例化)附带效果,可以对对象中的字段进行初始化(赋值)
语法格式
//语法格式: public当前类名(参数列表) {//对当前类中的字段进行赋值 } 示例public class Student //定义两个字段 private string _name; private int _age; //给当前类定义一个构造方法--带参构造方法 public Student(string name, int age) { name = name; _age = age; } //给当前类定义一个无参构造方法 public Student() { }
备注:
有参构造方法,在对象创建时,字段的默认值由开发者传入赋值
无参构造方法,在对象创建时,字段的默认值由系统传入赋值(默认值)
如果在类中没有手动定义构造方法,系统会默认赠送一个无参构造方法,但如果开发者在类中手动定义了一个构造方法,系统赠送的无参构造方法就收回了。此时个人还想使用无参构造方法,需要开发者自己定义出来
类中的构造方法是支持方法重载的
构造方法没有显示的返回值,不需要在定义构造方法时声明返回值类型
静态构造函数方法
静态构造方法在创建第一个实例或引用类中静态成员之前自动调用,并且在整个程序运行中自会加载一次
静态构造方法是为了初始化类中的静态数据
特点:
1.不能添加任何访问权限修饰符,不能含有任何参数
2.不支持方法重载
3.用户不能手动调用,是程序运行的一种特殊方法
4.静态构造方法是在普通构造方法之前先加载。
//没有访问权限修饰符 不能带有参数,加载时机时调用实例构造方法或调用类中的静态成员之前加载 static 类名称 {}
私有构造方法
表示的是该方法只能在当前类中使用或者创建对象,不能在外类中进行类的实例化
它的访问权限修饰符使用privater
namespace_02_私有构造方法 internal class Program { static void Main(string[] args){ // People people = new People(); People people = People.GetInstance(); } } //定义一个类 internal class People { //默认有一个无参构造方法 //但是一旦自己定义了构造方法,此时类中将不再有无参构造方法 //定义成私有的private private People() { } //此时该类需要提供一个可以对外能够访问到的静态方法 public static People GetInstance() { return new People(); } //如果类中的构造方法定义成私有的,也就代表着该类中所有的信息都是是静态的,需要通过类名来进行访问
析构函数
主要是用于清理回收程序中创立的实例对象
特点:
只能在类中定义,不能在结构体中定义
一个类中只能定义一个析构函数,所以不支持重载
析构函数不能声明带有返回值类型
析构函数也不能手动调用,只能由程序自动调用
析构函数不能添加任何访问修饰符,也不能带有任何参数
internal class Program { static void Main(string[] args) { People p1 = new People(); People p2 = new People People p3 = new People Console.WriteLine("程序即将结束"); 3 //定义一个class类 internal class People { public People() { Console.WriteLine("创建了一个People对象"); } //定义析构函数 ~People() } Console.WriteLine("这是People类的析构函数"); //System.Console. } }
备注:
析构函数是用于释放程序中创建的对象,如果对象创建一次,析构函数执行一次,如果对象创建多次,析构函数执行对应的次数
析构函数是在程序即将结束的时候执行,自动执行的
static关键字
internal class Program {public static void Main(string[] agrs){} }
static关键字在C#程序中表达的是静态的,它是一个修饰符,可可以修饰类,字段,属性,方法,常量等等信息
当类中的某个信息被static修饰,那就代表该信息是一个静态的,静态的就代表着它是属于类的,不再属于对象的,无法通过对象来访问,只能通过类名来访问
通过类名访问的方式我们称之为静态方式,通过对象的方式访问我们称之为实例方式。
1.当static修饰类的时候代表该类是一个静态类
在静态类中,只能定义静态信息:静态的字段,静态的属性,静态的方法
静态类不能进行实例化(创建对象)
2.当static 修饰方法的时候,代表方法时一个静态方法
在静态方法中,不能直接访问非静态信息(实例信息):非静态字段,非静态属性,非静态的方法
3.当static 修饰属性或者字段时候代表他是一个静态属性或者静态字段
它既可以在静态方法中也可以在非静态方法中使用.
它不能通过对象来访问,只能通过类名来访问。
this关键字
翻译过来是:这个,这,用于指代某个信息的,具体指代它所在的当前类的一个实例化对象
this指代:谁调用了我,我就指代谁
namespace_05_this关键字 { internal class Program } static void Main(string[] args) { Student student = new Student(); student.id = 10001; student.name="张三"; Student student2 = new Student(); student2.id = 10002; student2.name="张四"; student.Show(/*student*/); } } //定义一个类 internal class Student { public int id; public string name; } //this可以指代对象做区别通过对象调用的自然就是字段(成员变量~全局变量) public Student(int id, string name) { //就近原则 this.id = id; this.name = name; } //指代当前类的一个对象,谁调用我,我就指代谁 public void Show(/*Student student*/) { //隐藏了对象的调用 //Student student = new Student(); Console.WriteLine(/*this.*/id+"----" + /*this.*/name); } } }