《java编程思想》第七章 复用类

ESP32小车DIY:从零搭建无线遥控智能车(附完整代码与避坑指南) 本文详细介绍了如何从零开始DIY一台基于ESP32的无线遥控智能小车。内容涵盖核心硬件选型、电路设计、低延迟ESP-NOW无线通信协议的配置与实战,以及双电机差速控制算法与PWM调速的实现。文章提供了完整的代码示例和关键的避坑指南,旨在帮助开发者快速构建稳定可靠的智能车平台,并为进一步的功能扩展奠定基础。 阅读详情

组合:在新的类中产生现有类的对象。只是复用了现有程序代码的功能,而非形式。

继承:按照现有类的类型来创建新类,无需改变现有类的形式。采用现有类(基类)的形式,并在其中添加新代码。

都是利用现有类型生成新类型。

7.1组合语法

组合就是将对象引用置于新类中

//: reusing/SprinklerSystem.java
// Composition for code reuse.

class WaterSource {
  private String s;
  WaterSource() {
    System.out.println("WaterSource()");
    s = "Constructed";
  }
  public String toString() { return s; }
}	

public class SprinklerSystem {
  private String valve1, valve2, valve3, valve4;
  private WaterSource source = new WaterSource();
  private int i;
  private float f;
  public String toString() {
    return
      "valve1 = " + valve1 + " " +
      "valve2 = " + valve2 + " " +
      "valve3 = " + valve3 + " " +
      "valve4 = " + valve4 + "\n" +
      "i = " + i + " " + "f = " + f + " " +
      "source = " + source;
  }	
  public static void main(String[] args) {
    SprinklerSystem sprinklers = new SprinklerSystem();
    System.out.println(sprinklers);
  }
} /* Output:
WaterSource()
valve1 = null valve2 = null valve3 = null valve4 = null
i = 0 f = 0.0 source = Constructed
*///:~

对象引用被初始化为null,但试图为他们调用任何方法都会报错。

初始化引用的地方:

定义对象的地方,在构造器被调用之前被初始化。

在类的构造器中。

在正要使用这些对象之前,惰性初始化,不是每次都要生成对象的情况下。

使用实例初始化

//: reusing/Bath.java
// Constructor initialization with composition.
import static net.mindview.util.Print.*;

class Soap {
  private String s;
  Soap() {
    print("Soap()");
    s = "Constructed";
  }
  public String toString() { return s; }
}	

public class Bath {
  private String // Initializing at point of definition:
    s1 = "Happy",
    s2 = "Happy",
    s3, s4;
  private Soap castille;
  private int i;
  private float toy;
  public Bath() {
    print("Inside Bath()");
    s3 = "Joy";
    toy = 3.14f;
    castille = new Soap();
  }	
  // Instance initialization:实例
  { i = 47; }
  public String toString() {
    if(s4 == null) // Delayed initialization:使用前
      s4 = "Joy";
    return
      "s1 = " + s1 + "\n" +
      "s2 = " + s2 + "\n" +
      "s3 = " + s3 + "\n" +
      "s4 = " + s4 + "\n" +
      "i = " + i + "\n" +
      "toy = " + toy + "\n" +
      "castille = " + castille;
  }	
  public static void main(String[] args) {
    Bath b = new Bath();
    print(b);
  }
} /* Output:
Inside Bath()
Soap()
s1 = Happy
s2 = Happy
s3 = Joy
s4 = Joy
i = 47
toy = 3.14
castille = Constructed
*///:~

7.2继承语法

所有的类都是继承自标准根类Objects。继承会自动得到基类中所有的域和方法。

//: reusing/Detergent.java
// Inheritance syntax & properties.
import static net.mindview.util.Print.*;

class Cleanser {
  private String s = "Cleanser";
  public void append(String a) { s += a; }
  public void dilute() { append(" dilute()"); }
  public void apply() { append(" apply()"); }
  public void scrub() { append(" scrub()"); }
  public String toString() { return s; }
  public static void main(String[] args) {
    Cleanser x = new Cleanser();
    x.dilute(); x.apply(); x.scrub();
    print(x);
  }
}	

