一、继承问题的引出

继承性是面向对象的第二大主要特征。
下面首先编写两个程序:Person类、Student类。

Person类:

class Person {private String name ;private int age ;public void setName(String name) {this.name = name ;}public void setAge(int age) {this.age = age ;}public String getName() {return this.name ;}public int getAge(){return this.age ;}
}

Student类:

class Student {private String name ;private int age ;private String school ;public void setName(String name) {this.name = name ;}public void setAge(int age) {this.age = age ;}public void setSchool(String school) {this.school = school ;}public String getName() {return this.name ;}public int getAge(){return this.age ;}public String getSchool() {return this.school ;}
}

以上两个程序通过代码的比较可以清楚的发现:代码之中存在了重复,而按照之前所学,这种重复是不可能消除的。

在所有的代码之中,最具有重复意义的就是链表类,针对于每一个简单Java类或者是说其他的任何类,都编写一个链表程序,代码量庞大,而且不方便维护。

二、继承的概念

继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

在Java之中,如果要实现继承的关系,可以使用如下的语法:

class 子类 extends 父类 {}

子类又被称为派生类; 父类又被称为超类(Super Class)。

观察继承的基本实现:

package com.wz.extendsdemo;class Person {private String name;private int age;public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return this.name;}public int getAge() {return this.age;}
}class Student extends Person { // Student类继承了Person类
}public class TestDemo {public static void main(String args[]) {Student stu = new Student(); // 实例化的是子类stu.setName("张三"); // Person类定义stu.setAge(20); // Person类定义System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge());}
}

运行结果:

姓名:张三,年龄:20

通过代码可以发现,子类(Student)并没有定义任何的操作,而在主类中所使用的全部操作都是由Person类定义的,这证明:子类即使不扩充父类,也能维持父类的操作。

在子类之中扩充父类的功能:

package com.wz.extendsdemo;class Person {private String name;private int age;public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return this.name;}public int getAge() {return this.age;}
}class Student extends Person { // Student类继承了Person类private String school; // 子类的属性public void setSchool(String school) {this.school = school;}public String getSchool() {return this.school;}
}public class TestDemo {public static void main(String args[]) {Student stu = new Student(); // 实例化的是子类stu.setName("张三"); // Person类定义stu.setAge(20); // Person类定义stu.setSchool("清华大学"); // Student类扩充方法System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge() + ",学校:" + stu.getSchool());}
}

运行结果:

姓名:张三,年龄:20,学校:清华大学

以上的代码,子类对于父类的功能进行了扩充(扩充了一个属性和两个方法)。但是思考一下:子类从外表看是扩充了父类的功能,但是对于以上的代码,子类还有一个特点:子类实际上是将父类定义的更加的具体化的一种手段。父类表示的范围大,而子类表示的范围小

三、继承的限制

虽然继承可以进行类功能的扩充,但是其在定义的时候也是会存在若干种限制的。

限制一:一个子类只能够继承一个父类,存在单继承局限。
错误的写法:

class A {}
class B {}
class C extends A,B {}          // 一个子类继承了两个父类

以上操作称为多重继承,实际上以上的做法就是希望一个子类,可以同时继承多个类的功能,但是以上的语法不支持而已,但是可以换种方式完成同样的操作。

正确的写法:

class A {}
class B extends A {}
class C extends B {}

C实际上是属于(孙)子类,这样一来就相当于B类继承了A类的全部方法,而C类又继承了A和B类的方法,这种操作称为多层继承。

结论:Java之中只允许多层继承,不允许多重继承,Java存在单继承局限。

限制二:在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)。

