java 一个类通过类名调用不在同一个包里的另一个类的函数,
这样你把函数写成静态的 static,然后就可以通过类名来调用了,
否则就是new对向后在调用
举个例子:
//文件 : Ajava
package comthread;
public class A {
public static void method(){
Systemoutprintln("call method");
}
}
//文件:Bjava
package comheatontest;
import comthreadA;
public class B {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public void callMethod(){
Amethod();//直接通过类名调用
}
}
这样调用
1 如果在子类中调用 ,那么先new 一个参数所在类型的对象a,即 A a = new A(),然后在子类中用super(a)就可以调用父类的带类参数构造方法。
2 如果在其他类中调用,那么也需要先new 一个参数所在类型的对象a,即 A a=new A();,然后new调用类的的时候把参数传进去就可以了,B b = new B(a)。
首先你的代码 写错的几个地方 ,
按照你的意思 运行结果因为
B0
B0
B0
c++中是调用还是引用,(我感觉还是引用,)我记不清了。 但是 在c++中要是重载 ,就要是用 虚函数。
否则 ,只能是达到 子类同名函数 覆盖 了基类同名的 函数。 而 基类 对象 引用 子类对象 时,并不能达到 多态性 。 要使 之达到多态性,就使用 虚函数 。
#include<iostream>
using namespace std;
class B0
{
public:
virtual void display(){cout<<"B0"<<endl;}
};
class B1:public B0
{
public:
void display(){cout<<"B1"<<endl;}
};
class D1:public B1
{
public:
void display(){cout<<"D1"<<endl;}
};
void fun(B0 ptr)
{
ptr->display();}
int main(){
B0 b0,p;
B1 b1;
D1 d1;
p=&b0;
fun(p);
p=&b1;
fun(p);
p=&d1;
fun(p);
return 0;
}
这就是使用虚函数。只要在 基类某个函数前加个virtual 修饰。
而java中,没那么复杂,多态性与生俱来,
至于由继承而引发的多态性的过程,我曾经也分析过,
你可以看下:
我认为a是引用了B创建的对象,但这个不是完全的引用,就是说他数据内容缩小了,只取了new B()的一部分。这个过程方法的运行多态性也就体现了,实际上是多态性的第2种情:由继承机制而产生的方法覆盖。 好了,方法有覆盖,但变量只有隐藏,没有覆盖,对于属性的话,在子类中,父类的同名的变量成员会隐藏,但是父类引用子类对象的时候,不会覆盖父类本身的属性。即:多态性不发生在数据成员上,当然也不会发生在静态成员上。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)