public class Detergent extends Cleanser {
  // Change a method:
  public void scrub() {
    append(" Detergent.scrub()");
    super.scrub(); // Call base-class version
  }
  // Add methods to the interface:
  public void foam() { append(" foam()"); }
  // Test the new class:
  public static void main(String[] args) {
    Detergent x = new Detergent();
    x.dilute();
    x.apply();
    x.scrub();
    x.foam();
    print(x);
    print("Testing base class:");
    Cleanser.main(args);
  }	
} /* Output:
Cleanser dilute() apply() Detergent.scrub() scrub() foam()
Testing base class:
Cleanser dilute() apply() scrub()
*///:~

为了继承,一般的规则是将所有的数据成员都指定为private,将所有的方法指定为public。

super关键字表示超类,super.方法名,调用超类方法。

继承可以不使用超类的方法,添加新的方法。

继承并不只是复制基类的接口,当创建一个导出类的对象时,该对象包含了一个基类的子对象,这个子对象与用基类之间创建的是一样的,基类的子对象被包装在导出类对象的内部。

基类子对象初始化,在构造器中调用基类构造器初始化。Java自动在道出类的构造器中插入对基类构造器的调用:

//: reusing/Cartoon.java
// Constructor calls during inheritance.
import static net.mindview.util.Print.*;

class Art {
  Art() { print("Art constructor"); }
}

class Drawing extends Art {
  Drawing() { print("Drawing constructor"); }
}

public class Cartoon extends Drawing {
  public Cartoon() { print("Cartoon constructor"); }
  public static void main(String[] args) {
    Cartoon x = new Cartoon();
  }
} /* Output:
Art constructor
Drawing constructor
Cartoon constructor
*///:~

基类在道出类构造器可以访问它之前,就已经完成了初始化。

带参数的构造器:

//: reusing/Chess.java
// Inheritance, constructors and arguments.
import static net.mindview.util.Print.*;

class Game {
  Game(int i) {
    print("Game constructor");
  }
}

class BoardGame extends Game {
  BoardGame(int i) {
    super(i);
    print("BoardGame constructor");
  }
}	

public class Chess extends BoardGame {
  Chess() {
    super(11);
    print("Chess constructor");
  }
  public static void main(String[] args) {
    Chess x = new Chess();
  }
} /* Output:
Game constructor
BoardGame constructor
Chess constructor
*///:~

调用基类构造器必须是导出类构造器中要做的第一件事。

7.3代理

//: reusing/SpaceShipControls.java

public class SpaceShipControls {
  void up(int velocity) {}
  void down(int velocity) {}
  void left(int velocity) {}
  void right(int velocity) {}
  void forward(int velocity) {}
  void back(int velocity) {}
  void turboBoost() {}
} ///:~



//: reusing/SpaceShip.java

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 protector = new SpaceShip("NSEA Protector");
    protector.forward(100);
  }
} ///:~



//: reusing/SpaceShipDelegation.java

public class SpaceShipDelegation {
  private String name;
  private SpaceShipControls controls =
    new SpaceShipControls();
  public SpaceShipDelegation(String name) {
    this.name = name;
  }
  // Delegated methods:
  public void back(int velocity) {
    controls.back(velocity);
  }
  public void down(int velocity) {
    controls.down(velocity);
  }
  public void forward(int velocity) {
    controls.forward(velocity);
  }
  public void left(int velocity) {
    controls.left(velocity);
  }
  public void right(int velocity) {
    controls.right(velocity);
  }
  public void turboBoost() {
    controls.turboBoost();
  }
  public void up(int velocity) {
    controls.up(velocity);
  }
  public static void main(String[] args) {
    SpaceShipDelegation protector =
      new SpaceShipDelegation("NSEA Protector");
    protector.forward(100);
  }
} ///:~

7.4结合使用组合和继承

//: reusing/PlaceSetting.java
// Combining composition & inheritance.
import static net.mindview.util.Print.*;

class Plate {
  Plate(int i) {
    print("Plate constructor");
  }
}

class DinnerPlate extends Plate {
  DinnerPlate(int i) {
    super(i);
    print("DinnerPlate constructor");
  }
}	

class Utensil {
  Utensil(int i) {
    print("Utensil constructor");
  }
}

class Spoon extends Utensil {
  Spoon(int i) {
    super(i);
    print("Spoon constructor");
  }
}

class Fork extends Utensil {
  Fork(int i) {
    super(i);
    print("Fork constructor");
  }
}	

class Knife extends Utensil {
  Knife(int i) {
    super(i);
    print("Knife constructor");
  }
}

