java继承使用的细节问题?
关于java继承的基本概念就不多说了,下面就说说继承使用应该注意的细节问题?
示例 一:
package com.bizvane;
class Fu{
public Fu() {
System.out.println("Fu constructor ....");
}
}
class Zi extends Fu{
public Zi() {
System.out.println("Zi constructor ....");
}
}
public class ExtendsDemo {
public static void main(String[] args) {
new Zi();
}
}
执行结果:
Fu constructor ....
Zi constructor ....
看到这个结果,想必很多人会问,new Zi 类对象,并没有调用Fu 类呀,为什么会出现这个结果?
答案是: 在Zi类无参构造函数第一行会有一个隐式的 super() 语句, 这样就会初始化Fu类。
示例二:
package com.bizvane;
class Fu{
public Fu(int x) {
System.out.println("Fu constructor ...."+x);
}
}
class Zi extends Fu{
public Zi(int x) {
System.out.println("Zi constructor ...."+x);
}
}
public class ExtendsDemo {
public static void main(String[] args) {
new Zi();
}
}
执行结果:
在 第 13行编译报错,参数类型不匹配
大家肯定会想为什么呢?
答案是: 首先我们知道每个类中会有一个默认的无参构造函数,现在 Fu 和Zi 类都已经有了有参构造函数,那么默认的无参构造函数就不存在了,结合上面的例子,在Zi 类的有参构造函数第一行会有一个隐式的
super() 语句 当 new Zi(6); 的时候会初始化 Zi 类,super() 调用 Fu 类, 而此时 Fu 类 中已经没有无参构造函数,所以编译就通不过
正确解决办法: 在 Fu 类 加上一个 无参构造函数,或者在 Zi 类的有参构造函数前面加上一个显式 的 super(x)
示例三 :
class Fu{
Fu(){
System.out.println("Fu constructor ....A..");
}
Fu(int x){
System.out.println("Fu constructor ....B.."+x);
}
}
class Zi{
Zi(){
System.out.println("Zi constructor ....C..");
}
Zi(int x){
System.out.println("Zi constructor ....D.."+x);
}
}
class ExtendsDemo{
public static void main(String[] args){
new Zi();
new Zi();
}
}
执行结果:
Fu constructor ....A..
Zi constructor ....C..
Fu constructor ....A..
Zi constructor ....D..6 你心里的答案是否这样的呢? 大家想想为什么吧? 思考: this()的用法?
1. 如果子类的构造函数第一行写了this调用了本类其他构造函数,那么super调用父类的语句还有吗?
没有的,因为this() 或者 super(), 只能定义在构造函数的第一行,因为初始化动作要先执行。
2. 父类构造函数中是否有隐式的super()语句呢?
也是有的,记住:只要是构造函数默认第一行都是有super()语句,
那么父类的父类是谁呢? super调用到底是谁的构造函数呢?
java体系在设计,定义了一个所有对象的父类 Object
总结:
类中的构造函数默认第一行都有隐式的super()语句,访问父类中的构造函数,
所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。
如果默认的隐式super的语句没有对应的构造函数,必须在构造函数中通过this 或者 super 的形式明确调用的构造函数。
java继承使用的细节问题?的更多相关文章
- Java - 20 Java 继承
Java 继承 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解为一个对象从另一个对象获取属性的过程. 如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子 ...
- Java中的泛型 - 细节篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的泛型 - 细节篇>,希望对大家有帮助,谢谢 细心的观众朋友们可能发现了,现在的标题不再是入门篇,而是各种详细篇,细节篇: 是因为之 ...
- 「万字图文」史上最姨母级Java继承详解
摘要:继承是面向对象软件技术中的一个概念.它使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用. 本文分享自华为云社区<「万字图文」史上最姨母级Java继承详解丨[奔跑吧!JAVA] ...
- Java泛型中的细节
Java泛型中的细节 如果没有泛型 学习Java,必不可少的一个过程就是需要掌握泛型.泛型起源于JDK1.5,为什么我们要使用泛型呢?泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一 ...
- Java继承与组合
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
- JAVA继承时构造函数的问题
今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...
- Java继承和接口
接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...
- Java继承的初始化
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- Java—继承、封装、抽象、多态
类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...
随机推荐
- php 获取优酷视频的真实地址(2014.6月新算法)
上个礼拜发现优酷改版了,各种过滤优酷广告的插件都失效了,于是我百度了一下(谷歌也不能用了)发现优酷改算法了,在ckplayer论坛发现有人在6月25号发了个php 的优酷代理文件,下载下来发现,能用但 ...
- Java for LeetCode 089 Gray Code
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- 剑指Offer:二叉树打印成多行【23】
剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.uti ...
- 微信小程序开发:学习笔记[4]——样式布局
微信小程序开发:学习笔记[4]——样式布局 Flex布局 新的布局方式 在小程序开发中,我们需要考虑各种尺寸终端设备上的适配.在传统网页开发,我们用的是盒模型,通过display:inline | b ...
- 解决webpack不能匹配post请求的问题
解决webpack不能匹配post请求的问题 webpack的dev-server只能匹配get请求,在本地做本地数据的时候会很不方便. 可以使用如下两种办法解决: 1.在webpack.config ...
- vuex原理笔记
本文总结自: https://tech.meituan.com/vuex-code-analysis.html, 将要点提炼为笔记,以便不时之需,安不忘危. 核心可分为两部分: 1.vue.use(V ...
- 让django完成翻译,迁移数据库模型
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上篇我们完成了数据库模型的代码,但是还只 ...
- 深入理解JVM - Java内存模型与线程 - 第十二章
Java内存模型 主内存与工作内存 Java内存模型主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量(Variable)与Java编程中 ...
- CI公用模型
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * SEO管理系统 -- 公用模型 ...
- 搭建LoadRunner中的场景(四)控制器的全局设置
选择“Tools”菜单-“Options”选项打开设置窗口 1.超时设置 2.运行时设置 3.运行时文件存储设置 4.路径翻译表 路径翻译表是一种映射,将控制器上的文件路径转换为远程主机上的文件路径. ...