C#面向对象初级

——类
类就是个模子,确定了对象应该具有的属性和方法。
我们把具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念。
对象是根据类创建出来的。
抽象一点来说,类就是一个盖大楼的图纸 ; 对象 就是盖出来的大楼,根据这个图纸可以盖出很多大楼,但是这些大楼的结构都一样

语法:
[public] class 类名
{
    字段;
    属性;
    方法;
}

定义类的例子

public class Person {
        private string _name;
        //字段
        public string Name  
        {
            get { return _name; }
            set { _name = value; }
        }
        //属性
        public void SayHi() {
            Console.WriteLine("我叫{0}",Name);
        }
        //方法
    }

写好了一个类之后,我们需要创建这个类的对象,
那么,我们管创建这个类的对象过程称之为类的实例化。
使用关键字 new.

//以上面的Person类为例子进行实例化
Person P1 = new Person();//创建实例对象
P1.Name = "HelloWorld";
//当我们创建好一个类的对象后,需要给这个对象的每个属性去赋值。我们管这个过程称之为对象的初始化。
P1.SayHi();//调用对象的方法

上面就是定义了一个简单的类,然后实例化,然后初始化赋值,最后调用方法的全过程
非静态类是不占内存的,而对象是占内存的。

——类的属性

  1. 属性的作用就是保护字段、对字段的赋值和取值进行限定。
  2. 属性的本质就是两个方法,一个叫get()一个叫set()。
  3. 只有get()没有set()我们称之为只读属性
  4. 没有get()只有set()我们称之为只写属性
  5. 既有get()也有set()我们诚之为可读可写属性。
  6. 对属性赋值调用set方法,对属性取值调用get方法,所以我们就可以对属性的赋值和取值进行条件判断,从而保护我们的字段

——类成员的访问修饰符

  • public:公开的公共的,在哪都能访问。
  • private:私有的,只能在当前类的内部进行访问,出了这个类就访问不到了。
  • protected:受保护的,只有在当前类和继承这个类的成员中才可以访问
  • Internal:和public唯一的区别就是public可以跨项目访问,internal只能在当前项目中访问,在一个项目中internal和public没有区别

——静态和非静态的区别
用关键字static修饰的就是静态,没有static修饰的就是非静态
- 在非静态类中,既可以有实例成员,也可以有静态成员
- 在调用实例成员(非静态成员)的时候,需要使用对象名.实例成员;
- 在调用静态成员的时候,需要使用类名.静态成员名;
-静态类中只能有静态成员,因为静态类不能被实例化,所以就算在静态类中定义了实例成员,也没有办法访问到

总结一下:

  1. 静态成员必须使用类名去调用,而实例成员使用对象名调用。
  2. 静态函数中,只能访问静态成员,不允许访问实例成员,比如说Main函数
  3. 实例函数中,既可以使用静态成员,也可以使用实例成员。
  4. 静态类中只允许有静态成员,不允许出现实例成员。

那么什么时候使用静态类呢?

  1. 如果你想要你的类当做一个”工具类”去使用,这个时候可以考虑将类写成静态的。
  2. 静态类在整个项目中资源共享。只有在程序全部结束之后,静态类才会释放资源。
//定义一个非静态类
public class Person
    {
        private static string _name;//静态字段

        public static string Name//静态属性
        {
            get { return Person._name; }
            set { Person._name = value; }
        }
        private char _gender;//实例字段

        public char Gender//实例属性
        {
            get { return _gender; }
            set { _gender = value; }
        }
        public void M1()
        {
            Console.WriteLine("我是非静态的方法");
        }//实例方法
        public static void M2()
        {

            Console.WriteLine("我是一个静态方法");
        }//静态方法
    }

//在Main方法中调用
static void Main(string[] args){
    Person P1 = new Person();
    P1.Gender = '男';//给实例属性赋值
    Person.Name = "HelloWorld";//给静态属性赋值
    P1.M1();//调用实例方法
    Person.M2();//调用静态方法
}
//定义一个静态类
 public static class Student
    {
        private static string _name;

        public static string Name
        {
            get { return Student._name; }
            set { Student._name = value; }
        }

        public static void M1()
        {
            Console.WriteLine("Hello World");
        }
    }

//在Mian方法中调用
static void Main(string[] args){
    Student.Name = "Hello";给静态属性赋值
    Student.M1()//调用静态方法
}

上面两个例子中卫对象初始化都是在给属性赋值,把字段定义为了private,目的也是为了保护字段数据。

——构造函数
在上面的例子中会发现每实例化一个对象,就需要对属性赋值进行初始化,就像下面这样

static void Main(string[] args){
    Person P1 = new Person();
    P1.Gender = '男';

    Person P2 = new Person();
    P2.Gender = '女';

    Person P3 = new Person();
    P3.Gender = '男';
}
//这里实例了三个对象,就为属性赋值了三次,造成了大量的冗余代码,所以就有了构造函数

作用:帮助我们初始化对象(给对象的每个属性依次的赋值)
构造函数是一个特殊的方法:

  1. 构造函数没有返回值,连void也不能写。
  2. 构造函数的名称必须跟类名一样。

    构造函数的例子

public class Person{
    //定义一个构造函数
    public Person(string name){
        this.Name = name;
    }
    private string _name;
    public string Name(){
        get{return value;}
        set{_name= value;}
    }
}
//在Main方法中实例化
void static Main(string[] args){
    Person p1 = new Person("HelloWorld")
}

new帮助我们做了4件事儿:

  • 在堆内存中开辟一块空间
  • 在开辟的空间中创建对象
  • 调用对象的构造函数进行初始化对象
  • 将堆内存地址返回给栈内存中的变量名

类当中会有一个默认的无参数的构造函数,当你写一个新的构造函数之后,不管是有参数的还是无参数的,那个默认的无参数的构造函数都被干掉了,这个重点体现在继承那里,没有继承也就无所谓了

this关键字
1)、代表当前类的对象
2)、在类当中显示的调用本类的构造函数,构造函数是可以有重载的。

public class Person{
    //定义一个构造函数
    public Person(string name,string gender){
        this.Name = name;
        this.Gernder = gender
    }
    //一个参数的构造函数,构成重载,如果只给姓名,性别默认为男
    public Person(string name):this(name,"男"){
    }
    private string _name;
    public string Name(){
        get{return value;}
        set{_name= value;}
    }
    private string _gender;
    public string Gender(){
        get{return value;}
        set{_gender= value;}
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值