package com.wz.extendsdemo;class A {private String msg;public void setMsg(String msg) {this.msg = msg;}public String getMsg() {return this.msg;}
}class B extends A {public void print() {//System.out.println(msg); // 错误: msg定义为private,不可见}
}public class TestDemo {public static void main(String args[]) {B b = new B();b.setMsg("张三");System.out.println(b.getMsg());}
}

此时对于A类之中的msg这个私有属性发现无法直接进行访问,但是却发现可以通过setter、getter方法间接的进行操作。

限制三:在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化,即:默认情况下,子类会找到父类之中的无参构造方法。

package com.wz.extendsdemo;class A {public A() {         // 父类无参构造System.out.println("*************************") ;}
}
class B extends A {public B() {         // 子类构造System.out.println("#########################");}
}
public class TestDemo {public static void main(String args[]) {B b = new B() ;   // 实例化子类对象}
}

运行结果:

*************************
#########################

这个时候虽然实例化的是子类对象,但是发现它会默认先执行父类构造,调用父类构造的方法体执行,而后再实例化子类对象,调用子类的构造方法。而这个时候,对于子类的构造而言,就相当于隐含了一个super()的形式:

class B extends A {public B() { // 子类构造super(); // 调用父类构造System.out.println("#########################");}
}

现在默认调用的是无参构造,而如果这个时候父类没有无参构造,则子类必须通过super()调用指定参数的构造方法:

package com.wz.extendsdemo;class A {public A(String msg) { // 父类构造System.out.println("*************************");}
}class B extends A {public B() { // 子类构造super("Hello"); // 调用父类构造System.out.println("#########################");}
}public class TestDemo {public static void main(String args[]) {B b = new B(); // 实例化子类对象}
}

运行结果:

*************************
#########################

在任何的情况下,子类都逃不出父类构造的调用,很明显,super调用父类构造,这个语法和this()很相似:super调用父类构造时,一定要放在构造方法的首行上。

Java 继承(extends)详解相关推荐

  1. java的继承实例_java教程之java继承示例详解

    这篇文章主要介绍了java继承示例详解,需要的朋友可以参考下 什么是继承(extends)? 继承是:新定义的类是从已有的类中获取属性和方法的现象. 这个已有的类叫做父类, 从这个父类获取属性和方法的 ...

  2. java 继承 extends_java中的继承 (extends) 详解

    继承(extends) 1. 父类与子类 父类也叫基类.超类  子类也叫派生类  在继承的而关系中,"子类就是一个父类".也就是说,子类可以被当做父类来看待.例如父类是员工,子类是 ...

  3. java中的继承 (extends) 详解

    继承(extends) 1. 父类与子类 父类也叫基类.超类 子类也叫派生类 在继承的而关系中,"子类就是一个父类".也就是说,子类可以被当做父类来看待.例如父类是员工,子类是老师 ...

  4. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  5. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  6. Java注解(Annotation)详解

    转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...

  7. 5W字高质量java并发系列详解教程(上)-附PDF下载

    文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...

  8. Java中super详解

    目录 Java中super详解 super的作用: 1.     通过super可以访问父类的构造方法 2.   通过super可以访问父类的属性(非私有) 3.        通过super可以访问 ...

  9. Java期末复习题详解

    Java期末复习题详解 选择题 1 .class: .java: .cpp: .txt: 2 3 4 封装: 继承: 覆盖: 重载: 5 构造函数: 特点: 6 异常处理: 注:catch可以进行多重 ...

  10. 【狂神说Java】多线程详解

    [狂神说Java]多线程详解 1.任务 生活中的例子.边吃饭.边玩手机 开车.打电话.挂点滴 上厕所.玩手机 现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上我们的大脑在同一时 ...

最新文章

  1. BD-09 GCJ-02 WGS84 坐标之间的转换
  2. 从理论知识到落地能力,你欠缺了什么?
  3. 一个比较不错的swapidc模板源码
  4. 两个MYSQL数据同步的SHELL脚本
  5. 自动化测试元素查找利器firepath介绍
  6. java时间转化类,一小时前,刚刚一个月前
  7. IP地址的分类和层次
  8. 智能优化算法——蝙蝠算法(PythonMatlab实现)
  9. windows下安装python-pcl及其问题解决办法
  10. 【Google Play】创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 )
  11. vfp access mysql具体_详细介绍Visual FoxPro数据表的索引
  12. 论文翻译:Dual-path RNN: efficient long sequence modeling for time-domain single-channel speech separatio
  13. python 配对t检验_配对t检验的python实现
  14. ssm实战(1)------数据库表结构
  15. Kubernetes Egress 网络策略指南
  16. 苹果硬改手机底层udid无限新机技术
  17. daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序-20210726002244.doc-原创力文档...
  18. intellij idea 工具栏的隐藏和显示
  19. js 防抖是什么 JavaScript防抖怎么用
  20. 云存储空间选择十分重要,大小确是关键因素

热门文章

  1. Unity如何区分安卓、苹果设备是手机与平板?
  2. Xenapp appcenter初始化报错:Errors occurred when using XAC-1 in the discovery process
  3. 高仿天猫读书首页的滑动切换效果:采用RecycleView + PagerSnapHelper 实现ViewPager的效果
  4. 领导同志发言万能模板 这个跟技术不相关 放在这里保存下
  5. Qt编程 —— 模态对话框和非模态对话框
  6. matplot画轨迹图
  7. 入耳式蓝牙耳机哪款音质好?入耳式降噪蓝牙耳音质排行榜
  8. 一个可以重复遍历的RowSet
  9. .htaccess文件RewriteRule语法规则
  10. strcpy和strncpy的使用以及strcpy的模拟实现(三种方法)