C++和Java的继承——构造函数问题
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),然后调用子类有参构造函数。
输出结果
调用函数问题
定义一个父类
定义子类为
执行命令
输出:
静态方法(随着类的加载而加载)
非静态方法和构造函数随着对象
静态>非静态>构造
同为静态加载顺序按先后,静态方法调用才执行
只执行
输出结果
先加载父类的静态 然后加载本身静态
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
gradle打包MyBatis的xml
正常情况下,只会打包java目录中的.java文件,其他类型的文件是不会打包到文件中。那么如何使其中的其他类型文件也打包进去呢? 方法一: 在buile.gradle里加入如下内容 processResources { from('src/main/java') { include '**/*.xml' } } 方法二: 在build.gradle中加入如下代码 task mapperXmlCopy(type: Copy) { copy { from("src/main/java") { include ("**/*Mapper.xml") } into("${buildDir}/classes/main") } print "Copy Success\n" } 说明:新建一个任务task, 把src/main/java中的**/*Mapper.xml拷贝到构建结束后的输出目录/classes/main文件夹下相对应得包名中。
- 下一篇
Java 字符串 之 String 赋值比较
http://www.verejava.com/?id=16993012522383 /** 字符串 String 1. 字符串的赋值和初始化 2. 字符串的比较 3. 字符串的内存结构 4. 字符串操作的性能问题 */ public class TestString { public static void main(String[] args) { //字符串的赋值和初始化两种形式 // 1. 直接赋值 // 2. new String() 实例化赋值 String str = "hello"; String str1 = new String("hello"); System.out.println(str); System.out.println(str1); System.out.println("\n----------------"); //字符串的比较 // 1. 引用比较 == // 2. 值比较 equals String str3 = "hello"; String str4 = new String("hello"); String str5 = new Str...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Hadoop3单机部署,实现最简伪集群