静态方法与非静态方法的区别
1、修饰:静态方法用static修饰,非静态方法则不用
2、所有性:静态方法属于类所有,无论创建了多少个实例,都只占一块存储区域,相当于是只运行一次。
非静态方法属于类的实例所有,每创建一个实例,就分配一块存储区域。
3、主动访问性:静态方法只能访问类中的静态成员,而非静态方法可以访问类中的任何成员
4、被动访问性:静态方法的访问通过:类名.静态方法名()的格式;
非静态方法的访问通过:类实例名.非静态方法名()的格式访问。
5、生命周期:静态方法从生成时开始到整个程序运行结束;
非静态方法从生成时开始到生成它的程序段结束。
6、继承性:静态方法不能被继承,而非静态方法可以。
============================静态 static 不能被继承和实例化,即:静态和继承(多态)本身就是相反的===========================
静态类与非静态类的区别
1、包含成员:静态类仅包含静态成员,而非静态类可以包含静态和非静态成员;
2、实例化与继承:静态类不能被实例化,不能被继承,而非静态类可以被实例化和继承;
3、构造方法:静态类不能包含构造方法,但仍可声明静态构造方法来初始化;非静态类有默认的构造方法;
多态:通过继承实现不同对象调用相同方法时,表现出不同的行为
-->在代码中实现多态就是:
-->根据条件创建子类对象,统一赋值给父类对象
-->由父类对象统一调用方法,子类是什么方法就执行什么方法
==============================================================================================================================
继承-->: new(隐藏基类成员) virtual(虚方法) abstruct(抽象基类方法) override(重写) interface(接口) base(子类构造方法访问父类构造方法)
继承:是重用现有类去创建新类的过程
-->派生类的实例由基类的实例加上派生类的附加成员组成
抽象类:包含至少一个未实现的方法的类。
-->抽象类就是为了多态而存在,不能被实例化,继承它的类必须实现其抽象方法。
-->抽象方法只能定义在抽象类中
-->public abstract void SayHi();无大括号
-->抽象就是为了重写
-->抽象类及其中所有成员必须是public
接口:一系列抽象成员的集合。
-->接口可由抽象的方法、属性、事件、索引器构成。接口不能包含字段;
-->接口不能包含任何实现了的方法;
-->接口的每种方法必须在派生类中实现;
-->接口中的成员不能加“访问修饰符”(默认为public)
-->若要实现接口成员,类中的对应成员必须是公共的、非静态的
-->显式实现接口,用接口名.方法名 标注方法, 然后去掉public
void IFunc1able.Func()
{
Console.WriteLine("我是第一个接口的方法");
}
-->一般用大写 I + 动词 + able 的形式命名
抽象类和接口的区别:
-->接口不能加任何修饰符,而抽象类及其中所有成员必须定义为public
-->接口中只能包含非实现的方法、属性、事件、索引器。而抽象类还可包含字段等成员
类:是具有相同属性和功能的对象的抽象集合
--> public 写在类前面,表示其它项目也能使用
--> 没有加就表示为internal,只在本项目中使用
简单工厂模式:
-->根据提供给它的数据,返回几个可能类中的一个类的实例;
-->通常它返回的类都有一个共同的父类和共同的方法;
-->但每个方法执行的任务不同,而且根据不同的数据进行了优化。
is - as:类型判断:看一个对象是不是某个类型或能否转为父类型
-->is就是处于对类型的判断。能转返回true,不能转就返回false。
if(对象 is 类型)
-->as操作符的工作方式与强制类型转换一样,不能转换就返回null:
Object obj=new Object();
ClassA a= obj as ClassA;//不能转就返回null
======================================Person中的集合(===非泛型===)操作==================================
排序Sort([参数])
-->所有的排序都实现IComparable(实例,无参)接口,IComparer(对象,有参)接口//这里的实例与对象只是个人为了便于区分而做的定义
ArrayList list = new ArrayList();
list.Add(new Person("张三", 19, '男'));
list.Add(new Person("李四", 31, '男'));
list.Add(new Person("王五", 30, '男'));
-->Sort()无参时,Person实现IComparable接口(实例)
public int CompareTo(object obj)
{
Person p = obj as Person;
return string.Compare(this.Name,p.Name);
}
-->Sort(new OrderByAge())有参时,OrderByAge()实现IComparer接口(对象)
class OrderByAge:IComparer
{
public int Compare(object x, object y)
{
int a = (x as Person).Age;
int b = (y as Person).Age;
return a - b;
}
}
在ArrayList集合中查找、匹配Person
--> 在Person中重写Equals()方法(实例)
public override bool Equals(object obj)
{
Person p = obj as Person;
if (p == null)
{
return false;
}
return ReferenceEquals(p, this) || //ReferenceEquals 引用,判断是否是相同实例
this.Name == p.Name && this.Age == p.Age && this.Sex == p.Sex;
}
--> class Program中
bool isContains = list.Contains(new Person("张三", 19, '男'));
int index = list.IndexOf(new Person("张三", 19, '男'));
=================================================================================================================
利用循环打印集合
foreach()原理
--> 1)入集合,调用GetEnumerator方法,得到IEnumerator枚举器
--> 2)进入in,调用MoveNext方法,看是否进行循环
--> 3)通过Current属性取得当前值
-----
-->IEnumerator:公开枚举器,该枚举器支持在非泛型集合上进行简单迭代。
-->DictionaryEntry:定义可设置或检索的字典键/值对。
-->Current:获取集合中的当前元素。
-->MoveNext():将枚举数推进到集合的下一个元素。
-->GetEnumerator():返回一个循环访问集合的枚举器。
Hashtable ht = new Hashtable();
ht.Add("张三", "张三1");
ht.Add("李四", "李四1");
ht.Add("王五", "王五1");
IEnumerator ie = ht.GetEnumerator();
while (ie.MoveNext())
{
object o = ie.Current;
DictionaryEntry de = (DictionaryEntry)o;
Console.WriteLine(de.Key + "," + de.Value);
}
Console.ReadKey();
=================================================================================================================
文件流(I/O)
Path类:
--> GetFileName 获取文件名
--> GetFileNameWithoutExtension 获取文件名(无扩展名)
--> GetExtension 返回文件扩展名
--> GetDirectoryName 获取文件完整路径(无文件名)
--> GetFullPath 获取文件的绝对路径(有文件名)
--> GetPathRoot 获取文件根目录信息(盘符)
--> IsPathRooted 判断路径是绝对路径还是相对路径
--> HasExtension 判断路径是否包括文件名(可用于判断是文件还是目录)
--> Combine(str1,str2) 将字符串拼接为路径
--> ChangeExtension(fileName,扩展名) 更改扩展名
--> GetTempFileName 返回临时文件目录
字节操作
using (FileStream fs1 = new FileStream(@"F:\123.txt", FileMode.Open, FileAccess.Read))
{
using (FileStream fs2 = new FileStream(@"F:\369.txt", FileMode.Create, FileAccess.Write))
{
int i = -1;
while ((i = fs1.ReadByte())!=-1)
{
fs2.WriteByte((byte)i);
}
///
int count = 0;
byte[] bs = new byte[4];
while ((count = fs1.Read(bs,0,bs.Length))>0)
{
for (int i = 0; i < count; i++)
{
Console.WriteLine("{0}",(char)bs[i]);
}
}
}
}
Shift + Alt + F10 引用命名空间;实现抽象(方法,属性…)