【问题标题】:In what situations can methods of one class be invoked on objects of another?在什么情况下可以在另一个类的对象上调用一个类的方法?
【发布时间】:2023-04-01 00:36:01
【问题描述】:

我是 Java 新手,所以我仍在学习使用严格的面向对象语言工作的规则。今天我想知道使用一种方法来处理该方法类之外的对象。在任何情况下都可以使用另一个类的方法成功地对一个对象执行操作吗?

假设我有一个 anchorPane 对象 (javafx)。尝试在其上调用 Text 类的 setText() 方法是不明智的,因为 anchorPanes 不直接显示文本。

但是,在某些情况下,这样的事情是可能的吗?方法总是只能影响其类的对象吗?

【问题讨论】:

  • 影响其类的对象——不。考虑public void m1(Integer[] nums)m1 方法可以通过修改其元素来影响 nums

标签: java oop


【解决方案1】:

是否总是规定方法只能影响其类的对象?

不是直接的,但是如果你把一个方法标记为protected,这个方法只能被同一个类的对象和派生类的对象调用(甚至在其他实例上)。另见https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

此外,您可以将其设为final,这样就不可能推翻该方法(如果您将类设为final,则没有人可以从您的类派生)。在这种情况下,你得到的正是你所描述的:

//final here disallows to subclass "Sample". This assures that there exists NO subclass that invokes bar().
public final class Sample {


    public void foo() {

        //on same instance
        this.bar();

        //on another instance, but just same class (or subclass of Sample, but not possible because class is final)
        Sample b = new Sample();
        b.bar();
    }

    /*final here prevents that METHOD is overwritten. But class can be overwritten.
     * subclasses are also allowed to invoke bar().
     */
    protected final void bar() {
        //do something here
    }
}

【讨论】:

    【解决方案2】:

    在什么情况下一个类的方法可以在另一个类的对象上调用?

    每个类(和接口)都定义了可以在其上调用的方法。

    Java 是一种类型安全的语言,它不允许您调用为特定类编写的方法,而不是该类的实例(例如,您可以在 Javascript 中执行的操作,通过使用bind(iWantThisThis))。

    不可能在完全不相关的类的实例上调用这些方法。它们需要属于该类或子类。

    所以,不,您不能在不相关的 AnchorPane 的实例上调用 Text::getText

    您可以从共享父接口或超类调用常用方法。例如anchorPane.toString()text.toString() 都可以工作(因为Java 中的每个对象都有这些方法)。如果AnchorPaneText 都恰好实现了一个假设的UIComponent 接口,那么它们可能都有getSize() 方法。


    我认为您正在寻找的是所谓的委托或对象组合。如果您有一个显示TextAnchorPane,您可以给它一个也称为setText 的方法,委托方法调用包含在@987654334 中的Text 实例@。

    class AnchorPane {
        private final Text myText;
        void setText(String newText){
          myText.setText(myText);
        }
    }
    

    所以现在您在AnchorPane 上也有一个setText 方法(但您必须手动添加它以指定它的确切作用,并且它没有为您提供任何其他方法)。

    【讨论】:

    • 但没有修饰符,如您的示例),它是包私有的。如果你有它包私有或公共,则没有保护从任何其他类的任何其他对象调用该方法(必须在同一个包中,具有包私有,即没有修饰符)。只有使用“受保护”,您才能限制访问,以便只有子类和同一对象的其他实例可以访问它
    • 这个问题有点不清楚。我假设它在问“我可以调用 Text from 另一个类(如 AnchorPane)的方法吗”。或者也许“我可以从 Text on 另一个类(如 AnchorPane)调用方法吗”。
    • 可能你是对的......我专注于“尝试在其上调用 Text 类的 setText() 方法是不明智的,因为 anchorPanes 不直接显示文本。” - 这告诉我他想禁止从其他类的实例调用 setText..
    • 并且所述答案不正确。您必须有一个 class 的实例,它是一个对象或一个子类。
    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 2023-03-24
    • 2018-12-19
    • 2012-06-29
    • 2011-10-21
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多