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

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. greenlet和gevent模块的区别?

    协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. yield能实现协程,不过实现过程不易于理解,greenlet是在这方面做了改进,通过switch. greenlet可以实现协程, ...

  2. 检出的maven项目没有“M”标识

    从SVN服务器上检出的项目,在项目左上角没有“M”标识 解决此方案有两种方法: 1.将检出的项目“删除”(不删除工作空间的项目),重新导入,选择“Maven 项目”,导入完成即可. 2.选中项目右键, ...

  3. proguard 不混淆第三方jar包的问题

    导入lib文件,并且用-dontwarn 和 keep class结合试试,例如: -libraryjars libs/log4j.jar -dontwarn org.apache.log4j.*-k ...

  4. oracle字符串函数总结

    字符函数——返回字符值 这些函数全都接收的是字符族类型的参数(CHR 除外)并且返回字符值.除了特别说明的之外,这些函数大部分 返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库 ...

  5. AbstractQueuedSynchronizer(一)

    应该将子类定义为非公共内部帮助器类,一般并发包类用内部类Sync sync来继承并实现.为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量.事件,等等)提供一个框架.此类的设计目 ...

  6. JVM - 堆外内存

    看了不少资料,总结下: 堆外内存 / 直接内存(Direct Memory)JDK1.4中引入的NIO类,基于channel和Buffer的I/O方式,可用Native库直接分配堆外内存,然后利用一个 ...

  7. 20165101 预备作业3 Linux安装及学习

    #Linux安装及命令入门 安装虚拟机 学习了娄老师的博客<基于VirtualBox虚拟机安装Ubuntu图文教程>,我下载了最新版的VirtualBox和16.04版的Ubuntu.根据 ...

  8. Android关闭USB的ADB调试和文件传输功能(禁用USB)【转】

    本文转载自:https://blog.csdn.net/jun4331247/article/details/51201825 通过设置系统属性(System Property)[persist.sy ...

  9. Codeforces 337D Book of Evil:树的直径【结论】

    题目链接:http://codeforces.com/problemset/problem/337/D 题意: 给你一棵树,n个节点. 如果一个节点处放着“罪恶之书”,那么它会影响周围距离不超过d的所 ...

  10. C++(十)— 字符串进行插入、替换、查找、删除操作、substr

     1.C++中对字符串进行插入.替换.删除操作 #include<iostream> #include<algorithm> #include<stdio.h> # ...