结构体与类(静态类、抽象类)学习

来源:互联网 发布:云计算安全问题实例 编辑:程序博客网 时间:2024/06/03 18:06

类:

1、类规定了能够存储的数据类型,能够执行的方法、能够完成的任务;

2、类定义是一个说明,保存在类文件中;

3、类是引用数据类型。


对象:

1、对象在内存中;

2、对象以类为模板,通过对象使用类中的规定的数据类型、方法;

3、对象属性使用:对象名.属性名(get、set方法);

4、对象方法使用:对象名.方法名;

5、对象通过属性获取对应字段的值或者给字段赋值。(外界可通过属性访问私有字段)


结构体和类的区别:

1,结构是值类型(Value Types),类是引用类型(Reference Types)。

2,结构使用栈存储(Stack Allocation),类使用堆存储(Heap Allocation)。

3,所有结构成员默认Public,类的变量和常量默认Private,不过其他类成员默认都是Public。

4,结构成员不能被声明为Protected,类成员可以。

5,结构变量声明不能指定初始值、使用New关键字对数组进行初始化,类变量声明可以。

6,结构不能声明默认的构造函数,即不拥有参数的非共享构造函数,类可以。

7,二者都可以拥有共享构造函数,结构的共享构造函数不能带有参数,但是类的共享构造函数则可以带或者不带参数。

8,结构不允许声明析构函数(Destructor),类可以。

9,结构的实例(Instance)声明,不允许对包含的变量进行初始化设定,类可以。

10,结构是隐式继承自ValueType类,而且不能继承任何其他类型,类可以继续自ValueType以外的任何类。





11,结构不需要构造函数,类需要构造函数。


(一)结构体:

struct 结构体名{
访问修饰符 类型 变量名;
...
访问修饰符 类型 变量名;
}

using System;  namespace lesson01{  struct Person  {            public  string  name;         //public  类型  变量名,在结构体中不可以设置初始值}   struct Point2  {        public float  x;      public float  y;   }   class MainClass {     public static void Main ( string[] args ) {      Person p;             //使用结构体成员,结构体类型变量.成员名    p.name="苏利文";   Console.WriteLine ( p.name ); Point2 p1;               p1.x = 2.5f;             p1.y = 1.0f;               Console.WriteLine ("P({0}, {1})",p1.x,p1.y);   } }}


(二)类:

[访问修饰符]  class  类名 {

       类的描述信息
}


使用new关键字进行初始化

类名 变量名 = new 类名();

对象——类实例化的结果
字段(变量)

public 数据类型 字段名;

赋值:对象名.字段名=值;

取值:对象名.字段名

using System;namespace Lesson01 {public  class  Person  {//定义一个类         //字段——用于描述类中的特征        //在类中,可以给字段设置初始值        //public string name = “Mike”;        public string name;   }   class MainClass {    public static void Main ( string[] args ) {                //声明一个变量p,p即对象,使用new进行初始化                 //实例化——使用类创建出对象的过程                Person p = new Person () ;                //对象.字段名——访问类中的字段;                p.name = "Mike";       }   }}


①静态类:

1、静态构造方法不能有参数和访问修饰符;

2、静态构造方法可以存在于普通类或静态类中;

3、静态构造会在第一次实例化或调用静态成员时调用。


堆区——程序员手动开辟并管理内存

栈区——系统自动完成内存管理

静态区(全局区)——程序运行过程中,内存中的数据一直存在

常量区——存放常量

代码区——存放程序运行所需要的代码

using System;namespace Lesson01 {//静态类中,只能包含静态的成员(字段,属性,方法),常量   public static class  A {    //静态字段 public static int i;      //静态构造方法//静态构造方法不允许添加访问修饰符//静态构造方法会在首次访问类中的静态成员时调用static A () {                      Console.WriteLine ("A  的静态构造方法");                     }    //静态方法 public static void Test () {                   Console.WriteLine ("test");         }  }   public class B {          //静态方法也可以在普通类中     static B () {     //静态构造方法会在创建对象并初始化之前调用            Console.WriteLine ("B  的静态构造方法");       }    }   class MainClass {          public static void Main ( string[] args ) {                // 使用类名调用静态成员,不能通过实例调用   A.i = 10 ;             Console.WriteLine (A.i);    A.Test () ;     B b = new B () ;    } }}


②抽象类:

1、抽象类用于描述所有子类的共同特性,仅仅为了表达抽象概念,不与具体事物相联系;

2、抽象类不能被直接实例化;

3、抽象类只声明不实现,但是在子类中必须全部实现;

4、抽象类中可以包含非抽象方法,抽象方法只能写在抽象类中;

5、抽象方法不能使用Private访问权限修饰符。


using System;namespace Lesson01 {public  abstract class  Food {                //抽象方法需要添加abstract关键字   public abstract void Eat () ;         //父类中定义的抽象方法不能被实现    public void Test ()  {                //抽象类中可包含普通方法               Console.WriteLine ("Test");         } }  public class Apple : Food  {     public override void Eat () {         //子类实现父类的抽象方法,需添加override     Console.WriteLine ("HP + 10");         }  }   public class Water : Food  {       public override void Eat () {      Console.WriteLine ("MP + 10");   }  }  class MainClass {      public static void Main ( string[] args ) {          Food f1  = new Apple  () ;      Food f2  = new Water () ;      //Food f =new Food () ;抽象类不能被直接实例化;     f1.Eat () ;              f2.Eat () ;                         f1.Test () ;        } }}
阅读全文
0 0
原创粉丝点击