抽象类的概恋:
抽象类:就是包含有未定义的虚函数的类,也就是说只在类中声明了一个抽象类,但没有具体定义,或者把虚函数定义为virtual void f()=0;这样的形式。注意函数后有一个=0。因此派生类必须实现这个函数,如果派生类没有实现这个函数,则这个派生类也是抽象的。
抽象类为什么不能实例化对象:因为抽象类中包含有没有定义的函数,因此不能用抽象类来实例化对象。但可以声明抽象类的指针指向派生类。
示例:
class A{public: virtual void f()=0;}; //声明一个抽象类。
class B:public A{public: void f(){cout<<"B"<<endl;};。
void main()
{A ma; //错误,因为类A是抽象类,含有未实现的函数f()。因此不能创建对象。
B mb;
A *p=&mb; //可以创建抽象类的指针指向派生类对象。
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 [1]。
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 [1]。
比如,在一个图形编辑软件的分析设计过程中,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域并不是直接存在的,它就是一个抽象概念。而正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
(1)接口
(2)抽象类
(3)构造方法的访问权限为私有。
其实并不是不能被实例化,也可以直接在new对象时实现其实例化,比如Student是接口:
Student student = new Student(){。
//具体在这里实现接口里的抽象方法。
public void setName() {。
..........。
}
大概是在这样吧!至于内部类,应该是可以实例化的,只不过它是依赖外部类的对象来实例化,也就是在实例化内部类对象之前,必须存在外部类的实例化对象。
javaweb无法实例化类是没有构造函数。不能用new操作new一个新的抽象对象。没有构造函数的累也不能实例化,私有构造的也不能实例化,一个类是抽象类,就是得在类名前面加上abstract。
这个只能说明你没有实例化变量就进行了使用,比如我经常犯的错误:。
string s;
string s2="hh";。
return s==s2;
此时就会报错,因为s还没有实例化,但是同样的,也不能使用s==null进行判断,这就让人很纠结。解决方案是对s==null使用Object.ReferenceEquals(s,null);这样就不会报错了。这类对象未实例化错误都需要从出错的地方向上排查,找到所有可能对对象赋值的地方,再考虑是否发生了没有考虑到的情况致使对象没有被实例化或者被赋值为nul。
基类中有纯虚函数,如virtual int fun() = 0;。
在派生类中要实现 这个纯虚函数。
如果派生类中没有实现这个函数,那么等于派生类中也有了,virtual int fun() = 0;。
那么派生类也变成了抽象类,不能实例化。
抽象类:有纯函数的类。
原文地址:http://www.qianchusai.com/%E6%97%A0%E6%B3%95%E5%AE%9E%E4%BE%8B%E5%8C%96%E5%AF%B9%E8%B1%A1.html