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

类:

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 () ;        
		} 
	}
}

猜你喜欢

转载自blog.csdn.net/love4399/article/details/77566188
今日推荐