// A cultural way of doing something:
class Custom {
  Custom(int i) {
    print("Custom constructor");
  }
}	

public class PlaceSetting extends Custom {
  private Spoon sp;
  private Fork frk;
  private Knife kn;
  private DinnerPlate pl;
  public PlaceSetting(int i) {
    super(i + 1);
    sp = new Spoon(i + 2);
    frk = new Fork(i + 3);
    kn = new Knife(i + 4);
    pl = new DinnerPlate(i + 5);
    print("PlaceSetting constructor");
  }
  public static void main(String[] args) {
    PlaceSetting x = new PlaceSetting(9);
  }
} /* Output:
Custom constructor
Utensil constructor
Spoon constructor
Utensil constructor
Fork constructor
Utensil constructor
Knife constructor
Plate constructor
DinnerPlate constructor
PlaceSetting constructor
*///:~

如果Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽在基类中的任何版本。

//: reusing/Hide.java
// Overloading a base-class method name in a derived
// class does not hide the base-class versions.
import static net.mindview.util.Print.*;

class Homer {
  char doh(char c) {
    print("doh(char)");
    return 'd';
  }
  float doh(float f) {
    print("doh(float)");
    return 1.0f;
  }
}

class Milhouse {}

class Bart extends Homer {
  void doh(Milhouse m) {
    print("doh(Milhouse)");
  }
}

public class Hide {
  public static void main(String[] args) {
    Bart b = new Bart();
    b.doh(1);
    b.doh('x');
    b.doh(1.0f);
    b.doh(new Milhouse());
  }
} /* Output:
doh(float)
doh(char)
doh(float)
doh(Milhouse)
*///:~

@Override注解,在覆写某个方法的时候使用,可以添加这个注解,在重新的时候而非覆写的时候会报错。防止错误重载。

7.5在组合与继承之间选择

组合是在新类中使用现有类的功能而不是接口。在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口。需要在新类中嵌入一个现有类的private。

7.6protected关键字

继承的类可用,而对于其他类来说是private。同时也是包访问权限。

//: reusing/Orc.java
// The protected keyword.
import static net.mindview.util.Print.*;

class Villain {
  private String name;
  protected void set(String nm) { name = nm; }
  public Villain(String name) { this.name = name; }
  public String toString() {
    return "I'm a Villain and my name is " + name;
  }
}	

public class Orc extends Villain {
  private int orcNumber;
  public Orc(String name, int orcNumber) {
    super(name);
    this.orcNumber = orcNumber;
  }
  public void change(String name, int orcNumber) {
    set(name); // Available because it's protected
    this.orcNumber = orcNumber;
  }
  public String toString() {
    return "Orc " + orcNumber + ": " + super.toString();
  }	
  public static void main(String[] args) {
    Orc orc = new Orc("Limburger", 12);
    print(orc);
    orc.change("Bob", 19);
    print(orc);
  }
} /* Output:
Orc 12: I'm a Villain and my name is Limburger
Orc 19: I'm a Villain and my name is Bob
*///:~

7.7向上转型

继承最重要的作用是用来表示新类和基类之间的关系。新类是现有类的一种类型。

向上转型:

//: reusing/Wind.java
// Inheritance & upcasting.

class Instrument {
  public void play() {}
  static void tune(Instrument i) {
    // ...
    i.play();
  }
}

// Wind objects are instruments
// because they have the same interface:
public class Wind extends Instrument {
  public static void main(String[] args) {
    Wind flute = new Wind();
    Instrument.tune(flute); // Upcasting
  }
} ///:~

到底使用组合还是继承?

是否需要从新类向基类进行向上转型。需要就用继承,不需要就需要慎重考录了。

7.8final关键字

final可以用在数据、方法、类之前。

数据使用final:

一个永不改变的编译时常量(即是static又是final)。

在运行时被初始化的值,不希望改变的存储空间。

使用final引用对象,引用恒定不变。

//: reusing/FinalData.java
// The effect of final on fields.
import java.util.*;
import static net.mindview.util.Print.*;

class Value {
  int i; // Package access
  public Value(int i) { this.i = i; }
}

