Java中abstract抽象类 / abstract抽象方法 和C++的对比


JAVA:

abstract抽象类不能用new实例化对象,abstract方法只允许声明不能实现。

如果一个类中含有abstract方法,那么这个类必须用abstract来修饰,当然abstract类也可以没有abstract方法。

eg.

C:\Users\Administrator\Desktop\9999.jpg


//抽象类

abstract class Graph

{

    public abstract void Show(); 

    public void Func()

    {

        System.out.println("I am Graph!");

    }

 

class Circle extends Graph

{

    public void Show()

    {

        System.out.println("I am a circle!");

    }

 

public class Five

{

    public static void main(String args[])

    { 

        Graph g;

        g = new Circle();

        g.Show(); 

    }

}

 

NOTE:

Java中的多态和C++中多态类似, 但是也有不同,Java中没有指针的概念,因此实现多态是用子类对象给父类对象赋值。

C++中实现多态是用虚函数实现,用子类对象的地址给父类指针赋值,形如Father *pF = new Son(para1, pra2,..),

pF->Func(paras..);

Java和C++中抽象类都可以有构造函数和成员变量,只是抽象类不可以实例化对象。

另外:C++中经过实验发现另外一个问题,在下面例子中说明

 

//图片,桌面167-1   167-2

#include <iostream>

using namespace std;

 

class Father

protected: 

int a;

 

public:

virtual void Func() const = 0;         //纯虚函数,此类为抽象类

Father(int a)                                 //抽象类的构造函数

{

this->a = a;

}

 

void Show()

{

cout<<"Father a = "<<a<<endl;

 

};

 

class Son1 : public Father    //子类

{

protected: 

int a;                              //同名覆盖

 

public:

Son1(int fa, int a) : Father(fa)  //构造函数

{

this->a = a;

}

virtual void Func() const         //带const的虚函数A

{

cout<<"I am Son1"<<endl;

}

 

    /*virtual*/ void Func()             //不带const的函数B

{

cout<<"虽然本类中有个和我类似名字函数,但是还是不一样的!"<<endl;

}

 

void Show2()

{

Show();

cout<<"Son1 a = "<<a<<endl;    //默认是子类的成员变量a

cout<<Father::a<<endl;             //表明是父类的成员变量a

}

 

};

 

 

int main()

Father *pF = NULL;

Son1 son1(10, 20); 

pF = &son1;

 

pF->Func();   //通过父类指针调用的是子类虚函数A

son1.Show2();

son1.Func();  //通过子类对象调用的是子类(虚)函数B,B函数带不带virtual结果一样

 

pF->Show2(); //错误的调用,父类中并没有名为Show2的函数

pF->Show();

return 0;

}

结果

Java中abstract抽象类 / abstract抽象方法 和C++的对比 - 大灰狼 - 大灰狼 的博客

说明:上例中,需要注意的是①多态的实现是通过虚函数,即用父类指针指向子类对象,再通过父类指针调用虚函数,

         该虚函数如果是父类子类都有的(子类重写或定义了父类的纯虚函数),那么会自动调用子类的该函数,否则调用

         的是父类的函数。 即用父类指针调用的函数必须是在父类中存在的,而运行阶段再会根据虚函数表决定调用父类

         或子类的该函数 或者  哪个子类的该函数!  这点可通过上例中”错误的调用“来体现!

         

       ②对于上例中Func函数A和B,之所以能够在运行阶段区分是因为虚函数表的原因(个人见解,多态),而后者则不是。

         在其他情况下则不能这样写在一起。


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值