关于Java中的继承
来源:互联网 发布:上海一姐张弦淘宝店 编辑:程序博客网 时间:2024/06/05 13:23
关于继承,大家肯定不会陌生,甚至经常使用。
在继承中有这么一条规定:子类无法继承父类的构造方法。
但是我们再看继承条件下的构造方法遵循以下几点规则:
在这时我们如果在写父类时仅构造了一个有参的构造方法,而没有构造无参的构造方法,而在实例化子类时如果调用子类的无参构造方法,这时程序是不能通过编译的,如下:
首先看父类:
public class A {public String name;public A(String name){this.name = name;}}
此时父类仅有一个有一个参数的构造方法。
然后看子类
public class B extends A {public B(){System.out.println("B");}}
此时子类仅有一个无参的构造方法,此时Eclipse中无法通过编译
然后看测试类
public class Test {public static void main(String[] args) {B b = new B();}}
运行此程序时将在控制台出现以下错误
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Implicit super constructor A() is undefined. Must explicitly invoke another constructorat B.<init>(B.java:3)at Test.main(Test.java:4)
出现这个错误的原因就是上面说的规则一:如果子类的构造方法中没有通过super显式调用有参构造方法,也没用通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。
在子类构造方法中没有使用super关键字,也没有使用this关键字,这时系统会调用父类也就是A类的无参构造方法,但是此时A类中没有无参的构造方法,就会抛出这个异常。
那么上述三个规则就很容易理解了,下面看一个具体示例加深理解。
首先看有一个Person类,有name属性,同时有一个无参的构造方法,和一个有一个参数的构造方法。
public class Person {String name;public Person(){System.out.println("执行人类的无参构造方法");}public Person(String name){this.name = name;System.out.println("执行人类有一个参数构造方法");}}
然后看学生类,它是人类的子类,有个school属性,和一个无参构造方法和全参构造方法
public class Student extends Person {String school;public Student(){System.out.println("执行学生类的无参构造方法!");}public Student(String name,String school){super(name);this.school = school;System.out.println("执行学生类全参构造方法");}}
然后看研究生类,它是学生类的子类,它有一个导师属性,和一个无参构造方法和一个全参构造方法。
public class Graduate extends Student {String guide;public Graduate(){System.out.println("执行研究生类的无参构造方法");}public Graduate(String name,String school,String guide){super(name, school);this.guide = guide;System.out.println("执行研究生类的全参构造方法");}}
然后看一下测试类
public class Test {public static void main(String[] args) {Graduate g = null;g = new Graduate();System.out.println();g = new Graduate("张三", "北京大学", "李四");}}
代码分析:
首先在执行g = new Graduate();后,一共创建了四个对象,按照创建顺序依次是Object、Person、Student、Graduate对象。首先执行Graduate类的无参构造方法,这里没有使用super关键字也没有使用this关键字,这是根据规则一来看,这时会调用父类无参构造方法,Graduate类的父类是Student类;执行Student类的无参构造方法,Student的构造方法也没有使用super和this关键字,因此调用Student类的父类的无参构造方法,Student类的父类是Person类;执行Person类的无参构造方法也没有super和this关键字,这时继续调用Person类的父类的无参构造方法,Person类的父类是Object类,Object类的无参够方法没有做任何处理,这是生成一个Object对象,然后继续执行Person类无参构造方法中剩余部分,即在控制台打印输出执行人类的无参构造方法,然后生成一个Person类对象,然后继续执行Student类无参构造方法剩余部分…………
同时执行g=new Graduate("张三","北京大学","李四");会顺序执行父类的相应的构造方法,同时也是生成四个对象。
我们看一下执行结果截图:
- 关于Java中的继承
- 关于Java中的继承
- 关于java中的继承
- 关于java 中的继承问题
- Java:关于继承中的重写
- 关于Java继承中的Pivate变量
- 关于C++中的继承
- Java关于继承中的转型及其内存分配
- 黑马程序员---关于Java中的继承关系例子
- 关于Java中的封装、多态、继承(1)
- 关于Java继承
- 关于Java的继承
- 关于JAVA的继承
- java、关于继承
- 关于Java的继承
- 关于JAVA多继承
- java中的继承关系
- java中的继承
- 黑马程序员--------------对象的实例化思考
- java Collection学习
- 多线程,进程
- hdu 5012 Dice(西安网络赛F题,BFS)
- 大话数据结构读书笔记——第七章 图
- 关于Java中的继承
- 在一个长度为10的整形数组中,前9个元素是{12,23,34,45,56,67,78,89,90}。 现在要求输入一个整数,把它放到数组中正确的位置当中。(不能删除已有元素)
- D3D 直接操作后台缓存绘制
- DHCP报文分析
- poj2488--A Knight's Journey(dfs,骑士问题)
- POJ 1990 MooFest
- js中取struts2中action传来的值
- 入门训练 圆的面积
- C#中的委托和事件(续)