-
泛型方法就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法。
泛型类中往往有泛型方法,泛型类中的泛型参数和泛型方法的泛型参数可以相互独立,普通类中也可以有泛型方法。
查看全部 -
泛型类:模子
class Cage<T> // T,占位符,类类型参数
{
} //声明
Cage<Dog> dogCage; //引用
dogCage = new Cage<Dog>(); //实例
var dogCage = new Cage<Dog>();
为什么需要泛型:
用积累或者公共的接口,甚至是所有类的基类object,也可以实现一个Cage,但是类型太宽泛,需要显式转换类型,并且判断真实类型是什么。
只有需要的类型才会被实例化。
var:
var 是3.5新出的一个定义变量的类型 其实也就是弱化类型的定义 VAR可代替任何类型 编译器会根据上下文来判断你到底是想用什么类型的 至于什么情况下用到VAR 我想就是你无法确定自己将用的是什么类型 就可以使用VAR 类似 OBJECT 但是效率比OBJECT高点。
或者通俗的讲:
var可以理解为匿名类型,我们可以认为它是一个声明变量的占位符。它主要用于在声明变量时,无法确定数据类型时使用。
使用var定义变量时有以下四个特点:
1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式: var s; s = “abcd”;
2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3. var要求是局部变量。
4. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。
查看全部 -
重载运算符:利用现有的某种运算符,针对自定义类或者结构,定义某种运算,以简化自定义类型的操作。
public static Dog operator+(Dog male,Dog female)
{
...
return new Dog();
}
可以重载的运算符:
1、一元:+,-,!,~,++,--,true,false;
操作数必须是类或结构;
2、二元:+,-,*,/,%。&,|!,^,<<,>>,==,!=,>,<,>=,<=;
两个操作数至少有一个是类或结构;
3、不能重载:=,&&,||,[],()等。
重载运算符不能:
1、创建新运算符;
2、改变运算符语法;
3、重定义运算符如何处理预定义类型;( int a + int b = a - b)
4、改变运算符的优先级和结核性。
查看全部 -
自定义转换:
为自己的结构或者类定义显式或隐式转换,为了让结构或者类可以变成一个预期相关的类型,并且使这种转换更加简单。
public static explicit(显式)/ implicit(隐式) operator 没有函数名称
显式需要用到括号强制转换。
查看全部 -
装箱:根据值类型的值,在堆上创建一个完整的引用类型对象,并返回对象的引用,即将值类型转换为引用类型(用于进行统一的操作和统一的存储),是一种隐式转换,语言可以自动完成。
装箱在堆中创建了一个新的对象,会有性能的损耗,能不装箱则不装箱。
装箱的本质就是在堆上创建了引用类型的副本,新创建的引用类型和原来的值类型相互独立。
拆箱:将装箱后的对象转换回值类型的过程,是一种显示转换,需要手动完成,int j=(int)i,强制转换。
查看全部 -
静态类:
1、只包含了静态的方法和属性,并且表示为static;
2、静态类不能创建实例,不能被继承;
3、可以为静态类定义一个静态构造函数。
静态类主要用于基础类库和拓展方法。
如何扩展方法:
1、如果有源代码,直接添加一个新方法;
2、如果不能修改但也不是密闭类,可以派生子类拓展;
3、如果以上条件都不满足,可以使用静态类扩展方法。
扩展要求:
1、扩展方法所属的类,必须是static类;
2、扩展方法本身必须是static方法;
3、扩展方法的第一个参数类型,必须是this+类名。
查看全部 -
1、静态字段意味着静态成员将被类的所有实例共享,所有实例都访问同一内存位置,静态字段所有实例共享。
2、静态成员和实例成员分开保存。
3、静态成员将直接通过类名访问。
4、静态成员独立于任何实例,没有实例也可以访问,其初始化语句在任何静态成员使用之前调用。
5、静态函数也独立于任何实例,没有实例也可以调用,静态函数不能访问实力成员,仅能访问其他静态成员,但是实例成员可以访问静态成员。
6、静态构造函数用于初始化静态字段,为静态成员而生,在引用任何静态成员之前和创建任何实例之前调用,与类同名,使用static,无参数,无访问修饰符
查看全部 -
结构和类
不同点:
1、结构是值类型(在栈中),类是引用类型(在堆中);
2、结构不支持继承,类支持继承;
3、结构不能定义默认构造函数,编译器回定义。
适用场合:
结构:内存分配快,作用域结束即被删除,不需要垃圾回收,用于小型数据结构,传递会赋值,用ref提高效率;
类:用于其他的需要继承体系的场合
查看全部 -
接口 关键字 interface,一般用I开头,接口就是制定一组函数成员,而不实现他们的引用类型(默认public,但不能加任何访问修饰符),只能用来被实现,实现时要加访问修饰符
通过对象调用,可以调用自身有的函数;通过接口调用,只能调用接口所对应的函数
一个类可以实现多个接口
接口标示着当前这个类有接口所声明的行为、方法、能力
查看全部 -
sealed
密闭类:有些不希望其他人通过继承来修改,不能再派生子类,如修改string类;
密闭方法:不希望其他人重写该方法
如果一个基类方法不希望子类对其重写,就可以不声明为virtual,同时是override重写,就可以使用sealed机制
查看全部 -
派生类对象中,有一部分是基类部分,在执行派生类的构造函数体之前,将会隐式或显式调用基类构造函数。
调用顺序:实例成员初始化->基类构造函数->派生类构造函数
this,调用当前类的其他构造函数,可以有参数也可以没有参数,可以用来调用进行公共初始化的函数
查看全部 -
依赖倒置原则:程序设计要依赖于抽象类,而不依赖于具体类,尽量降低程序的耦合。
基类的引用:派生类的对象包含基类部分和派生类部分,可以通过一个基类类型的引用指向派生类,通过指向派生类的基态引用,仅能访问派生类中的基态部分。
统一提高效率:需要一个容器保存所有的基类,基类描述了共同的属性和行为(前提:基类的引用可以指向派生类)
子类具有差异:基类不能涵盖所有情况和变化,统一的行为方法往往在基类和派生类中有所区别。
虚方法:声明为virtual的方法。基类的虚方法可以在派生类中使用override进行重写。(overload,重载)
多态:通过指向派生类的基态引用,调用虚函数,会根据引用所指向派生类的实际类型,调用派生类中的同名重写函数。
关于虚方法的其他知识点:
1、重写虚方法必须具有相同的可访问性,且基类方法不能使private;
2、不能重写static方法或者非虚方法;
3、方法、属性、索引器、事件、都可以声明为virtual或override。
查看全部 -
隐藏方法:
不能删除基类中的任何成员,但是可以用与基类成员名称相同的成员来屏蔽基类成员。
语法细节:
屏蔽数据成员:在派生类中声明名称和类型相同的成员。
屏蔽函数成员:在派生类中声明新的带有相同函数签名的成员。(关键)
PS:相同函数签名是指参数列表相同,函数名相同,不意味着返回类型也相同
让编译器知道:可以添加new关键字,否则会报警。
查看全部 -
继承是提高开发效率的手段
实现继承:一个类型生于另一个基类型,它拥有该基础类型的所有组员字段和函数,被派生的类称为派生类,派生出类的类成为基类,派生类继承于基类
语法:派生类:父类
写的是子类的内容,省去父类的内容
特殊的基类:Object类,是所有类的共同基态,唯一的非派生类,继承层次结构的基础。
对于其他类,父类和子类的概念都是相对的。
规则:继承只有单继承。父类还可以继承自一个祖父类,直到Object类。
查看全部 -
面向对象编程特点:封装、继承、多态
面向对象编程优点:易维护、易扩展、易开发
查看全部
举报