public class FinalData {
  private static Random rand = new Random(47);
  private String id;
  public FinalData(String id) { this.id = id; }
  // Can be compile-time constants:
  private final int valueOne = 9;
  private static final int VALUE_TWO = 99;
  // Typical public constant:
  public static final int VALUE_THREE = 39;
  // Cannot be compile-time constants:
  private final int i4 = rand.nextInt(20);
  static final int INT_5 = rand.nextInt(20);
  private Value v1 = new Value(11);
  private final Value v2 = new Value(22);
  private static final Value VAL_3 = new Value(33);
  // Arrays:
  private final int[] a = { 1, 2, 3, 4, 5, 6 };
  public String toString() {
    return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5;
  }
  public static void main(String[] args) {
    FinalData fd1 = new FinalData("fd1");
    //! fd1.valueOne++; // Error: can't change value
    fd1.v2.i++; // Object isn't constant!
    fd1.v1 = new Value(9); // OK -- not final
    for(int i = 0; i < fd1.a.length; i++)
      fd1.a[i]++; // Object isn't constant!
    //! fd1.v2 = new Value(0); // Error: Can't
    //! fd1.VAL_3 = new Value(1); // change reference
    //! fd1.a = new int[3];
    print(fd1);
    print("Creating new FinalData");
    FinalData fd2 = new FinalData("fd2");
    print(fd1);
    print(fd2);
  }
} /* Output:
fd1: i4 = 15, INT_5 = 18
Creating new FinalData
fd1: i4 = 15, INT_5 = 18
fd2: i4 = 13, INT_5 = 18
*///:~

static强调只有一份,final强调是一个常量。

final参数主要用在匿名内部类传递数据。

final方法,将方法锁定,防止任何继承类修改它的含义。

类中所有的private方法都隐式的显示为final,因为无法访问,所以无法修改。

7.9初始化及类的加载

类的代码在初次使用时才加载,通常加载发生在创建类的第一个对象之时。但当访问static域或者static方法时,也会发生加载。

//: reusing/Beetle.java
// The full process of initialization.
import static net.mindview.util.Print.*;

class Insect {
  private int i = 9;
  protected int j;
  Insect() {
    print("i = " + i + ", j = " + j);
    j = 39;
  }
  private static int x1 =
    printInit("static Insect.x1 initialized");
  static int printInit(String s) {
    print(s);
    return 47;
  }
}

public class Beetle extends Insect {
  private int k = printInit("Beetle.k initialized");
  public Beetle() {
    print("k = " + k);
    print("j = " + j);
  }
  private static int x2 =
    printInit("static Beetle.x2 initialized");
  public static void main(String[] args) {
    print("Beetle constructor");
    Beetle b = new Beetle();
  }
} /* Output:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39
*///:~

7.10总结

如果将项目视作是有机的,进化着的生命体去培养,而不是打算像盖摩天大楼一样快速见效,就会获得更多的成功和更迅速的回馈。

从0开始图形学(光栅化) 从0开始图形学 阅读详情

相关推荐

病理WSI配准库valis教程

病理WSI配准库valis教程

azrealq的博客 2598

《Java编程思想》第四版读书笔记 第十三章 字符串

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33805743的博客 196

遗传病变异注释预测工具安装系列之------Exomiser 安装及bug处理

Exomiser是一个Java程序,它从全外显子组或全基因组测序数据中发现潜在的致病变异。 Java 版本必须为1.8以上。 Exomiser 最新版本下载 wget -c https://github.com/exomiser/Exomiser/releases/download/11.0.0/exomiser-cli-11.0.0-distribution.zip unzip ...

qq_37329349的博客 1535

Java编程思想——复用类

7 复用类复用代码是java众多引人注目的功能之一。关于达到这个目的的方法有两种:一是只需在新的类中产生现有类的对象。由于新的类是现有类的对象所组成,这种方法称之为组合;第二种方法是按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。这种方式称之为继承。组合和继承类似,都是利用现有类型生成新类型。7.1 组合语法假设你需要某个对象,它要具有多个string对象,几个

旧城故人往事的博客 529

人工智能-CS188 Project 2: Multi-agents

一、项目介绍 项目介绍网页 项目代码下载 本项目是采用Berkeley的CS188课程内容实习二的内容,在这个项目中,我们将为经典版本的Pacman 设计自动算法,包括幽灵。在此过程中,我们将实现 minimax 和 expectimax 搜索并尝试评估函数设计 完成作业只需要完成5个题目,按照项目介绍的步骤进行完成,主要是在multiAgents.py文件中进行补充代码 二、代码详情 1、Question1:Reflex Agent 略 2、Question2:Minimax 套用ppt上的minm

