首页 > 其他分享 >第九单元 面向对象一:类与对象

第九单元 面向对象一:类与对象

时间:2023-05-30 12:12:31浏览次数:53  
标签:属性 name 访问 对象 面向对象 第九 public 单元 string

假设,班级里40位同学,我们用程序保存40位学生的信息:学号,姓名,性别,生日,身份证号。如果是你,你会怎么实现?

小菜同学拿到这个题,奋书疾笔,马上写出如下代码:

ArrayList list = new ArrayList();
​
string stuNo1="10001";
string name1 = "张三";
string sex="男";
Datetime birthday1 = Datetime.Parse("1998-08-08");
string idCard1 = "362530199808080510";
list.add(stuNo1);
list.add(name1);
... list.add....
    
........//经过1个半小时后,终于到了第40位。

 

那如果是有4000,4万?你是不是立马从入门到卸载了?面向对象来告诉你解决方案!!

1. 面向对象概念

面向对象编程( OOP,Object Oriented Programming

  • 并不是一个技术,而是一种编程指导思想。

  • 把现实世界的具体事物全部看成一个一个的对象来解决实际问题。

为什么要用面向对象编程

生活中我们解决问题就是按照对象化的方式进行的。如果程序也能够按照生活的中的方式来解

决问题,那么程序就更符合人类的思维习惯,代码看起来会更易理解、更简单、更易维护。

 

面向对象编程共同三大特性:封装,继承,多态。

在C# 中,一定要时刻的牢记这句话:一切皆为object(对象);

2. 封装

封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。

抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象

访问修饰符

C# 封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。

一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:

  • public:所有对象都可以访问;

  • private:对象本身在对象内部可以访问;

  • protected:只有该类对象及其子类对象可以访问

  • internal:同一个程序集的对象可以访问;

  • protected internal:访问限于当前程序集或派生自包含类的类型。

img

实现封装的方式共有三种:类的封装,属性封装,方法的封装。

封装的作用:

  • 隐藏细节,设置访问权限,提高安全性

  • 代码复用。

  • 提高代码的可读性

3. 什么是类

类是一组具有相同事物和行为的抽象(物以类聚)。

类在实现生活中是不存在的,看不见,摸不着。例如:人类,狗类,猫科类,灵长类.... 这些事物都只是一些抽象的概念,并不是指具体的物体。如果我说:小明今天吃了三碗饭,小红的头发很长,那么,小明,小红 是指人类的具体对象,lucky(一只猫) 这个月身体长得很快,这也指的是对象,因为lucky是实实在在存在的。

人为什么不和狗分为一类?

答:因为人和狗的体征行为都不一样!!再次强调类:类是一组具有相同事物和行为的抽象(物以类聚)。人会思考,人会制作工具,而狗不会。

 

对象:是真实存在的具体实例。

类(设计图):是对象共同特征的描述(抽象)。

 

在C#中,必须先设计类,才能获得对象。

 

4. 如何定义类

定义类的关键字是class,命名规范为首字母大写,以帕斯卡(大驼峰)方式命名 如:

<访问修饰符> class 类名
{
    // 构造器(下一个单元会讲到)
    
    // 字段
    
    // 属性(特征)
    
    // 方法(行为)
    
    // 事件(C# 高级阶段学习)
    
    // 索引器(c# 高级阶段学习)
    
}

如:
public class Person
{
    // 字段
    private string name;
    
    // 属性
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            value=name;
        }
    }
    
    // 方法
    public void eat()
    {
        Console.WriteLine("吃饭,我要吃油焖大虾");
    }
}

 

其中,字段,属性,方法,被统称为类的成员。字段,属性 被称为成员变量,方法被称为成员方法

访问标识符 <access specifier> 指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是 internal,成员的默认访问标识符是 private

5. 字段与属性

字段一般是私有的(private),属于类的私有信息,如:姓名,年龄,身份证号等等信息都是属于人类的私有信息。

public class Person
{
    private string name;
    private int age;
}

 

属性是类对外提供访问字段的途径,一般是公有的(public) ,如:别人问你年龄,女孩子一般说18岁。此时她说的18岁是她自己对外主动暴露出来的,事实上她的真实年龄信息是私有的,只有她自己知道,到底是不是18岁我们其实是不清楚的。

public class Person
{
    private string name;
    private int age;
    
    public string Name
    {
        // get 访问器
        get
        {
            return name;
        }
        // set 访问器
        set
        {
            value=name;
        }
    }
    
