zoukankan      html  css  js  c++  java
  • 04面向对象基础

    总结一下这两天的学习笔记,正所谓温故而知新嘛,希望能够更好的学习后面的新知识

    1、面向对象概念
    面向对象三大特征:封装、继承、多态

    2、类对象是引用传递
    把一个对象传递到方法中,传递的也是这个对象本身的引用,修改这个对象会影响外面的对象

    3、null
    表示变量没有指向任何对象
    值类型(ValueType):数值类型(int、long、double等)、boolean等基本类型,枚举、结构体的值是复制传递,不能为null;
    String不是值类型

    4、局部变量和成员变量
    (1)局部变量必须初始化,成员变量声明时已经默认初始化了(基本数值类型初始化值为0;布尔类型默认初始化值为false;string类型初始化值为null)
    (2)当成员变量和局部变量(函数参数也可以看做局部变量)重名的时候,成员变量被看做局部变量,为避免混乱,访问成员变量时加上"this.","this"表示当前对象;

    5、public和private

    class test
    {
        public int age;//被public修饰,这个成员变量可以被外部和这个类自己访问
        private string name;//被private修饰,这个成员变量只能被这个类内部访问
    
        //可以声明一个setName方法来提供给外界 外部通过这个方法操作给内部的私有变量name赋值
        public void setName(int name)
        {
            this.name=name;
        }
    }

    可以把成员变量声明为public,也可以声明为private,成员变量声明为private 就只能在类的内部调用private成员


    public成员可以被类内部或者外界访问,private成员只能被内部访问,这样可以保护不希望外界调用的内部成员,包含(字段(Field)变量、方法)不被外界访问


    字段(Field)/成员变量(Member Variable)一般声明为private。通过get/set方法进行取值/赋值;

    6、属性
    为避免外界给成员变量随便赋值,必须把成员变量声明为private,然后提供get/set方法,写起来、调用起来都麻烦,C#提供属性的一个语法
    属性的声明
    给一个私有成员变量声明属性给外界读取写入

    private int age;//声明一个私有变量,外界不能访问
    public int Age
    {
        get
        {
            return this.age;//外界通过Age的返回值拿到age变量的值,
        }
        set
        {
            //value就是外界传入的值,属性赋值时调用set方法把外界的值赋值给本类的私有变量age
            this.age=value;
        }
    }

    属性的简化,如果是简单的get/set逻辑,可以有更简单的写法:

    public int Age
    {
        get;
        set;
    }

    get、set可以单独声明为private、protected,这样就可以设置不同的访问级别了

    如果属性只有get或者set方法就是只读或者只写属性。只读只写都不能简写。

    7、构造函数入门
    (1)构造函数是创建类对象,并且在创建完成前对类进行初始化的特殊函数。如果定义的类是没有声明构造函数,则编译器编译时会默认给出一个无参构造函数,如果定义了任意一个有参构造函数,则不会提供默认无参的构造函数。


    (2)构造函数的格式及特点:
    方法名必须和类名一致
    没有返回值类型
    构造函数可以重载

    下面是代码示例:

     1     class Person
     2     {
     3         //无参的构造方法,
     4         //如果自己重新写了一个构造函数,默认无参的构造函数会被干掉,要用的话需要自己写一个
     5         public Person()//没有返回值,方法名和类名一致
     6         { 
     7         }
     8 
     9         public Person(int age)//只有一个参数的有参构造函数
    10         {
    11             //this.age = age;
    12             Age = age;
    13         }
    14 
    15         public Person(int age, string name)//有两个参数的构造函数
    16         {
    17             //this.age = age;
    18             Age = age;
    19             //this.name = name;
    20             Name = name;
    21         }
    22 
    23         private int age;
    24 
    25         public int Age
    26         {
    27             get { return age; }
    28             set { age = value; }
    29         }
    30         private string name;
    31 
    32         public string Name
    33         {
    34             get { return name; }
    35             set { name = value; }
    36         }
    37         public void SayHello()
    38         {
    39             Console.WriteLine("name="+name+";age="+age);
    40         }
    41     }
    42     
    43     //调用
    44     static void Main(string[] args)
    45         {
    46             Person p1 = new Person();//new对象时调用无参构造方法
    47             p1.SayHello();
    48 
    49             Person p2 = new Person(19);//调用只有int类型参数的构造方法
    50             p2.SayHello();
    51 
    52             Person p3 = new Person(30, "张三");//调用有int类型参数和string类型的构造方法
    53             p3.SayHello();
    54 
    55             Console.ReadKey();
    56         }
    View Code


    8、static介绍
    (1)一些场景下会要求一个类的多个实例共享一个成员;有时候想定义一些不和具体对象关联、不需要new就调用的方法;
    举例:Console类的WriteLine;MessageBox的Show
    (2)static方法不需要new就可以直接通过类名调用;
    (3)static变量是共享的内存空间,非static变量则是对象隔离的;
    (4)static方法中无法使用this关键字,因为static独立于对象存在,不是任何人的唯一;
    (5)static成员只能访问static成员,不能接访问非static成员。非static成员可以访问static成员。

    9、命名空间
    可以用文件系统的文件重名和文件夹来解释命名空间的问题


    命名空间语法:namespace 命名空间名称

    当前命名空间中的类无需引用;使用using引用其它包中的类;


    还可以通过“命名空间+类名”的方式使用“System.Data.SqlClient.SqlConnection” ,不用using,适用于同时使用多个重名的类,比uising时候的别名好;

    10、继承(inherit)


    C#中一个类可以“继承”自其它类,如果A继承B,则A叫做B的子类,B叫做A的父类(基类)。子类会从父类继承所有非private成员。子类还可以有子类;


    C#中一个类只能有一个父类,如果没有指定父类,则System.Object为父类


    子类的构造方法默认都去访问父类的无参构造方法;在子类的构造方法后都有一行默认语句base()

    class Fu
    {
        public Fu()
        {
            Console.WriteLine("FU");
        }
    }
    class Zi:Fu
    {
        public Zi():base()//不管是否显式调用base(),new 子类对象时控制台都会输出fu
        {
            Console.WriteLine("zi");
        }
    }
    
    //new子类对象时,先去执行父类的构造函数把父类初始化完成,再去初始化子类的。
    Zi z = new Zi();

    可以通过 base(参数) 去访问父类中的有参构造函数。见下面代码:

    class Fu
    {
        public Fu(int a)//父类定义了一个有参的构造函数,则没有无参的构造函数
        {
            Console.WriteLine("FU"+a);
        }
    }
    class Zi:Fu
    {
        public Zi():base(0)//如果父类没有无参的构造函数,则需要显示调用父类的其它的有参构造函数    
        {
            Console.WriteLine("ZI");
        }
        public Zi(int a):base(a)
        {
            Console.WriteLine("ZI"+a);
        }
    }

    定义了一个有参的构造函数,则没有无参的构造函数,父类没有无参的构造函数,则需要显示调用父类的其它的有参构造函数

    11、private、public和protected的区别
    public成员可以被所有类访问

    private成员无法被子类和外部类访问,子类只能通过父类的public方法“间接”访问父类的private成员。这样保证了父类private成员的安全性。
    protected成员只能被自己以及自己的子类(直接或者间接)访问,无法被“外姓人”访问。

    12、多态
    面向对象三大特征:封装、继承、多态。多态是面向对象最强大的一个特征,也是最难的一个特征,设计模式等都是多态的表现
    子类中定义和父类中一样的方法就叫“重写(override)或覆盖”,父类中可以被override的方法要声明为virtual。

    override修饰符

        class DiQiuRen
        {
            //public void SayHello()
            public virtual void SayHello()//父类中希望子类可以 override的方法标注virtual
            {
                Console.WriteLine("我是地球人");
            }
        }
        class ZhongGuoRen : DiQiuRen
        {
            //public void SayHello()
            public override void SayHello()//子类中override父类中的同样的方法必须标注override
            {
                Console.WriteLine("我是中国人");
            }
        }

    调用:

    //调用
    static void Main(string[] args)
    {
        ZhongGuoRen zgr1 = new ZhongGuoRen();
        zgr1.SayHello();//中国人子类override父类的方法,所以调用的是ZhongGuoRen的SayHello方法
    
        //可以用父类的变量指向子类的对象
        DiQiuRen dqr1 = new ZhongGuoRen();
        dqr1.SayHello();//调用的方法实现还是对象的实现,而不是变量的实现,调用的还是new出来的对象的方法
        //dqr1.BaiNian();不管实际指向的是什么类型的对象,能够调用什么方法取决于变量的类型
    }

    父类变量可以指向子类对象,内存中也还是子类对象,有且只有这一个对象  变量是什么类型没关系,到底执行谁的方法主要取决于内存中的对象是什么类型的

    抽象类

    抽象类的抽象方法主要用来限制子类“必须实现这些抽象方法”;子类也可以不实现,那么子类也要是抽象类,由子类的子类...去实现。试想一下:如果子类继承了抽象类而你没有实现抽象方法,万一你调用了抽象方法怎么办?我这个抽象方法没有具体的实现,你叫我怎么调用?

    抽象方法
    抽象方法没有方法体;一旦类中定义了抽象方法,类必须被修饰为抽象;抽象类无法实例化(new);

    13、接口

    语法:

    public interface ISpeakable
    {
        void speak();//不提供体具体实现连{}都不用
    }

    (1)接口是一种用声明"能力"的类型,不提供具体实现
    (2)不提供实现方法,连{}都不能有
    (3)接口无法实例化,只能被类“实现”

    public class TeacherCang:ISpeakable//继承接口
    {
        public void speak()//实现接口的方法
        {
            Console.WriteLine("yamadie");
        }
    }

    (4)既可以使用接口类型变量又可以使用类类型变量调用speak
    (5)接口的意义是定义“做什么”,类定义“怎么做”
    (6)接口中不能声明变量(字段)一个没有实现代码的接口声明变量没有意义
    (7)接口可以定义多个方法,也可以不定义任何方法(* 标识接口)
    (8)接口是“能力”不是实现,因此也不能定义构造函数(没这个必要)
    (9)类只有一个父类,类可以实现多个接口

  • 相关阅读:
    [转]C# ReportViewer报表 详解
    [转]Java NIO原理图文分析及代码实现
    [转]C#泛型编程
    [转]ASP.NET页面基本对象
    [转]C#中抽象类和接口的异同
    [转]Android进程间通信消息机制及IPC机制实现
    [转]左连接和右连接的区别
    [转]C# 4.0 新特性
    [转]UML类图java代码实现
    [转]Using The Entity Framework With WCF
  • 原文地址:https://www.cnblogs.com/pirates/p/4493437.html
Copyright © 2011-2022 走看看