1.继承使用说明

1.1继承时的封装

封装中我们希望进行封装操作的类的内部实现细节不会被其他类修改(set&get)、想隐藏的信息不能被其他类直接访问(private修饰),但是通过继承的方式,子类虽然无法访问被隐藏的信息,但是子类可以重写父类的方法,修改父类已经写好的实现封装的方法从而破坏封装
破坏封装的示例代码如下:
父类里的代码:

public class Father {//隐藏的变量private int age;//进行封装的getAge方法public int getAge() {return age;}//进行封装的setAge方法public void setAge(int age) {if(age < 23) {System.out.println("信息错误");}else {this.age = age;}}
}

子类里的代码如下:

public class Son extends Father{//重写父类的getAge方法,破坏封装public int getAge() {return 18;}public static void main(String[] args) {Son son = new Son();son.setAge(25);//破坏封装后,输出的值为:18System.out.println("父类private int age的值是:" + son.getAge());}
}

1.2父类设计规则

  • 尽量隐藏父类的内部数据,需要隐藏的使用private修饰;
  • 不要让子类可以随意修改、访问父类用于封装的或其他的重要方法;当不希望方法被子类重写但又要供给其他的类使用时,可以使用final修饰符;当该方法可以给子类重写但不能给其他类自由访问时,可以用protected修饰
  • 不要在父类构造器中调用被子类重写的方法。

对于第三项,如果出现在父类构造器找那个调用被子类重写的方法时,会出现空指针异常情况,具体的代码示例如下:
父类代码:

public class Father {//父类构造器初始化idea方法public Father(){idea();}public void idea() {System.out.println("要被子类重写的方法");}
}

子类代码:

public class Son extends Father{private String name;//重写父类的idea方法public void idea() {System.out.println("重写父类的idea方法,输出name的长度:" + name.length());}public static void main(String[] args) {Son son = new Son();}
}

因为此时的name的值为null,会引发空指针异(java.lang.NullPointerException)。

2.利用组合进行复用

2.1组合

组合是把旧类里的成员变量直接作为新类里的成员变量组合进来,用户看到的那么就是新类里的方法;通常需要在新类里使用private修饰被组合的旧类对象。

2.2代码示例

class Old{//隐藏的方法,新类不可用private void OldIdea() {System.out.println("Old类的OldIdea方法");}//组合后可以直接使用的方法public void test() {OldIdea();System.out.println("Old类的test方法引用private void OldIdea()");}
}public class Conposite {//将原来的旧类Old作为新类的一部分,组合进新类private Old old;//构造器public Conposite(Old old){this.old = old;}//新类中可以直接使用旧类的方法public void test() {old.test();System.out.println("Conposite类的test方法直接使用Old类的test方法");}public static void main(String[] args) {//创建组合对象Old old2 = new Old();Conposite conposite = new Conposite(old2);//使用新类的方法conposite.test();}
}

运行结果为:
Old类的OldIdea方法
Old类的test方法引用private void OldIdea()
Conposite类的test方法直接使用Old类的test方法

3.总结归纳

3.1继承

3.1.1继承的推荐使用范围

继承是可以对父类进行改造、重写,在不写过多的新方法时通过对父类的部分改造获得一个特殊的版本,将一个较为模糊抽象的类改造成适用于某些特殊情况的类。

3.1.2图解

3.2组合

3.2.1组合的推荐使用范围

如果两者之间存在着明确的整体和部分关系,那么就可以使用组合来实现复用。

3.2.2图解

Java基本知识——继承与组合相关推荐

  1. Java中的继承与组合

    本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过"组合"来改进这种继承的设计机制.最后总结这 ...

  2. 【Java SE】继承;组合;向上转型;动态绑定;方法重写;静态绑定;多态;抽象类;接口;

    面向对象编程 文章目录 1. 包 1.1 导入包中的类 1.2 静态导入 1.3 将类放到包中 1.4 包的访问权限控制 1.5 常见的系统包 2. 继承 2.1 语法规则 2.2 protected ...

  3. [JAVA冷知识]JAVA居然支持多继承?让我们用内部类去实现吧

    写在前面 JAVA冷知识,今天和小伙伴分享的是 通过内部类的方式实现JAVA的多继承 一个Demo和JDK源码中的具体场景 部分内容参考 <编写高质量代码(改善Java程序的151个建议)> ...

  4. 详细分析如何在java代码中使用继承和组合

    文章目录 继承与组合 何时在Java中使用继承 何时在Java中使用组合 继承与组成:两个例子 用Java继承重写方法 Java不具有多重继承 使用super访问父类方法 构造函数与继承一起使用 类型 ...

  5. java 继承 实现 会重写 方法吗_java 中继承,组合,重载,重写的实现原理 (转)...

    我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...

  6. java依赖_java 依赖、组合、聚合与继承

    java中类与类之间的关系 大部分的初学者只知道java中两个类之间可以是继承与被继承的关系,可是事实上,类之间的关系大体上存在五种-继承(实现).依赖.关联.聚合.组合. 接下来,简单的分析一下这些 ...

  7. 利用JAVA中关于继承的相关知识求得圆柱体体积并输出

    利用JAVA中关于继承的相关知识求得圆柱体体积并输出 Write a program: 1)Define a Circle class and a Cylinder class, which is d ...

  8. java 继承 模型_java – 画布形状模型的继承与组合?

    对于以下模型,您更喜欢继承还是组合: >我想在画布上绘制对象,每个对象代表一个数据对象 >将其视为状态机图:椭圆表示状态,线表示它们之间的连接/转换.对象表示本身永远不会改变,即状态将始终 ...

  9. Java并发知识总结,超详细!(上)

    Java并发知识总结,超详细! 首先给大家分享一个github仓库,上面放了 200多本经典的计算机书籍 ,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算 ...

最新文章

  1. 给gridview添加上下移动功能
  2. 那些让我唏嘘不已的嫡亲同学
  3. Android程序如何实现从网络中获取一张图片
  4. Android中四种补间动画的使用示例(附代码下载)
  5. Runtime.getRuntime().exec
  6. tomcat7.0.42如何设置mysql数据库连接池
  7. 史上最全Java多线程面试题
  8. kotlin 二进制_Kotlin程序检查数字是否为二进制
  9. Java8中的Stream
  10. 二叉树的递归遍历算法c语言 数据结构,递归创建二叉树c语言实现+详细解释
  11. Android音视频编辑器架构图与分析
  12. 2019计算机就业形势图表分析,2019毕业生就业形势分析
  13. 华为防火墙配置(防火墙NAT)
  14. 免费的压缩/解压缩软件
  15. android------之高德地图实现定位和3D地图显示
  16. sorted()排序详解
  17. C语言中的%d、%u、%p、%f、%lu...
  18. ArcMap中Shapefile和dBASE文件的创建与管理
  19. 特征多项式的基无关性
  20. wireshark界面调整成英文的

热门文章

  1. 2021年全球医用气体压力调节器收入大约180.9百万美元,预计2028年达到226.3百万美元
  2. 利用C语言实现二叉搜索树的遍历、查找、插入、删除
  3. Leetcode 1599. Maximum Profit of Operating a Centennial Wheel (python)
  4. 语言模型训练工具SRILM详解
  5. 优普丰十年敏捷推广的心得总结(上篇)之 “从零到一的信心加持”
  6. 站长工具大全,站长工具哪个好用,站长在线工具
  7. emi滤波matlab,EMI滤波器的基本原理
  8. arm linux免驱usb声卡,arm linux利用alsa驱动并使用usb音频设备
  9. Python和人工智能的那些事
  10. 基于管道过滤器实现的kwic实现