第七章 复用类(上)

Thinking in Java 第四版完整版 第七章练习题 复用类 Thinking in Java 第四版完整版 第七章练习题,记录一下(jdk1.8.0) 1. /** * 练习1:创建一个简单的类。在第二个类中,将一个引用定义为第一个类 * 的对象。运用惰性初始化来实例化这个对象。 * @author admin11 * @date 2018年3月21日 */ class Simple { String s; pu... 阅读详情

                     第七章  复用类

          这一章的知识我花了叫长时间去读,写了很多代码去验证书上所阐述的内容,并且也去测试自己的想法,所以总结的时候也很费时,暂时我只总结了这一章当中的一部分,明天继续加油。

        复用代码是Java众多引人注目的功能之一。但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。
        Java中所有的实物一样,问题解决都是围绕着类展开的。可以通过创建新类来复用代码,而不必再重头开始编写。可以使用别人已经开发并调试好的类。 在Java中有两种方法来达到代码复用的目的。
       第一种:这种方法非常直观,只需要在新的类中产生现有类的对象。由于新类是有现有类的对象所组成,所以这种方法称为组合。
       第二种:这种方法更细致一些,它按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。这种神奇的方式称为继承,并且编译器可以完成其中大部分工作。继承是面向对象程序设计的基石之一。

7.1  组合语法
     只需要将对象的引用置于新类中即可。
     编译器并不是简单地为每一个引用都创建默认对象,这一点是很有意义的,因为若真要那样做的话,就会在许多情况下增加不必要的负担,如果想初始化这些引用,可以在代码中的下列位置进行:
      1、在定义对象的地方。这意味着它们总是能够在构造器被调用之前被初始化。
      2、在类的构造器中。
      3、就在正要使用这些对象之前,这种方式称为惰性初始化。在生成对象不值得及不必每次都生成对象的情况下,这种方式可以减少额外的负担。
      4、使用实例初始化。
7.2  继承语法
      继承是所有OOP语言和Java语言不可缺少的组成部分。当创建一个类时,总是在继承,因此,除非已明确指出要从其他类中继承,否则就是在隐式地从Java的标准根类Object进行继承。
      在继承过程中,并不一定非得使用基类的方法。也可以在导出类中添加新方法,其添加方式与在类中添加任意方法一样,即对其加以定义即可。
7.2.1  初始化基类
      由于现在涉及基类和导出类这两个类,而不是只有一个类,所以要试着想象导出类所产生的结果对象,会有点困惑。从外部看,它就像是一个与基类具有相同接口的新类,或许还会有一些额外的方法和域。但继承并不只是复制基类的接口。当创建了一个导出类的对象时,该对象包含了一个基类的自对象。这个子对象与你用基类直接创建的对象是一样的。二者区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部。
      当然,对基类子对象的正确初始化也是至关重要的,而且也仅有一种方法来保证这一点:在构造器中调用基类构造器来执行初始化,而基类构造器具有执行基类初始化所需的所有知识和能力。
     下面看懂这段代码就明白上述所讲的内容了:
     class Art{
     Art(){
          System.out.println("art contructor");
     }
}
class Drawing extends Art{
          Drawing(){
               System.out.println("drawing contructor");
          }
}
public class Cartoon extends Drawing{
     public Cartoon(){
          System.out.println("Cartoon contructor");
     }
     public static void main(String[] args) {
          Cartoon x = new Cartoon();

     }
}
运行结果:
art contructor
drawing contructor
Cartoon contructor


带参数的构造器
上列中各个类均含有默认的构造器,即这些构造器都不带参数。编译器可以轻松地调用它们是因为不必考虑要传递什么样的参数问题。但是,如果没有默认的基类构造器,或者想调用一个带参数的基类构造器,就必须用关键字super显式地编写基类构造器的语句,并且配以适当的参数列表:
   class Game{
     Game(int i){
          System.out.println("Game contructor");
     }
}
class BoardGame extends Game{
     BoardGame(int i) {
          super(11);
          System.out.println("BoardGame contructor");
     }
}
public class Chess extends BoardGame{
     Chess() {
          super(11);
          System.out.println("Chess contructor");
     }
     public static void main(String[] args) {
          new Chess();
     }
}
运行结果:
Game contructor
BoardGame contructor
Chess contructor

其实联想到我在android开发中,当你继承一个activity时,在方法中就会看到super这个关键字。

7.3  代理
      第三种关系称为代理,Java并没有提供对它的直接支持。这是继承与组合之间的中庸之道,因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。例如,太空船需要一个控制模块:
     public class SpaceShipControls {
     void up(int velocity){}
     void down(int velocity){}
     void left(int velocity){}
     void right(int velocity){}
}
构造太空船的一种方式是使用继承:
     public class SpaceShip extends SpaceShipControls{
     private String name;
     public SpaceShip(String name){
          this.name=name;
     }
     public String toString(){
          return name;
     }
     public static void main(String[] args) {
          SpaceShip spaceShip = new SpaceShip("NSEA ");
          spaceShip.down(1);
     }
}
然而,SpaceShip并非真正的SpaceShipControls类型,即便你可以操作这些方法。更准确地讲,SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法在SpaceShip中都暴露了出来。这里如果使用组合也是一样会暴露。但是代理解决了此难题:
      public class SpaceShipDelegation {
     private String name;
     private SpaceShipControls controls=new SpaceShipControls();
     public SpaceShipDelegation(String name){
          this.name=name;
     }
     public void down(int velocity){
          controls.down(velocity);
     }
     public void up(int velocity){
          controls.up(velocity);
     }
     public void left(int velocity){
          controls.left(velocity);
     }
     public void right(int velocity){
          controls.right(velocity);
     }
     public static void main(String[] args) {
          SpaceShipDelegation delegation = new SpaceShipDelegation("NSEA");
          delegation.down(1);
     }

}

7.4  结合使用组合和继承
      同时使用组合和继承是很常见的事,例如:
       class Plate{
     Plate(int i){
          System.out.println("Plate constructor");
     }
}
class DinnerPlate extends Plate{
     DinnerPlate(int i) {
          super(i);
          System.out.println("DinnerPlate constructor");
     }
}
class Utensil{
     Utensil(int i){
          System.out.println("Utensil constructor");
     }
}
class Spoon extends Utensil{
     Spoon(int i) {
          super(i);
          System.out.println("Spoon constructor");
     }
}
class Fork extends Utensil{
     Fork(int i) {
          super(i);
          System.out.println("Fork constructor");
     }
}
class Custom{
     Custom(int i){
          System.out.println("Custom constructor");
     }
}
public class PlaceSetting extends Custom{
     private Spoon sp;
     private Fork frk;
     private DinnerPlate pl;
     PlaceSetting(int i) {
          super(i+1);
          sp=new Spoon(i+2);
          frk=new Fork(i+3);
          pl=new DinnerPlate(i+4);
          System.out.println("PlaceSetting constructor");
     }
     public static void main(String[] args) {
          new PlaceSetting(9);
     }

}
运行结果:
Custom constructor
Utensil constructor
Spoon constructor
Utensil constructor
Fork constructor
Plate constructor
DinnerPlate constructor
PlaceSetting constructor
 
       虽然编译强制你去初始化基类,并且要求你在构造器的起始处就要这么做,但是它并不监督你必须将成员对象也初始化,因此在这一点上自己必须时刻注意。
  

单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析 本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。 阅读详情

相关推荐

Ubuntu开机卡在BusyBox?3种方法快速修复initramfs错误(附详细命令)

本文详细介绍了Ubuntu开机卡在BusyBox并出现initramfs错误的3种修复方法,包括使用fsck检查文件系统、调整BIOS/UEFI存储设置以及修改GRUB内核参数。针对常见的文件系统错误和根设备无法找到问题,提供了具体的命令行操作步骤和实用技巧,帮助用户快速恢复系统启动。

milk8的博客 784

继承和成员对象初始化

我们初始化对象时,编译器会强制初始化基类,并且需要在构造器起始处就这么做,但是编译器并不监督我们必须将成员对象也进行初始化,因此我们必须时刻注意类的成员对象的初始化: 初始化类的引用对象,实例变量可以再下列位置进行: 1.在定义对象的地方,这意味着它们总是能够在构造器被调用之前就被初始化 public class Dog{ String name = "HashQ";//在定义它...

每一天,沉淀自己 300

Endnote 导入参考文献的时候,格式错误太多了。et.al错误,国标GBT7714在endnote中的详细配置教程,适用于本科,硕士论文文献插入的模板

EndNote插入文献常遇到以下错误主要如下: 等、et al不分; 英文作者全名大写; 期刊名字使用了缩写(图片里没有体现;卷号、期号缺失时出现乱码,多了半个括号;页码范围略去了相同部分;没有悬挂缩进,本文全部解决,全网最细

sakura的博客 3万+

thinking in java 笔记 思维导图 第七章 复用类

mythling的专栏 428

Flutter 直接调用so动态库,或调用C/C++源文件内函数

我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。

开发以大橘为重 8349

unity中判断是否联网,判断网络状态的两种方式

unity中判断是否联网,判断网络状态的两种方式

wla2996gpy032的博客 1876

第七章 复用类

文章目录1.组合语法2.继承语法初始化基类3.代理4.结合使用组合和继承确保正确清理名称屏蔽5.在组合和继承之间选择6.Protected关键字7.向上转型为什么称为向上转型应该用组合还是继承?8.Final关键字final数据final方法9.初始化及类的加载继承于初始化 1.组合语法 定义:只需要在新类中产生现有类 惰性初始化:先定义引用,在使用对象的时候再进行初始化 2.继承语法 定义:按照现有类类型创建新类 初始化基类 (1) 除非明确指出从其他类继承,否则就是在隐式的从Java的标准

小名同学 22万+

ComfyUI安装包运行前准备:安装Git

Git 是一个分布式版本控制系统(Version Control System, VCS),用于跟踪和管理文件(尤其是代码)的变更历史。 简单理解就是,git是用来管理文件的版本的,如果有新的版本,就可以使用git来更新。

聚梦小课堂 2万+

Java学习:第七章复用类

1,组合2,继承。

生物医学工程学生的博客 1637

强化学习新手上路:用PPO-Clip轻松玩转Pendulum-v1(PyTorch保姆级教程)

本文提供了一份基于PyTorch的PPO-Clip算法实战教程,指导强化学习新手在Pendulum-v1环境中构建连续控制智能体。教程详细解析了PPO-Clip的核心机制,特别是其Clip机制如何限制策略更新幅度以确保训练稳定,并涵盖了从环境配置、策略网络设计、经验收集到完整训练框架搭建的全过程,是掌握连续动作空间强化学习的实用指南。

weixin_29062963的博客 270

C#怼倍福TwinCAT3:ADS协议封装实战(附完整读写源码+避坑清单)

变量名大小写敏感:PLC里定义的是GVL.bStart,你写GVL.BStart绝对读不到;数组访问格式:PLC数组是,C#里读单个元素要写,读整个数组不用写索引;句柄要释放:用创建的句柄,一定要用using包起来,否则会占着资源;PLC必须运行:哪怕变量定义对了,PLC没Run(只是Login)也读不到数据;路由配置:如果上位机和PLC不在一个网段,要在TwinCAT3里添加路由(Router→Edit Routes)。倍福ADS通信其实不难,核心就是“配置对+变量名写对+数据类型匹配”。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 948

第七章:复用类

第七章:复用类 复用代码 ​ 复用代码在编程语言中是非常重要的部分,减少代码的臃肿和冗余。Java中常见的复用代码有两种,不破坏现有类的代码,因为已经经过调试①组合:在新类中产生现有类的对象,从而调用现有类的方法,达到复用效果(方法是public修饰或同包)。②继承:继承现有类型,直接添加新代码或者对父类方法进行覆盖 组合是讲现有类型作为新类型的底层实现加以复用,而继承复用的是接口 一、 组合语法...

jue6628的博客 301

基于R-CNN深度学习的生活垃圾检测与分类系统:数据集、模型和UI界面的完整实现

我们将使用一个公开的垃圾分类数据集来训练我们的模型。一个常见的数据集是TACO数据集(Trash Annotations in Context),该数据集包含多种垃圾类别,适用于垃圾分类任务。TACO数据集中的图像标注了垃圾的类别以及其在图像中的位置,适合用于目标检测任务。图片数据:每张图片中包含不同种类的垃圾。标签文件:每个图像有相应的标签文件,标注了图像中垃圾的类别、位置(通常为边界框坐标)等信息。dataset/images/image1.jpgimage2.jpg......其中,

YOLO 1101

Java 编程思想 - 第七章 复用类

Java编程思想学习笔记第七章 复用类1.组合2.继承 第七章 复用类 1.组合 概念:在新类中产生现有类对象。 PS:每一个类都有一个toString()方法,而且当编译器需要一个String时而代码中却只有一个对象,该方法就会被调用。例如: Student stu = new Student(); System.out.print("Student info:"+stu); 组合语法对象初始...

weixin_40455074的博客 522

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《Java编程思想》读书笔记:第七章 复用类

目录7.1组合语法7.2继承语法7.2.1初始化基类7.3代理7.4结合使用组合和继承7.4.1确保正确清理7.4.2名称屏蔽7.5在组合与继承之间选择7.6protected关键字7.7向上转型7.7.1为什么称为向上转型7.7.2再讨组合与继承7.8final关键字7.8.1final数据7.8.2final方法7.8.3final类7.8.4有关final的忠告7.9初始化及类的加载7.9.1继承与初始化 Java中所有事物一样,问题解决都是围绕着类展开的。可以通过创建新类来复用代码,而不必再

Mr_Kian的博客 930

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

第七章复用类

1、使用类而不破坏现有程序代码。①只需在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成,所以这种方法称为组合。②按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码。这种方式称为继承。 7.1组合语法 1、编译器并不是简单地为每一个引用都创建默认对象。如果想要初始化这些引用,可以在下列位置进行: ①在定义对象的地方。这意味着他们总是能够在构造器被调...

进阶的小程媛儿 247

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Thinking In Java 第七章 复用类

1、复用类:组合、继承、代理、结合使用组合和继承。 2、组合:将对象引用置于新类中,即旧类对象作为新类的成员。 3、继承:通过extends关键字实现,扩展类会获得基类中的所有域和方法(注:基类中的私有域或方法,扩展类中无法直接使用)。 4、super关键字:调用基类方法或构造器。 5、代理:Java并没有提供对它的直接支持,这是继承与组合之间的中庸之道。因为我们将一个成员对象置于所要构造...

weixin_39306760的博客 182

第七章 复用类(下)

第七章  复用类(下)           这里我就先直接将小节写在前边了,这样能帮助大家更快的获取到自己需要的信息。           小结:这一章讲的复用类主要有两种方式,一种是继承。另一种是组合。通常情况我们会看到这二者结合起来使用。在继承关系中,我们很容易将方法的重载和覆写区分开来,这里介绍了一个@Overread的关键字,当我们是覆写基类的方法时就加上这个关键字来区分,当然

yj_android_develop的博客 516
上一篇: 第六章 访问权限控制
下一篇: 第七章 复用类(下)
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值