C++
【1】声明子类变量 B b;
a.如果子类没有显示调用父类含参数的构造函数,那么在子类实例化过程中,
---顺序: 父类无参(默认)构造函数-->子类被调用的构造函数。
b.如果子类显示调用了父类的含参构造函数,那么在子类实例化过程中,
---顺序: 父类有参构造函数-->子类被调用的构造函数。
实例:
class A {
public:
A() { printf("A(void) \n"); }//父类 默认构造函数
A(int d) { printf("A %d\n", d); }//父类 有参构造函数
~A() { printf(" ~A \n"); }//父类 析构函数
};
class B : public A
{
public:
B(){
printf("B(void) \n");//子类 默认构造函数
}
B(int x) : A(x)
{
printf("B \n"); //子类 有参构造函数
}
~B() { printf("~B \n"); } //子类 析构函数
};
int main(int argc, char* argv[])
{
B c;
B b(8); // 此处也自动调用了A的同签名的构造函数
return 0;
}
输出结果:
B c;//创建c这个实例的时候 先调用A() 然后B()
B b(8);//先调用A(int x) 然后B(int x)
销毁的时候 后入先销毁
实例:
class A
{
public:
virtual void foo()
{
cout << "A's foo()" << endl;
bar();
}
virtual void bar()
{
cout << "A's bar()" << endl;
}
};
class B: public A
{
public:
void foo()
{
cout << "B's foo()" << endl;
A::foo();
}
void bar()
{
cout << "B's bar()" << endl;
}
};
int main()
{
B bobj;
A *aptr = &bobj;
aptr->foo();
A aobj = *aptr; //转化为A类对象
aobj.foo();
}
输出结果:
B bobj;
A *aptr = &bobj;
aptr->foo(); //输出B's foo() A's foo() B's bar()
//因为aptr指向的是B类对象 先调用B类foo()
//而A::foo() 调用A类foo()和foo()中的bar()
A aobj = *aptr; //转化为A类对象
aobj.foo();//都是A类方法
//
Java
【1】父类和子类同时都有有参的构造函数和无参构造函数
Java中的子类初始化时初值为空。调用顺序为先调用父类无参构造函数,然后调用子类无参构造函数。
java中的子类初始化时初值不为空。调用顺序为先调用父类无参构造函数,然后调用子类有参构造函数。
输出
先调用父类再调用子类
输出
调用父类无参 子类带参
【2】父类和子类无无参构造函数只有有参构造函数
java中的子类初始化时初值不为空。调用顺序为先调用父类有参构造函数(必须在子类有参构造函数中加显示super),然后调用子类有参构造函数。
输出结果
调用函数问题
定义一个父类
定义子类为
执行命令
输出:
静态方法(随着类的加载而加载)
非静态方法和构造函数随着对象
静态>非静态>构造
同为静态加载顺序按先后,静态方法调用才执行
只执行
输出结果
先加载父类的静态 然后加载本身静态