面向对象与类

面向对象

1 类

1.1、类的概念:类是一个模板,确定了一个对象应该有的属性与方法,简单理解就是属性相当于一个人的特征,而方法相当于一个人的行为,在资源管理器中添加新类

1.2、在新建好一个类后在类之前添加一个public

1.3、类的语法
[访问修饰符] class 类名
{
类的成员;(字段,属性,方法)
}
访问修饰符:public
类名:书写规则是要求每个单词的首字母都要大写

1.4、类的实例化(创建对象):我们写好一个类之后,需要创建这个类的对象
使用关键字new来创建,必须写在main函数中
类名 对象名=new 类名();

1.5、字段:在类中存储数据 写法:修饰符 _字段名
给新建对象赋值:新建对象名. _字段名()

1.6、类中的成员如果不加访问修饰符,默认是private
private:私有的,表明只能在类的内部访问,出了这个类之后,
就访问不到了,若想在类外访问就要加public
在类中写的方法,若有static则为静态方法,没有则非静态

1.7、在类中写方法若想输出对象的值:this._字段名(this表示当前这个类的对象,this的作用是用来输出字段的值)

1.8、类是不占内存的,而对象是占内存的

下面是例题代码
Person代码块

namespace 第九天练习代码
{
    public class Person
    {
        public string _name;
        public int _age;
        public char _gender;

        public void SayHello()
        {
            Console.WriteLine("大家好,我叫{0},我今年{1}岁,我是{2}生",this._name,this._age,this._gender);
        }
    }
}

Program代码块

    class Program
    {
        static void Main(string[] args)
        {
            Person isPerson = new Person();
            isPerson._age = 18;
            isPerson._name = "张三";
            isPerson._gender = '男';
            isPerson.SayHello();
            Console.ReadKey();
        }
    }

2 类的属性

2.1、在一个类中应该给每个字段都去配备一个属性,属性就是为了保护字段,对字段的取值和设置进行一个设定,那么相应的在声明字段时就不能添加public,是为了保证数据是一个隐私状态,而在第一节中添加了public是因为当时没有引入类的属性,那么相应了在类的方法中赋值要改为this.属性名,属性的本质是由于两个方法组成的
属性的语法:
public string 命名
{
get{ return 字段 } 当取值时用get方法
set{ 字段=value; } 当给属性赋值时用set方法
}
2.2、字段就是女人,属性就是男人。说明属性是为了保护字段

Person 代码块

    public class Person
    {
        string _name;
        public string Name
        {
            get { return _name;}
            set { _name = value; }
        }
        int _age;
        public int Age
        {
            set { _age = value; }
            get { return _age; }
        }
        char _gender;
        public char Gender
        {
            set { _gender = value; }
            get { return _gender; }
        }
        public void SayHello()
        {
            Console.WriteLine("大家好,我叫{0},我今年{1},我是{2}生", this.Name, this.Age, this.Gender);
        }
    }

Program代码块

            Person Aperson=new Person();
            Aperson.Age = 18;
            Aperson.Gender = '男';
            Aperson.Name = "张三";
            Aperson.SayHello();
            Console.ReadKey();

2.3、属性分为三种
既有get方法也有set方法的属性我们称之为可读可写属性
只有get方法没有set方法我们称之为只读属性
只有set方法没有get方法我们称之为只写属性

2.4、当输入的值出现异常时,可以在get,set方法中添加判断语句,通常只在其中之一添加判断语句

2.5、类的练习题:student
定义一个学生类,有六个属性,分别为姓名、性别、年龄、语文、数学、英语成绩。
有2个方法:
一个打招呼的方法:介绍自己叫XX,今年几岁了。是男同学还是女同学。
两个计算自己总分数和平均分的方法。{显示:我叫XX,这次考试总成绩为X分,平均成绩为X分}
实化两个对象并测试:
张三 男 18 三科成绩为:90 95 80
小兰 女 16 三科成绩为:95 85 100

3 构造函数

