此篇文章是我针对自己的理解和自己对本章节的问题做出的总结,也查了一些资料。希望可以帮助大家真正的深刻地理解什么是方法,方法的各大使用;
由于方法是声明在类中的,所以本篇内容还设计到一些类的知识,就当知识扩展了。
注:本篇文章提到的例子,将在下篇文章中举出,希望大家继续关注:
上图中我们概要了方法的一些重要知识点——分类;方法的重载和重写;抽象方法;密封方法。 仅靠这些简单的概述也许我们并不能完全理解这么多东西。为了使大家更加深刻的理解,并熟练的掌握,下面我们提出以下这些问题,然后一一作答:
例子连接:
http://blog.csdn.net/hanxuemin12345/article/details/8302608
1,静态方法和非静态方法的区别:(例子1)
静态方法:不能用实例来调用,用类名调用;不能使用this关键字。
非静态方法:用实例来调用;能使用this来访问该方法。
2,方法重载和方法重写的不同之处:(例子2)
重载:类中有两个以上的同名方法,但是使用的参数个数、类型或顺序不同。
重写:派生类中重写基类中的方法。
3,抽象类与非抽象类的主要区别:
抽象类(关键字:abstract)
(1)不能直接实例化;(抽象类的实例化—例子3)
(2)可以包含抽象成员;
(3)不能被密封——原因:因为类被密封后,其他类不能从该类继承,所以密封类不能做基类;然而抽象类中的抽象方法必须要在继承此抽象方法的派生类中重写,所以抽象类不能被密封。
(自己的理解。很简单,希望对大家有所帮助!!)
4,抽象方法(关键字:abstract)的声明:(例子3:抽象类和抽象方法的使用)
(1)必须声明在抽象类中:
public abstract class 抽象类名
{
public abstract void 抽象方法名();
(2)不能使用virtual、static和private修饰符;
(为什么不能用virtual?使用virtual修饰符的方法是虚方法。virtual修饰符用在基类的方法中,表示允许派生类中对该方法重写(重写时,使用override修饰符);而抽象方法不需要使用virtual修饰符,就可以在派生类中重写(重写时,使用override))
5,抽象方法和虚方法的区别:
抽象方法:
(1)声明例子: public abstract void method(); ;
(2)关键字:abstract;
(3)必须被派生类重写;
(4)一定没有实现体(可以看成是没有实现体的虚方法);
(5)如果类中包含抽象方法,则类就必须定义为抽象类,不论是否还包含其它一般方法;
虚方法:
(1)声明例子:public virtual void method(); ;
(2)关键字:virtual;
(3)调用虚方法时,运行时将确定调用对象是什么类的实例,并调用适当的重写方法;
(4)可以没有实现体;
总结:说白了,虚方法就是指可以被重写的方法。
6,抽象类和接口的相同点和不同点:
相同点:
(1)都不能实例化;
(2)都包含没有实现体的方法;
(3)派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法还包括其他成员)
不同点:
(1)一个类可以继承多个接口,但不能继承多个类(包括抽象类和费抽象类);
(通过接口可以实现多重继承)
(2)抽象类中可以定义成员的实现(比如,抽象类中可以定义有具体实现的方法),接口不可以;
(3)抽象类中可以包含字段、构造函数、析构函数、静态成员或常量等,接口不可以;
(4)抽象类中的成员可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员(受保护的内部成员只能在应用程序的代码或派生类中访问),但接口中的成员必须是公共的;
7,抽象类和接口的应用:
抽象类:
(1)创建多个组件的多个版本时 使用;抽象类提供简单的方法来控制组件版本;
(2)设计大的功能单元时 使用;
(3)主要用于关系密切的对象;
接口:
(1)如果创建的功能将在大范围的全异对象间使用,则使用接口;
(2)设计小而简练的功能块时 使用;
(3)适合为不相关的类提供通用功能;
网上发现这个,感觉很好,分享一下
抽象类和接口的形象比喻:
1.)飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2.) 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
8,密封类(例子4:密封类和密封方法的使用)
(1)关键字:sealed
(2)说明:
<1>不能作为基类被继承,但它可以继承别的类和接口;
<2>因为不能作为基类被继承,所以密封类中不能声明受保护成员或虚成员(因为受保护成员只能允许派生类访问,而虚成员只能在派生类中重写)
<3>因为不能作为基类被继承,所以密封类不能声明为抽象类,即修饰符sealed不能与abstract同时使用
9,所有类和成员都可以使用密封吗?类满足什么条件则将其密封?
密封了某个类,则其他类不能从该类继承;密封了某个成员,则派生类不能重写该成员.默认情况下,不应密封类型和成员。
如果类满足一下条件,则应将其密封:
(1)是静态类;
(2)包含带有安全敏感信息的继承的受保护成员;
(3)继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类;
(4)是一个要求使用反射进行快速搜索的属性。密封属性可提高反射在检索属性时的性能。
10,密封方法(例子4:密封类和密封方法的使用)
(1)不是每个方法都可以声明为密封方法;
(2)只能用于对基类的虚方法进行实现,并提供具体的实现;
(3)所以,声明密封方法时,sealed总是和override同时使用;