当前位置: 首页 > 面试题库 >

java中继承与委派有什么区别

江子石
2023-03-14
问题内容

java中的继承和委托有什么区别?

如何在我的项目中使用以下示例?请你指导我。我了解继承,但对委托没有太多了解。因此,请给出适当的理由。我为什么要用这个?

 package com.m;

 class RealPrinter { // the "delegate"
     void print() { 
      System.out.println("something"); 
    }
 }

 class Printer { // the "delegator"
     RealPrinter p = new RealPrinter(); // create the delegate 
     void print() { 
     p.print(); // delegation
     } 
 }

 public class Tester {

// to the outside world it looks like Printer actually prints.
     public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
     }

   }

问题答案:

当您委托时,您只是在调用一个知道必须做什么的类。您并不真正在乎它是 如何 执行的,您所 关心的 只是您正在调用的类知道需要做什么。

如果我是您,我将创建一个接口并命名该接口IPrinter(或类似名称的接口),该接口具有一个名为的方法print。然后,我将RealPrinter实现此接口。最后,我将这一行:更改RealPrinter p = new RealPrinter();为:IPrinter p = new RealPrinter()

既然RealPrinter实现了IPrinter,那么我肯定知道它有一个print方法。然后,我可以通过将其委托给适当的类来使用此方法来更改应用程序的打印行为。

这通常可以提供更大的灵活性,因为您无需将行为嵌入到特定的类中,而是将其留给另一个类。

在这种情况下,要更改应用程序在打印方面的行为,您只需要创建另一个实现的类,IPrinter然后将以下行更改IPrinter p = new RealPrinter();为即可IPrinter p = new MyOtherPrinter();

public interface IPrinter {
    void print();
}

public class RealPrinter implements IPrinter {

    @Override
    public void print() {
        System.out.println("This is RealPrinter");
    }
}

public class RealPrinter2 implements IPrinter {

    @Override
    public void print() {
        System.out.println("This is RealPrinter2");
    }
}

public class Main {

    public static void main(String...arg){
        IPrinter printer  = new RealPrinter();
        printer.print();

        printer = new RealPrinter2();
        printer.print();
    }
}


 类似资料:
  • 问题内容: 在CSS中,级联和继承有什么区别? 还是都是同一件事? 问题答案: 继承 是关于属性如何从元素滴流到其子元素。某些属性,例如继承。如果您在上设置了字体系列,则该字体系列将被中的所有元素继承。同样适用于,但适用于或始终默认为和的情况则不适用。在大多数情况下,这很有意义。为什么背景会继承?那会很痛苦。如果字体不继承怎么办?那会是什么样子? 该 级联 是什么时候有冲突什么优先。级联的规则包括

  • 问题内容: Java中的 动态调度 是什么意思,为什么在继承的上下文中需要它? 问题答案: Java […]中的 动态调度 是什么意思? 将“调度”视为“确定要调用的方法”。 “动态”部分只是说它是在运行时确定的。即,在运行时确定要调用的方法。 为什么在继承的背景下需要它 没有继承/多态性,我们将不需要此。表达式的类型在编译时是可确定的,并且在编译程序时将知道在运行时将调用哪种方法。 对于继承/多

  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方

  • 如果一个类收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器执行,如果父加载器还存在其父加载器,则进一步向上委托,依次递归,请求将最终到达顶层的启动类加载器,如果父类加载器可以完成父加载任务,就成功返回,如果父加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派模型。 双亲委派模式的优势: 避免重复加载; 考虑到安全因素,java核心api中定义类型不会被随意替

  • 问题内容: 有太多相关的名称:早期和晚期绑定,静态和动态调度,运行时与编译时多态等,我不知道它们之间的区别。 我找到了清楚的解释,但这是正确的吗?我将解释 JustinC : 绑定: 正在确定变量的类型(对象?)。如果它是在编译时完成的,则它的早期绑定。如果在运行时完成,则绑定晚。 调度: 确定哪个方法与方法调用匹配。静态调度是在编译时计算的方法,而动态调度是在运行时执行的。 绑定是否分别将原始变

  • 绑定是否分别与原始值和对象匹配原始变量和引用变量? 编辑:请给我一些明确的参考资料,这样我就可以阅读更多关于这一点。