xiten的博客 8285

药物对接仿真软件:HADDOCK_(16).实践项目:抗体-抗原对接案例

定义分子结构文件。

kkchenjj的博客 579

行为型模式

行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。 一、策略模式 下面设计的场景是,我们需要画一个图形,可选的策略就是用红色笔来画,还是绿色笔来画,或者蓝色笔来画。 首先,先定义一个策略接口: public interface Strategy { public void draw(int radius, int x, int y); } 然后我...

斜月&三星 247

功能安全实战系列09-英飞凌TC3xx LBIST开发详解

英飞凌Tricore/LBIST开发详解

initiallizer的博客 1103

【on JAVA 8】编程思想之复用

初始化基类 现在涉及到两个类:基类和派生类。想象派生类生成的结果对象可能会让人感到困惑。从外部看,新类与基类具有相同的接口,可能还有一些额外的方法和字段。但是继承并不只是复制基类的接口。当你创建派生类的对象时,它包含基类的子对象。这个子对象与你自己创建基类的对象是一样的。只是从外部看,基类的子对象被包装在派生类的对象中。 必须正确初始化基类子对象,而且只有一种方法可以保证这一点 : 通过调用基...

爱科比的博客 244

数字后端:版图基础seal ring

seal ring结构是为了防止划片或封装对芯片造成破坏,从而在芯片与划片道(scribe line)之间添加的一圈保护环

m0_61544122的博客 1万+

YOLOv11改进 - 卷积Conv | PATConv(Partial Attention Convolution)部分注意力卷积,在减少计算量的同时融合卷积与注意力的优势 | AAAI 2026

本文提出部分注意力卷积(PATConv)机制,并将其集成到YOLOv11中。传统神经网络中,卷积计算密集,注意力机制全局计算冗余,此前的“部分卷积”会丢失未计算通道的特征价值。PATConv通过“通道拆分 - 并行处理 - 结果拼接”的逻辑,给不同通道分配“擅长的任务”,兼顾局部与全局特征。基于此,它还衍生出PAT_ch、PAT_sp和PAT_sf三种细分模块。此外,还提出了动态部分卷积(DPConv),并构建了新的混合网络家族PartialNet。我们将PATConv代码集成到YOLOv11中,实验表明,

魔改工程师的博客 1085

《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

CAPL编程规范与最佳实践

通过本文的学习,读者应该对CAPL编程规范与最佳实践有了初步的了解,并能够编写高质量的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1747

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

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

weixin_40455074的博客 522

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

《Java编程思想》第七章:复用类