3.1、主要作用就是对,对象进行初始化(在类中来创建)
3.2、构造函数其实就是一个函数,只不过是一个特殊的函数。
语法:
public 构造函数名(传入参数:数据类型 字段名)
{
代码(判断条件);
this.字段=字段名;
}
没有返回值,连void都不能写,构造函数的名称必须和类名一致
3.3、调用构造函数
new的作用:
1)、在内存的堆中开辟空间
2)、在开辟的堆空间中创建对象
3)、调用对象的构造函数
3.4、在创建构造函数之后,就可以在创建类的对象中填入所需要的数据
类名 对象名=new 类名(字段的数据);
而这样做就可以避免重复调用属性来输入数据
3.5、1)、可以重载(方法的名称相同但方法的参数不同,参数个数相同但类型不同或参数类型相同但个数不同 )
2)、类中默认会有一个无参数的构造函数,当你写了一个新的构造函数后,那个默认的无参数的
构造函数就被干掉了

4 值类型和引用类型

4.1、值类型:int double char bool decimal struct enum
引用类型:string 数组 自定义类
4.2、常用的内存:堆 栈 静态存储区域
值类型是存在栈中,引用类型是存在栈中

5 静态和非静态的区别

5.1、静态成员需要被static修饰,非静态成员不需要加static。
5.2、问题1:在一个非静态类中,是否允许出现静态成员?
答:非静态类中是可以出现静态成员的。
问题2:在非静态函数中,能不能够访问到静态成员?
答:在非静态函数中,既可以访问到非静态成员,也可以访问到静态成员。
问题3:在静态函数中,能不能够访问到非静态成员?
答:静态方法只能够访问到静态成员。
问题4:在静态类中能否出现非静态成员?
答:不可以,在静态类中,只允许出现静态成员。
5.3、在调用上,静态和非静态的区别
1、在调用实例成员的时候,需要使用对象去调用
2、在调用静态成员的时候,必须使用类名.静态成员名;
3、静态类是不允许创建对象的

6 垃圾回收期

6.1、GC Gargbage Collection
当我们程序结束之后,GC会扫描整个内存,发现,如果有的空间没有被指向,
则马上自动把这块空间销毁。
在这里插入图片描述

7 面向对象练习

问题:
写一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离distance计算价格Price (1元/公里):
0-100公里 票价不打折
101-200公里 总额打9.5折
201-300公里 总额打9折
300公里以上 总额打8折
有一个方法,可以显示这张票的信息.
测试上面的类

Ticked类代码块

    class Ticked
    {
        double _distance;

        public double Distance
        {
            get { return _distance; }
        }

        //构造函数
        public Ticked(double distance)
        {
            if (distance < 0)
            {
                distance = 0;
            }
            this._distance = distance;
        }

        double _price;

        public double Price
        {
            get
            {
                if (_distance >= 0&&_distance<=100)
                {
                    return _distance * 1.0;
                }
                else if(_distance>=101&&_distance<=200)
                {
                    return _distance * 0.95;
                }
                else if (_distance >= 201 && _distance <= 300)
                {
                    return _distance * 0.9;
                }
                else
                {
                    return _distance * 0.8;
                }
            }
        }
        public void ShowTicket()
        {
            Console.WriteLine("{0}公里需要{1}元", this.Distance, this.Price);
        }
    }

Program代码块

    class Program
    {
        static void Main(string[] args)
        {
            Ticked t = new Ticked(150);
            t.ShowTicket();
            Console.ReadKey();
        }
    }

8 不同项目之间类的调用

8.1、在一个项目中引用另一个项目的类的步骤
1、添加要引用的类所在的项目。
2、引用命名空间(在最上端using处添加using namspace后面的代码;)
8.2、访问修饰符
public :公开的,公共的
private:私有的,只能在类的内部访问,出了这个类之后,就访问不到了。
能够修饰类的访问修饰符只有两个:
1)、public
2)、internal:表示只能在当前程序集的内部进行访问,出了这个程序集就访问不到啦。
对于咱们而言,现阶段就将程序集理解为当前项目。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值