子类调用父类的构造方法

父类的构造方法不能被子类继承。以下语句中MyException类继承了java.lang.Exception类。
public class MyException extends Exception{} // MyException类只有一个隐含的默认构造方法
尽管在Exception类中定义了如下形式的构造方法:
public Exception(String msg)
但MyException类不会继承以上Exception类的构造方法,因此以下代码是不合法的。
//编译出错,MyException类不存在这样的构造方法
Exception e=new MyException("Something is error");
在子类的构造方法中,可以通过super语句调用父类的构造方法。例如:
public class MyException extends Exception{
public MyException(){
//调用Exception父类的Exception(String msg)构造方法
super("Something is error");
}
public MyException(String msg){
//调用Exception父类的Exception(String msg)构造方法
super(msg);
}
}
用super语句来调用父类的构造方法时,必须遵守以下语法规则。
l 在子类的构造方法中,不能直接通过父类方法名调用父类的构造方法,而是要使用super语句,以下代码是非法的:
public MyException(String msg){
Exception(msg); //编译错误
}
l 假如在子类的构造方法中有super语句,它必须作为构造方法的第一条语句,以下代码是非法的:
public MyException(){
String msg= "Something wrong";
super(msg); //编译错误,super语句必须作为构造方法的第一条语句
}
在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。例如以下父类Base和子类Sub分别有一个实例变量a和b,当构造Sub实例时,这两个实例变量都会被初始化。
public class Base{
private int a;
public Base(int a){ this.a=a;}
public int getA(){return a;}
}
public class Sub extends Base{
private int b;
public Sub(int a,int b){super(a); this.b=b;}
public int getB(){return b;}
public static void main(String args[]){
Sub sub=new Sub(1,2);
System.out.println("a="+sub.getA()+" b="+sub.getB()); //打印a=1 b=2
}
}
在例程11-3(Son.java)中,Son类继承Father类,Father类继承Grandpa类。这3个类都显式定义了默认的构造方法,此外还定义了一个带参数的构造方法。
例程11-3 Son.java
class Grandpa{
protected Grandpa(){
System.out.println("default Grandpa");
}
public Grandpa(String name){
System.out.println(name);
}
}
class Father extends Grandpa{
protected Father(){
System.out.println("default Father");
}
public Father(String grandpaName,String fatherName){
super(grandpaName);
System.out.println(fatherName);
}
}
public class Son extends Father{
public Son(){
System.out.println("default Son");
}
public Son(String grandpaName,String fatherName,String sonName){
super(grandpaName,fatherName);
System.out.println(sonName);
}
public static void main(String args[]){
Son s1= new Son("My Grandpa", "My Father", "My Son"); //①
Son s2=new Son(); //②
}
}
执行以上main()方法的第①条语句,打印结果如下:
My Grandpa
My Father
My Son
此时构造方法的执行顺序如图11-1所示。
如果子类的构造方法没有用super语句显式调用父类的构造方法,那么通过这个构造方法创建子类对象时,Java虚拟机会自动先调用父类的默认构造方法。执行以上Son类的main()方法的第②条语句,打印结果如下:
default Grandpa
default Father
default Son

转载于:https://www.cnblogs.com/MR-Guo/p/3306251.html

JAVA子类调用父类构造方法相关推荐

  1. Java子类调用父类的构造方法

    一.自动调用父类无参构造方法 //这是父类 public class SuperClass {//父类无参构造方法public SuperClass(){System.out.println(&quo ...

  2. Java里子类调用父类构造方法问题

    在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下: 当你new一个子类对象的时候,必须首先要new一个父类的 ...

  3. 子类调用父类构造方法 java_JAVA子类调用父类构造方法

    父类的构造方法不能被子类继承.以下语句中MyException类继承了java.lang.Exception类. public class MyException extends Exception{ ...

  4. insert时调用本身字段_java中子类调用父类构造方法注意事项

    protected继承 继承有个特点,就是子类无法访问父类的private字段或者private方法.例如,Student类就无法访问Person类的name和age字段: class Person ...

  5. java子类调用父类变量值_java子类如何调用父类变量和方法

    深入浅出,保证一看就懂 package com.company; /** * Created by liuyazhou on 2016/9/21. */ public class Test { // ...

  6. java子类调用父类的方法

    当一个类继承于另一个类,子类中没有父类的方法时,用子类的对象调用方法时,会首先在子类中查找,如果子类中没有该方法,再到父类中查找. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性. 如果该 ...

  7. java 子类调用父类内部类_java 如何在子类方法中实例化父类的内部类?

    匿名用户 1级 2012-07-30 回答 public interface Interface1 { void method1(); } public class Class1 { protecte ...

  8. java如何调用父类的实例对象_java子类调用父类的方法中包含子类重写的实例方法...

    java子类调用父类的方法中包含子类重写的实例方法 # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了 # 先看代码: public class Common { public static ...

  9. java 调用父级方法_java子类调用父类的方法是什么

    java子类调用父类的方法:1.子类的对象调用方法时,会首先在子类中查找,如果子类中没有该方法,再到父类中查找:2.如果该方法中又调用了其他方法,那么还是按照之前的顺序,先在子类中查找,再在父类中查找 ...

最新文章

  1. java des验证码,Servlet返回验证码
  2. Java对象在Java虚拟机的创建过程
  3. TCP协议连环12问
  4. ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了(转载)...
  5. 95-110-022-源码-Env-LocalStreamEnvironment
  6. flex 表格勾选后 鼠标滚动会自动勾选_外设Show 篇四十五:办公鼠里的BBA做工如何,罗技MX Anywhere 3鼠标体验_鼠标...
  7. ubuntu安装php7-mysql,ubuntu上安装php7.0+nginx+mysql
  8. 如何做到在职场中清楚有效的沟通,成为一个靠谱的职场人?
  9. 小程序入门学习06--data、url传参、调用豆瓣api
  10. Java String 类的方法
  11. 网管学习日记-MPLS-手工配置LSP
  12. 个人学习笔记:路由交换学习思路
  13. 【深度学习笔记】理解Bicubic,双三次插值
  14. 从零开始手写 VIO
  15. geoserver发布地图服务后不能预览,竟然变成下载WMS文件
  16. 浏览器中显示PPT的展示效果
  17. java runnable执行完_java – 如何停止Runnable计划在一定数量的执行后重复执行
  18. lenovo电脑的麦克风没有声音?声音小?甚至有杂音,无法聊天?
  19. testpmd csum engine 测试 checksum hw offload
  20. 解决Linux 系统,出现不在sudoers 文件中,此事将被报告的问题

热门文章

  1. 计算机组成原理—高速缓冲存储器
  2. 试题13 进制转换(十进制-R进制)
  3. ZOJ 4028 15th浙江省省赛E. LIS(神奇贪心)
  4. bzoj 3495: PA2010 Riddle(2-SAT)
  5. HDU 6191 2017广西邀请赛:Query on A Tree(字典树启发式合并)
  6. HDU 5934 2016CCPC杭州 B: Bomb(Trajan强连通)
  7. 福州大学第十四届程序设计竞赛-重现赛(Record)
  8. 前端面试之那些稀奇古怪的问题
  9. 团队项目前期冲刺-7
  10. 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】