第七章 复用类 组合语法 ​ 到目前为止,我们已经多次使用组合技术。只需将对象引用置于新类中即可。例如,假设你需要某个对象,它要具有多个 String对象、几个基本类型数据,以及另一个类的对象。对于非基本类型的对象,必须将其引用置于新的类中,但可以直接定义基本类型数据: /** * @author Tangwenbo * @version JDK 1.8 * @date 2021/8/10 17:14 */ class WaterSource{ private String s; W

pickLing_的博客 444

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《Java 编程思想》第七章 复用类

所谓复用,就是说原先已经有一些代码,当编写新的代码时,将老的代码能用的部分拿过来,表现为组合和继承两种方式。 组合:就是has-is的关系,从基类取需要的方法 继承:则是is-a的关系,将基类全部拿过来 继承中默认构造器的调用,以及super()的显示调用有参构造器 继承中涉及方法的覆盖,以及@Override的使用(防止你在不想重载的时候而意外进行重载) 继承中protected修饰符的作...

Masli的博客 297

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java编程思想(第七章复用类)学习笔记

第七章:复用类 一、组合与继承 组合:将对象引用置于新类 初始化引用的位置: 1、定义对象的地方 2、在新类的构造器中 3、惰性初始化(正要使用它之前) 4、实例初始化 清理的顺序(如果需要人为进行清理): 清理顺序与生成顺序相反,即优先清理那些后面创建的对象; 如果先清理前面的对象,后面的对象有依赖到前面的对象,这样就会产生问题。 继承:利用关键字extends 初始化顺序: 1、父...

weixin_43646427的博客 237

Java编程思想 第七章 复用类

文章目录

name_sakura的博客 314

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

复用代码是Java众多引人注目的功能之一,但要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。 7.1 组合 组合语法 就是在当前类中产生现有类的对象。 toString()方法 每一个非基本类型的对象都有该方法,当编译器需要一个String但你只有一个对象时,该方法会自动调用。 初始化引用 编译器并不是简单的为每一个引用都创建对象,因为这回增...

weixin_39872516的博客 181

java 编程思想复用类_《java编程思想》_第七章_复用类

复用代码是java众多引人注目的功能之一。但是想要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。一、继承语法继承是所有OOP语言和JAVA语言不可缺少的组成部分,当创建一个类时,总是在继承,因此,除非已明确指出要从其他类中继承,否则,就是隐式地从java的标准根类Object继承。继承并不只是复制基类的接口,当创建了一个导出类的对象时,该对象包含了一个基类...

weixin_39575007的博客 109

Java编程思想笔记7——第七章:复用类

7、复用类 ​ 复用代码是Java众多引人注目的功能之一。 组合和继承 ​ 不需要重新写,只需要在新类中调用其他的类即可,这样就能保证原有的程序不被破坏掉。这种方法称为组合。 ​ 第二种方法则通过新类继承以前的类,来达到扩展的目的。 7.1 组合语法 ​ 本书之前已经使用了多次组合技术。 class Door{ int height; String color; } class Window{ int height; int width; } class House{

qq_35556504的博客 314

《java编程思想——第七章(复用类)》

复用类 复用的方式包括组合和继承。 组合:在新的类中产生现有类的对象。 继承:采用现有类的形式,并添加新的代码。 7.1组合语法 将对象引用置于新类中即可。对象引用初始化的位置可以有: 1.在定义对象的地方。 2.在类构造器中。 3.在就要使用这些对象之前,这种当时被称为惰性初始化。 4.使用实例初始化。 7.2继承语法 当创建一个类时,总是在继承,如果没有明确...

ByteX的博客 353

Java编程思想简要笔记——第七章 复用类

组合 只需将对象引用置于新类中即可。显示的在新类中嵌入某对象,有助于理解部件的组成部分。 继承 extends Java会自动在导出类的构造器中插入对基类构造器的调用。使用某个现有类,并开发一个他的特殊版本。 构造器的调用顺序:基类->导出类 但默认调用只调用其无参的构造方法,想要调用其带参数的构造法需要用super关键字。 代理 将一个成员对象置于所要构造的类中,同时在新类中暴露该成员对象...

kiba_zwei的博客 218

8、ThinkInJava(java编程思想)第七章 复用类 笔记

复用类: 可以通过创建新类来复用代码,而不必再从头开始编写。可以使用别人也已经开发并调试好的类。 使用类而不破坏现有的程序代码,两种方法: 1、第一种方法非常直观:只需在新的类中产生现有类的对象,由于新的类是现有类的对象所组成,所以这种方法称为组合,该方法只是复用了现有程序代码的功能,而非他的形式。 2、第二种方法则更加细致一些,他按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式...

weixin_42504840的博客 206

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

目的:使用别人调试好的类而又不破坏自己的程序,本书讲述了两种方法:新建对象(组合)、继承 7.1 组合语法 7.2 继承语法 java中所有的类都是继承方式,除非显示指出,否则都是隐性继承Object类 **String可以用+=进行计算 **每个类都可以创建一个main()函数,这样可以测试每个单元类,测试完成后也无需删除,因为命令行调用的那个类被使用 7.3 代理 7.4 结合使

xiao1ni1zi的专栏 521

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

第七章 复用类关键词扩展学习继承final 关键词 继承、惰性初始化、代理、protect、向上转型、final、初始化、类的加载 扩展学习 初始化、类的加载 继承 继承类构造器运行顺序是由父类到子类的方向运行。 被继承的父类的方法应当是public或protect的,成员应当是private的。 继承时,重载机制也是正常工作的。 向上转型是继承最重要的方面。 继承技术其实是不太常用的,应该慎用这一技术,判断到底应该使用组合还是继承时,最清晰的办法就是问一问自己是否需要从新类向基类进行向上转型。 final

Mumu2609的博客 216
上一篇: LeetCode-626. 换座位( 626. Exchange Seats)。知识点:case when then else end
下一篇: 《java编程思想》第10章 内部类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值