C#学习笔记22: 面向对象编程入门精讲(上)

简介: C#学习笔记22: 面向对象编程入门精讲

1.1 官方编程文档

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Specifications\2052\CSharp Language Specification.doc

1.2 类与结构

image.png

结构只能定义带参构造函数,不能继承和派生,但可以实现接口

结构中不能实例字段初始值

20190711225709584.png


1.3 引用类型与值类型

类是引用类型

class Program
    {
        static void Main(string[] args)
        {
            person p1 = new person();
            person p2 = p1;
            p1.Name = "Jack";
            p1.Age = 30;
            Console.WriteLine(p2.Name + p2.Age.ToString());
            p1.Name = "Bob";
            p1.Age = 27;
            Console.WriteLine(p2.Name + p2.Age.ToString());
        }
    }
    class person
    {
        public string Name { set; get;}
        public int Age { set; get; }
    }

20190711231648340.png

结构是值类型

    class Program
    {
        static void Main(string[] args)
        {
            person p1 = new person();
            person p2 = p1;
            p1.Name = "Jack";
            p1.Age = 30;
            Console.WriteLine(p2.Name + p2.Age.ToString());
            p1.Name = "Bob";
            p1.Age = 27;
            Console.WriteLine(p2.Name + p2.Age.ToString());
        }
    }
    struct person
    {
        public string Name { set; get;}
        public int Age { set; get; }
    }

20190711231622384.png

20190711231738724.png

引用对象与值对象的总结

20190711231858825.png

1.4 ref参数与out参数

        static void getPerson1(person p)
        {
            p.Name = "Amiee";
            p.Age = 25;
        }
//此版本对参数p的操作会反应到实参中
        static void getPerson2(person p)
        {
            p = new person("Ray", 27);
        }
//此版本在传参数时,参数p指向的实参对象,但是进入函数后,参数p的指向发生了变化,对p参数的操作便不会再反映到实参中

上述两个函数的阐述传递过程如下:

20190712213607899.png

为解决上述问题,引入ref参数和out参数:

ref参数传入前必须初始化,out传入前不用初始化

        static void getPerson3(ref person p)
        {
            p = new person("Ray", 28);
        }
        static void getPerson4(out person p)
        {
            p = new person("Ray", 29);
        }


image.png

均完成了对实参的修改

1.5 方法重载

具有不同返回值的同名方法可重载

具有不同参数个数、参数类型和参数顺序的同名方法

有无ref或out修饰符修饰的同名方法

1.6 静态类与静态成员

静态类的所有成员都必须的是静态的

类的静态成员可用类名直接调用

1.7 继承与多态

(1)可访问性

20190712215357919.png

对internal可访问性的验证见博文https://blog.csdn.net/m1m2m3mmm/article/details/95667772


(2)继承


子类构造时,线调用父类的构造函数再调用自己的构造函数;子类对象被销毁时,先调用自己的析构函数再调用父类的析构函数

在继承时,子类的访问属性不高于父类的访问属性,比如基类是internal则不允许子类被定义为public

(3)覆盖与多态


子类会自动覆盖基类中定义的非virtual关键字修饰的同名方法,但此时直接定义子类对象,调用的是子类的同名方法;若定义指向子类的父类对象,调用的是父类的同名方法;

使用virtual关键字修饰的方法,在被指向子类的基类对象调用时,实际上调用的是子类对象的方法;直接定义子类对象时,调用的是子类自己的同名方法

(4)定义不可被继承的类

sealed class  ClassName
{
};
相关文章
|
2月前
|
存储 编译器 数据处理
C#基础入门之数据类型
C#基础入门之数据类型
|
4月前
|
Java C#
C# 面向对象编程解析:优势、类和对象、类成员详解
OOP代表面向对象编程。 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象。 面向对象编程相对于过程式编程具有几个优势: OOP执行速度更快,更容易执行 OOP为程序提供了清晰的结构 OOP有助于保持C#代码DRY("不要重复自己"),并使代码更易于维护、修改和调试 OOP使得能够创建完全可重用的应用程序,编写更少的代码并减少开发时间 提示:"不要重复自己"(DRY)原则是有关减少代码重复的原则。应该提取出应用程序中常见的代码,并将其放置在单一位置并重复使用,而不是重复编写。
52 0
|
11天前
|
程序员 C#
C#编程中的面向对象编程思想
【4月更文挑战第21天】本文探讨了C#中的面向对象编程,包括类、对象、封装、继承和多态。类是对象的抽象,定义属性和行为;对象是类的实例。封装隐藏内部细节,只暴露必要接口。继承允许类复用和扩展属性与行为,而多态使不同类的对象能通过相同接口调用方法。C#通过访问修饰符实现封装,使用虚方法和抽象方法实现多态。理解并应用这些概念,能提升代码的清晰度和可扩展性,助你成为更好的C#程序员。
|
12天前
|
IDE 程序员 C#
C#编程入门:从零开始的旅程
【4月更文挑战第20天】本文引导初学者入门C#编程,从环境搭建开始,推荐使用Visual Studio Community版作为IDE。接着,通过编写"Hello, World!"程序,介绍基本语法,包括数据类型、运算符和表达式。文章还涉及控制结构、函数和方法,以及面向对象编程概念。通过学习,读者将对C#有初步了解,并激发进一步探索编程世界的兴趣。
|
3月前
|
开发框架 .NET 程序员
C#/.NET该如何自学入门?
C#/.NET该如何自学入门?
|
4月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
75 2
|
4月前
|
C#
C# 继承、多态性、抽象和接口详解:从入门到精通
在 C# 中,可以将字段和方法从一个类继承到另一个类。我们将“继承概念”分为两类: 派生类(子类) - 从另一个类继承的类 基类(父类) - 被继承的类 要从一个类继承,使用 : 符号。 在以下示例中,Car 类(子类)继承了 Vehicle 类(父类)的字段和方法:
36 2
|
4月前
|
程序员 C#
C# 面向对象编程进阶:构造函数详解与访问修饰符应用
构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值
47 1
|
4月前
|
C#
C# 布尔值和条件语句:入门指南和实用示例
在编程中,通常需要一个只能有两个值之一的数据类型,比如: 是 / 否 开 / 关 真 / 假 为此,C# 有一个 bool 数据类型,可以取 true 或 false 的值。
71 3
|
4月前
|
存储 C#
C#入门开发(Hello World,运算符)
C#入门开发(Hello World,运算符)
28 0