一、子类中对父类构造函数的调用规则

1、如果不显式指定,子类中的构造函数会默认调用父类中的无参构造

测试代码

package day07;

import java.sql.Date;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter.DEFAULT;

class Parent{

    private String name;

    private int age; 

    public Parent(){

              System.out.println("Person()");

    } 

    public Parent(String name){

              System.out.println("Person(String name)");

              this.setName(name);

    } 

    public Parent(String name, int age){

              System.out.println("Person(String name, int age)");

              this.setName(name);

              this.setAge(age);

    } 

    public void setName(String name){

              this.name = name;

    } 

    public void setAge(int age){

              this.age = age;

    }

}

class Child extends Parent{

    public Child(){

              System.out.println("Child()");

    } 

    public Child(String name){

              System.out.println("Child(String name)");

    } 

    public Child(String name, int age){

              System.out.println("Child(String name, int age)");

    }

}

public class StaticKey{

    public static void main(String args[]){

              Child c1 = new Child();

              Child c2 = new Child("张三");

              Child c3 = new Child("张三", 15);

    }

}

输出

Person()

Child()
 Person()
 Child(String name)
 Person()
 Child(String name, int age)

如果此时父类中没有无参构造,则编译会报错,如:

上面的代码编译时会出现如下错误提示:

ExtendsDemo.java:13: 错误: 无法将类 Parent中的构造器 Parent应用到给定类型;
        public Child(){
                      ^
  需要: String,int
  找到: 没有参数
  原因: 实际参数列表和形式参数列表长度不同
1 个错误

2、如果父类中有多个构造函数,可以使用“super(参数列表)”的格式显式地调用父类中指定构造函数,如上述代码在Child类中做如下修改后就可以消除上面的编译错误。

class Child extends Parent{

public Child(){

super("bing", 30);

System.out.println("Child()");

}

}

二、子类中对父类函数的覆写规则

1、子类覆写父类中的函数时,访问权限只能扩大,不能减小

2、父类中private权限的函数无法被子类覆写

测试代码:

class Parent{

         public void print(){

                   System.out.println("Parent: print()");

         } 

         public void fun(){

                   this.print();

         }

}

class Child extends Parent{

         public void print(){

                   System.out.println("Child: print()");

         }

}

public class ExtendsDemo01{

         public static void main(String args[]){

                   Child c1 = new Child();

                   c1.print();

                   c1.fun();

         }

}

分别将Parent类中的print()方法的权限修改为private、default和public,然后在Child类中进行覆写,输出结果如下表所示。

------------------------------------------

父类         子类           输出

------------------------------------------

private      default        Child: print()

Parent: print()

private      public         Child: print()

Parent: print()

default      default        Child: print()

Child: print()

default      public         Child: print()

Child: print()

public       public          Child: print()

Child: print()

------------------------------------------

Java中继承的规则的更多相关文章

  1. Java中继承,类的高级概念的知识点

    1. 继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2. 继承的优点 A.代码的可重用性 B.子类可以扩 ...

  2. java中继承thread类的其他类的start()方法与run()方法

    java中继承thread或者实现runnable接口的类必须重写run()方法. 如果其执行了start()方法,其实就是启动了线程的run()方法. 注意:如果是实现runnable接口的类是没有 ...

  3. java中继承,子类是否继承父类的构造函数

    java中继承,子类是否继承父类的构造函数 java继承中子类是不会继承父类的构造函数的,只是必须调用(隐式或者显式) 下面来看例子: public class TestExtends { publi ...

  4. [转载]Java中继承、装饰者模式和代理模式的区别

    [转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...

  5. [转]Java中继承、多态、重载和重写介绍

    什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上 ...

  6. Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  7. c++中继承和java中继承的对比

    java中: class Parent{ public void test(int a){ System.out.println("Parent:" + a); System.ou ...

  8. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

    1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...

  9. [转] Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

随机推荐

  1. Linux备份和回复mysql数据库

    备份:mysqldump -u root -p密码 数据库名>/home/data.bak   mysqldump -u root -p密码 数据库名.表名>/home/data.bak ...

  2. web前端开发-Ajax(2)

    前面的一篇博文简单的简绍了Ajax基于jQuery的用法,接下来要对Ajax做进一步的介绍,Ajax请求大致可以通过三种方式发送:原生Ajax,jQuery,伪Ajax.1.原生Ajax: 由于Aja ...

  3. Tensorflow—gpu报错

    一晚上什么事都没做,就一直在查找tensorflow1.4缺少cudnn64_6的错误. 最后发现自己一直用的是cudnn64_7,即使改成cudnn64_6仍不可行.主要受实验室大佬安装的cudnn ...

  4. abap Excel 导入

    ABAP 将EXECL数据导入SAP内表的几个步骤. 本文转自:http://blog.csdn.net/szlaptop/article/details/8663451   http://www.c ...

  5. CI 框架下执行CLI(命令行)

    1.可以按照Ci官方文件的指导来进行操作 让我们先创建一个简单的控制器,打开你的文本编辑器,新建一个文件并命名为 Tools.php,然后输入如下的代码: <?php class Tools e ...

  6. Swift URL encode

    前言 在WEB前端开发,服务器后台开发,或者是客户端开发中,对URL进行编码是一件很常见的事情,但是由于各个年代的RFC文档中的内容一直在变化,一些年代久远的代码就对URL编码和解码的规则和现在的有一 ...

  7. Map集合按照value和key进行排序

    最近由于特殊的业务需求,需要做相关数据排序,下面就贴出其中的将map集合中按照value或者key进行排序的代码,后面再具体详说. /** * map 集合排序 * @param map * @ret ...

  8. Struts基本原理 + 实现简单登录(二)

    MVC 概念 MVC全名是Model View Controller,是模型(model)—视图(view)—控制器(controller)的缩写,知道这么多就够了. 大家都知道SUN公司对于MVC模 ...

  9. Spark操作算子本质-RDD的容错

    Spark操作算子本质-RDD的容错spark模式1.standalone master 资源调度 worker2.yarn resourcemanager 资源调度 nodemanager在一个集群 ...

  10. JSP<jsp:forward>与<%@ include%>

    JSP<jsp:forward>与<%@ include%><jsp:include> <jsp:forward file="forwardTo_p ...