    public int Age
    {
        get
        {
            return 18;
        }
        set
        {
            value = age;
        }
    }
}

Get, Set 访问器都可以设置访问修饰符哦,默认的访问修饰符都是public.

c# 9.0 之后 还支持 Init访问器, 调用方可使用属性初始化表达式语法 , 在创建表达式中设置这些值 。 但构造完成后,这些属性将变为只读

 

字段与属性的区别

  • 字段是私有的(private),属性是公开的(public)。

  • 属性具有读写器( get, set)

  • 字段命名,以小驼峰命名,属性以帕斯卡(大驼峰)命名。

  • 属性并没有真正存储数据

只读属性

也就是只提供了, Get 访问器,没有Set 访问器。

public class Person
{
    private short orderState
    
    public 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 pwd
    
    public string Password
    {
        set { value = pwd;} // 没有Get
    }
}

 

属性简写

如果一个类中,属性只是直接对字段进行读写,那么,这个属性字段就可进行简写。

例如:

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;}
}

 

我们刚说过,属性是对字段的封装,但是简写后的属性根本就看不到类,岂不是自相矛盾吗?其实简写属性中其实隐藏了字段,如果通过反编译工具编译 MS IL 或者通过反射技术去查看,我们会可以将它隐藏的字段读取出来。

6. 类的对象(实例)

语法:

类名 对象名 = new 类名();
如:
Person per = new Person();

  

使用对象

访问属性: 对象名.成员属性
访问行为: 对象名.方法名(…)

 

例如:

public class Person
{
    private string name
    
    public string Name
    {
        set { value = name;}
        get { return name;}
    }
    
    public void Eat()
    {
        Console.WriteLine($"姓名:{name},他正在吃饭..");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Person per1 = new Person();
        per1.Name = "张三"; // 访问属性
        per1.Eat();  // 调用成员方法
        
        Person per2 = new Person();
        per2.Name = "李四"; // 访问属性
        per2.Eat();  // 调用成员方法
    }
}

输出结果:

姓名:张三,他正在吃饭..
姓名:李四,他正在吃饭..

  

7. 构造方法

学构造方法的目的?

  • 真正知道对象具体是通过什么得到的。

  • 能够掌握为对象赋值的其他写法。

构造方法的作用

  • 用于初始化一个类的对象,并返回对象的地址。

  • 简化对象初始化的过程

语法

修饰符 类名(形参列表)
{
	...
}

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)
    {
        // 有参数构造器
	} 
}

 

8. 两个变量指向同一个对象

class Student
{
    public string Name { get; set; }
    public string Sex  { get; set; }
    public string Hobby  { get; set; }
    
    public void Study()
    {
        Console.WriteLine($"姓名:{Name},性别:{Sex},爱好:{Hobby}");
    }
}
public static void main(String[] args) 
{
    Student s1 = new Student();
    s1.Name = "小明";
    s1.Sex = '男';
    s1.Hobby = "游戏、睡觉、听课";
    s1.Study();
    // 把学生类型的s1变量赋值给学生类型的s2变量
    Student s2 = s1;
    s2.Hobby = "爱提问";
    
    Console.WriteLine(s2.Name);
    Console.WriteLine(s2.Sex);
    
    Console.WriteLine(s1.Hobby);
    s2.Study();
}

 

输出结果:

姓名:小明,性别:男,爱好:游戏、睡觉、听课
小明
男
爱提问
姓名:小明,性别:男,爱好:爱提问

  

内存分布图

思考:如果某个对象,被当作方法参数传递之后,在方法体内对象(形参)的某些属性被修改,那么实参对象的属性会发生变化吗?

9. 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;
    }
}

10 . 作业

  1. 学生类:

    • 字段:姓名,性别,成绩,零钱

    • 属性:姓名:性别,成绩( 只写Set访问器),成绩等级(成绩<60 -->差,60<= 成绩<= 70 ---> 一般,70< 成绩<=80 --->中,80<成绩 <=90--->良, 其他---->优, 并且此属性只读),零钱

    • 重载构造方法,无参,有参(姓名,性别,成绩,零钱)

  2. 学生类中定义Print 方法,将 姓名,性别,成绩,零钱等级 输出到控制台。

  3. 在学生类中,定义HelpShop()方法,意思是 学生可以帮其他同学购物,然后自己获得同学给的1元的佣金。伪代码如下:

    public class Student
    {
        // ...字段
        // ...属性
        
        /// <summary>
        /// 帮其他同学购物
        /// <summary>
        /// <param name="s">被帮助的同学</param>
        /// <param name="money">购物所花费的金额</param>
        public void HelpShop(Student s, decimal money)
        {
            
        }
    }
  4. 在Main方法中创建学生类对象,通过无参构造方法创建 s1 对象,然后给 姓名,性别,成绩,零钱 属性赋值。

  5. 在Main方法中创建学生类对象,通过有参构造方法创建 s2 对象 并初始化对象。

  6. 调用s1, s2 Print方法,查看属性值。

  7. s1 调用 HelpShop 方法, 将 s2 作为参数传递进去

  8. 再次调用Print 方法,查看s1, s2 的属性值的变化。

       

