C#学习笔记7:C#面向对象编程方法(1)

今日继续我的C#学习笔记

主要用实际代码编程来学习研究C#面向对象的编程方法:直接看代码及注释即可:

目录

1、对类与对象概念的快速认知:

2、类和对象成员访问控制:

3、类的构造函数和析构函数:

4、类的属性:

5、类的继承重载与多态:


1、对类与对象概念的快速认知:

创建一个C#控制台应用程序OOExample,在其中编写一个Person类,在Person类中定义相应的属性与方法,最后实例化Person类,输出相应信息

1、类的定义与创建

2、私有成员定义与方法

3、成员变量定义及运用

 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*
 * 创建一个C#控制台应用程序OOExample,在其中编写一个Person类,
 *在Person类中定义相应的属性与方法,最后实例化Person类,输出相应信息
 */

namespace OOExample
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Person Person1 = new Person(); //用new实例化Person得到Person1
            //分别调用Person1的各个方法成员
            Person1.set("张三","男","20");//初始化Person1的个人信息方法
            Person1.show();//输出Person1的个人信息方法
            Person1.eat("Apple");//输出想吃的苹果的信息
            Console.ReadLine();//等待输入用于屏幕暂停
        }

        public class Person//定义Person类
        {
            private string name;//私有成员变量name
            private string sex;//私有成员变量sex
            private string age;//私有成员变量age

            //成员方法set,用于设置某个人姓名,性别,年龄
            public void set(string namein,string sexin,string agein)
            {
                name = namein;
                sex = sexin;
                age = agein;
            }
            //成员方法show,用于输出某个人姓名、年龄、性别具体信息
            public void show()
            {
                Console.WriteLine("姓名:{0}\n性别:{1}\n年龄:{2}\n",name,sex,age);
            }
            //成员方法eat ,用于输出想吃的食物信息
            public void eat(string sth)
            {
                Console.WriteLine("我想吃:{0}",sth);
            }
        }
    }
}

运行结果:

2、类和对象成员访问控制:

写一控制台程序(关于成员访问控制及各种修饰符作用),从程序中分析访问控制权限

(1)public:

用这种修饰符修饰的成员称为公有成员。公有成员允许该类和其他类中的所有
成员访问。

(2)private:

用这种修饰符修饰的成员称为私有成员。私有成员只能被该类中的其他成员访问,其他类(包括派生类)中的成员是不允许直接访问的。在C#中private是默认的修饰符。

(3)protected:

用这种修饰符修饰的成员称为保护成员。保护成员可以被该类和其派生类中的成员访问,而其他类中的成员则不允许访问。


(4)interna:

用这种修饰符修饰的成员称为内部成员。内部成员只能被程序集内的类的成员访问,而程序集外的类(包括派生类)的成员是不允许访问的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Fcontrol
{
    internal class Program
    {
        static void Main(string[] args)
        {
            first F = new first();
            F.pub = "main set first class public";//正确,允许访问其他类中的公有成员
            //F.pro = "main set first class protected";//错误,不允许访问其他类中保护成员
            //F.pri = "main set first class private";//错误,不允许访问其他类中的私有成员
        }

        //基础类first
        class first
        {
            public string pub;//公有成员
            protected string pro;//保护成员
            private string pri;//私有成员

            void fun()
            {
                pub = "public in first";//正确;允许访问本类中公有成员
                pro = "protected in first";//正确;允许访问本类中保护成员
                pri = "privatr in first";//正确;允许访问本类中私有成员
            }
        }

        //类second继承了基础类first
        class second :first
        {
            void fun1()
            {
                base.pub = "second set first class public";//正确;允许访问基类中公有成员
                base.pro = "second set first class protected";//正确;允许访问基类中保护成员
                //base.pri = "second set first class private";//错误;不允许访问基类中私有成员
            }
        }
    }
}

3、类的构造函数和析构函数:

创建控制台应用程序,使用构造函数,从程序结果分析中体会构造函数的使用

