Java中abstract抽象类 / abstract抽象方法 和C++的对比
2012-12-05 17:21
627 查看
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;
}
结果
说明:上例中,需要注意的是①多态的实现是通过虚函数,即用父类指针指向子类对象,再通过父类指针调用虚函数,
该虚函数如果是父类子类都有的(子类重写或定义了父类的纯虚函数),那么会自动调用子类的该函数,否则调用
的是父类的函数。 即用父类指针调用的函数必须是在父类中存在的,而运行阶段再会根据虚函数表决定调用父类
或子类的该函数 或者 哪个子类的该函数! 这点可通过上例中”错误的调用“来体现!
②对于上例中Func函数A和B,之所以能够在运行阶段区分是因为虚函数表的原因(个人见解,多态),而后者则不是。
在其他情况下则不能这样写在一起。
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;
}
结果
说明:上例中,需要注意的是①多态的实现是通过虚函数,即用父类指针指向子类对象,再通过父类指针调用虚函数,
该虚函数如果是父类子类都有的(子类重写或定义了父类的纯虚函数),那么会自动调用子类的该函数,否则调用
的是父类的函数。 即用父类指针调用的函数必须是在父类中存在的,而运行阶段再会根据虚函数表决定调用父类
或子类的该函数 或者 哪个子类的该函数! 这点可通过上例中”错误的调用“来体现!
②对于上例中Func函数A和B,之所以能够在运行阶段区分是因为虚函数表的原因(个人见解,多态),而后者则不是。
在其他情况下则不能这样写在一起。
相关文章推荐
- java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
- java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
- java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
- java 抽象类 抽象方法 abstract
- java中Static&Final的使用方法,&&&Java中两个主要的抽象Abstract&&Implement
- Java学习笔记之抽象(abstract)与模板方法设计模式
- Java - 抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
- java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
- Ruby Python Java C C++ 数组使用方法对比
- 对比C++和Java
- Java调用C++和C++调用Java的方法
- (十六)Core Java 枚举的使用(基本介绍,构造方法枚举,抽象方法枚举) (113)
- Java JNI入门篇——C++中调用Java方法
- C++调用Java方法详解
- C++/JAVA程序调用weka聚类算法的方法 推荐
- java和python常用方法对比
- 调用外部DLL,如:DelphiC++Java的DLL的调用方法,给出代码片段?
- paip.java c++得到当前类,方法名称以及行号
- c++语法学习(与java、python语法对比)
- JNI中JAVA调用C/C++方法