视频教程:

誉尚学教育_誉尚学教育腾讯课堂官网 (qq.com)
或者:
C# 最强入门编程(.Net 学习系列开山巨作)_哔哩哔哩_bilibili

 

标签:属性,name,访问,对象,面向对象,第九,public,单元,string
From: https://www.cnblogs.com/xuyubing/p/17442885.html

相关文章

  • 第八单元 数组与集合
    1.数组(Array)数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。声明数组变量并不是声明number0、number1、...、number99一个个单独的变量,而是声明一个就像numbers这样的变量,然后使用numbers[0]、numbers[......
  • 第六单元 流程控制
    C#流程语句分为:顺序结构,选择结构,循环结构。1.顺序结构顺序结构指的是程序一步步向下执行。inta=10;intb=a;a++;2.选择结构C#提供以下类型的选择语句。声明描述if声明一个if语句包含一个布尔表达式后跟一个或多个语句。if...else声明一个if语句可以跟......
  • 第五单元 函数(方法)
    1.函数(方法)的简介函数,在C#中更多的被称为方法。它表示一个的类所具有的行为(方法,函数)。方法的作用封装一些公共的代码,以达到功能重复利用,减少代码冗余。例如,我们经常要进行输入,输出,系统于是帮我们封装好了Console.WriteLine(),Console.ReadLine()等方法。一个方法是把一......
  • 第三单元 运算符、控制台、转义字符
    1.运算符运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C#有丰富的内置运算符,分类如下:算术运算符关系运算符逻辑运算符复合赋值运算符位运算符其他运算符本文章将逐一讲解算术运算符、关系运算符、逻辑运算符、复合赋值运算符。运算符优先级(由......
  • 第二单元 常用快捷键,注释,变量
    1.注释不写注释的程序员都是耍流氓!!名字瞎起是更是土匪!!!1.单行文本注释staticvoidMain(string[]args){//这是单行文本注释,向控制台输出一段字符串Console.WriteLine("HelloWorld!");Console.ReadLine();//接收键盘输入的一段字符串}2.多行文本注释......
  • 第一单元 .Net 平台介绍
    第一单元.Net平台介绍学习编程,电脑基本配置(当然配置越高越好):内存:初期学习8G,后期可能跟不上,最好16G以上硬盘:500G,5400转速,至少C盘是固态,全是固态最好显卡:2G,最好是独显分辨率:1920*1080CPU4核以上,i5可能已经跟不上了(台式机勉强),i7以上,最好不要用......
  • 面向对象设计领域中的参数多态,包含多态,过载多态和强制多态
    参数多态参数多态是指在面向对象编程中,方法的参数可以接受不同类型的对象,并根据实际传递的对象类型来执行不同的操作。它是多态的一种应用形式,通过参数的多态性,可以实现灵活的代码设计和重用。使用场景:当方法需要操作的对象类型不确定时,可以使用多态来接受不同类型的对象,减少......
  • SWE学习-第九节
    转移管理相同电线之间等电位的转移叫做转移管理   插入单个  插入多个左边依次点击选择,然后右边依次点击选择 ......
  • 【ABAQUS文档笔记】实体单元
    来自ABAQUSDOCUMENT/GETTINGSTARTEDWITHABAQUS/CAE/USINGCONTINUUMELEMENTS单元公式和积分fullintegration“完全积分”是指当单元具有规则形状时,对单元刚度矩阵中的多项式项进行精确积分所需的高斯点数。对于六面体和四边形元素,“规则形状”意味着边缘是直的,并以直......
  • 普加项目管理中间件示例之三:自定义单元格样式,行样式,以及单元格内容
    通过监听处理"drawcell"事件,可以根据任务信息,设置行、单元格样式,以及自定义单元格Html内容。参考示例demo/DiyDisplay.html。代码如下:project.on("drawcell",function(e){vartask=e.record,column=e.column,field=e.field;//单元格样式if(column.name......