(1)构造函数的名称必须与类名同名,不允许有返回类型,要使用public修饰符修饰,否则在非派生类中不能调用它来创建对象。而一般方法不能和类名相同。
(2)构造函数的功能主要用于在类的对象创建时定义初始化状态。没有返回值,也不能用void 来修饰。
(3)一个类可以定义多个构造函数,成为构造函数的重载,但是重载的构造函数与重载的函数一样,其参数列表必须有所不同(参数个数不同或者参数类型不同)。
(4)构造函数不能直接被调用,必须通过new运算符在创建对象时才会自动调用。
(5)在定义类时,如果没有显式定义构造函数,则实例化对象时会自动调用默认的构造函数。如果一旦定义了构造函数,则默认构造函数不会被调用。默认构造函数的作用是将对象成员的析始值设置为默认的值,如数值类型变量被初始化为0,字符电型变量被初始化为(空值),字符类型变量被初始化为空格等

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gouzaoxigou
{
    internal class Program
    {
        static void Main(string[] args)
        {
            A a1 = new A();//调用无参数构造函数
            a1.fun();

            A a2 = new A("张三");//调用一个参数构造函数
            a2.fun();

            A a3 = new A("张三", 20);//调用俩个参数构造函数
            a3.fun();

            Console.ReadLine();
        }

    }

    class A
    {
        string name;
        int age;

        //无参数构造函数
        public A() { }
        //一个参数构造函数
        public A(string name)
        {
            this.name = name;  
        }
        //俩个参数构造函数
        public A(string name, int age)
        {
            this.name = name;
            this.age = age;
        }

        public void fun()
        {
            Console.WriteLine("姓名:{0}  年龄:{1}",name,age);
        }
    }

}

4、类的属性:

 类还有一种特殊的成员称为属性,既可以被视作一种成员变量,也可以看作是一种成员方法,实际上是对成员变量的一种拓展。

编写控制台应用程序,定义一个类,在类中定义private字段 age 及对应的属性Age,在属性的 set 程序块中编写代码,实现对属性的赋值进行检查。在类中定义一个方法,在Main()方法中实现其调用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lei_Attribute
{
    internal class Program
    {

        static void Main(string[] args)
        {
            Human.Age = 30;//通过属性Age给字段age赋值
            Console.WriteLine(Human.Printinfo());//输出字段age的值
            Console.ReadLine();
        }
        class Human
        {
            private static int age;
            //属性的主要作用是对字段的读和写,因此又把属性叫做字段访问器,get为读访问,set为写访问
            public static int Age
            {
                get { return age; }
                set
                {
                    if (value > 0) { age = value; }//如果赋值给age的值大于0则保存
                    else { age = 0; }
                }
            }
            public static int Printinfo() { return age; }
        }

    }


}

 

5、类的继承重载与多态:

类的重要特征之一就是类的继承。继承是指一个类可以维承另一个类中的相关成员,被继承的类称为基类,继承而形成的类称为派生类。如果一个派生类继承一个基类,那么这个派生类会从其基类中维承得到所有的操作、属性、特征、事件,而基类中的实例构造函数、析构函数则不会被继承。
继承是指一个派生类或子类能够直接获得基类或父类已有的性和方法,不需要重复定义。继承具有传递性,但C#只支持单继承,也就是说一个类最多只允许从一个父类中派生,即只能有一个父类,但一个父类可以派生出多个子类。继承的语法格式为:

class 基类名
{
    成员;
}
class 派生类名:基类名
{
    成员;
}

创建控制台程序,通过在类中分别定义不同作用域的字段变量,并访问这些字段,来分析类、子类的作用域

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;

namespace lei_BclassD_jicheng
{
    internal class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.Show();
            b.Shownew();

            Console.ReadLine();
        }

        public class A
        {
            private int priv;
            protected int prot;
            public void Show()
            {
                priv = 20;
                prot = 30;
                Console.WriteLine("private={0} protected={1}",priv,prot);
                Console.WriteLine("父类内容");
            }
        }

        public class B : A 
        {
            public void Shownew()
            {
                //priv=40;//错误写法:父类中的private私有类在子类不可访问
                prot = 50;//对,父类中protected保护类在子类可以访问
                Console.WriteLine("protected={0}",prot);
                Console.WriteLine("子类内容");
            }
        }
    }
}

 

 

 

相关推荐

  1. C++面向对象学习笔记

    2024-04-03 07:52:04       13 阅读
  2. C++面向对象学习笔记

    2024-04-03 07:52:04       8 阅读
  3. C++面对对象编程

    2024-04-03 07:52:04       34 阅读
  4. 使用 C# 学习面向对象编程:第 3 部分

    2024-04-03 07:52:04       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 07:52:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 07:52:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 07:52:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 07:52:04       20 阅读

热门阅读

  1. 如何在 Ubuntu 12.04 上添加交换空间

    2024-04-03 07:52:04       12 阅读
  2. 抖音小程序中跳转页面怎么写?

    2024-04-03 07:52:04       20 阅读
  3. 全栈的自我修养 ———— uniapp中封装api请求

    2024-04-03 07:52:04       13 阅读
  4. vue-uniapp的页面参数

    2024-04-03 07:52:04       15 阅读
  5. 阿里云python-SDK配置

    2024-04-03 07:52:04       9 阅读
  6. MySQL面试题系列-3

    2024-04-03 07:52:04       12 阅读
  7. 七、Mybatis-缓存

    2024-04-03 07:52:04       15 阅读