重新精读《Java 编程思想》系列之组合与继承

举报
经典鸡翅 发表于 2022/02/18 00:30:47 2022/02/18
【摘要】 Java 复用代码的两种方式组合与继承。 组合 组合只需将对象引用置于新类中即可。 比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合。 public class B { public void say(){ }}public class A { public voi...

Java 复用代码的两种方式组合与继承。

组合

组合只需将对象引用置于新类中即可。
比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合。


   
  1. public class B {
  2. public void say(){
  3. }
  4. }
  5. public class A {
  6. public void combo(){
  7. B b = new B();
  8. b.say();
  9. }
  10. }

在 java编程思想中,还介绍了四种初始化引用的方式。
1、在定义对象的地方。


   
  1. public class Bath{
  2. private String s1 = "happy";
  3. public Bath(){};
  4. }

2、在构造器中


   
  1. public class Bath{
  2. private String s1;
  3. public Bath(){
  4. s1="happy";
  5. };
  6. }

3、在使用对象的时候,进行初始化,也叫惰性初始化。这种方式可以减少额外的负担。


   
  1. class Lazy{
  2. }
  3. public class Bath{
  4. private Lazy lazy;
  5. public Bath(){
  6. };
  7. public void initLazy(){
  8. lazy = new Lazy();
  9. }
  10. }

这样当只有调用Bath的initLazy方法的时候,Lazy对象才会被初始化,不调用的时候,不会被初始化。
4、使用实例初始化。
这种最简单了,我们经常使用的实例初始化就是这样的。


   
  1. public class Bath{
  2. public static void main(String args){
  3. Bath bath = new Bath();
  4. }
  5. }

继承

当我们创建一个类的时候,无时无刻不在继承,如果我们没有明确的指出继承哪个类,隐式的继承 Object 类。
继承使用的extends关键字,子类会继承父类的所有成员变量和方法。
继承的一个大原则就是,我们将所有的数据成员置为private,将方法设置为public。这样可以便于其他类访问被继承类的所有方法。
Java 使用 super关键字来调用父类的构造方法。
在子类继承父类的时候,会自动调用父类的构造函数,如果都是无参的构造函数,则不需要显示调用,如果是有参的构造函数,子类继承的时候就需要显示的用super调用。


   
  1. class Art {
  2. Art(){
  3. System.out.println("art");
  4. };
  5. }
  6. class Drawing extends Art{
  7. Drawing(){
  8. System.out.println("Drawing");
  9. }
  10. }
  11. public class Cartoon extends Drawing{
  12. Cartoon(){
  13. System.out.println("cartoon");
  14. }
  15. public static void main(String[] args) {
  16. Cartoon cartoon = new Cartoon();
  17. }
  18. }

结果如下:


如果我们的构造函数是有参的。子类继承,不调用则会提示。

我们必须使用super显示的调用

   
  1. class Art {
  2. Art(String s){
  3. System.out.println("art");
  4. };
  5. }
  6. class Drawing extends Art{
  7. Drawing(){
  8. super("a");
  9. System.out.println("Drawing");
  10. }
  11. }

书中这里有一道练习题,证明基类构造器,a、总是会被调用,b、在导出类构造器之前被调用。
上面的例子,同时证明了两点。子类构造器的代码总是最后执行的。然后父类构造器中的打印代码会打在控制台上。

代理

在书中还介绍了一个概念代理,说是代理也是复用的一种形式。那么这个怎么理解呢。
书中的例子举的是十分好的。
比如我们有一个太空船的控制模块。这里简略我们只写一个想上飞和向下飞的代码。


   
  1. public class SpaceShipControls{
  2. void up(int a){};
  3. void down(int a){};
  4. }

我们再建立一个太空飞船,飞船肯定是可以向上飞和向下飞的。所以我们第一种方案采用继承的方式。直接调用控制器的代码。


   
  1. public class SpaceShip extends SpaceShipControls{
  2. public static void main(String[] args){
  3. SpaceShipControls s = new SpaceShipControls();
  4. s.up(100);
  5. }
  6. }

目前来看控制器的所有方法,我们太空飞船都有了。从某种意义上说 太空飞船成为了太空控制器。事实不应该这样的,应该是太空飞船向太空控制器发送指令。
我们使用代理的方式,来创建这段代码,再来看下。


   
  1. public class SpaceShipDelegation{
  2. private SpaceShipControls s = new SpaceShipControls();
  3. public void up(int a){
  4. s.up(a);
  5. }
  6. public void down(int a){
  7. s.down(a);
  8. }
  9. public static void main(String args){
  10. SpaceShipDelegation sa = new SpaceShipDelegation();
  11. sa.up(100);
  12. }
  13. }

通过这种代理的方式,我们可以拥有更多的控制能力,可以选择提供再成员对象方法中的某个子集。

文章来源: blog.csdn.net,作者:经典鸡翅,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/hanqing456/article/details/111878932

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。