【问题标题】:Scope of static inner class in javajava中静态内部类的作用域
【发布时间】:2016-07-28 09:32:45
【问题描述】:

我今天发现了一件很奇怪的事情。我有以下带有静态内部类的类。

public class PDto {

private Agreement agreement = new Agreement();

    public static class Agreement{
        public String agreementName;
        public String agreementDescription;
        public String currency;
    }

    public Agreement getAgreement() {
        return agreement;
    }

    public void setAgreement(Agreement agreement) {
        this.agreement = agreement;
    }
}

另一个类 ClassA 具有以下方法:-

private Agreement createBillingAgreement(PDto payment) {

    PDto.Agreement billingAgreement = payment.getAgreement();
    Agreement agreement = new Agreement();
    agreement.setName(billingAgreement.agreementName);
    agreement.setDescription(billingAgreement.agreementDescription);
    billingAgreement.agreementName = "Changed agreeement Name" ;
}

调用A类方法的B类代码

classBService.createBillingAgreement(payment);
System.out.println("Changed billing agreement name : " + payment.getAgreement().agreementName);

当我从 ClassB 类中打印协议名称时,我得到了在 A 类的 createBillingAgreement 方法中设置的值。这怎么可能。

【问题讨论】:

  • 请贴出所有相关代码。您发布的代码甚至没有通过编译。
  • 您的问题对我来说并不完全清楚,但payment.getAgreement() 会在PDto 中返回agreement 实例(并且billingAgreement.agreementName = "Changed agreeement Name" 设置该实例的名称),而Agreement agreement = new Agreement(); 创建一个独立实例- 但是由于缺少createBillingAgreement(...) 的返回语句(可能还有其他部分),因此它的作用并不完全清楚。
  • 只是一个旁注,以防止任何潜在的误解:静态内部类与其外部类没有任何特殊关系。外部类仅充当命名空间的一种形式,仅此而已。
  • 你将payment 传递给createBillingAgreement,更新方法中的名称并打印出来。您希望打印出什么名称,为什么?因为根据您的描述,一切正常。
  • @viper 在 java 中当您将对象传递给方法时,您不是在使用对象的副本,而是使用对象本身。因此,如果您更新字段,该字段将在方法之外更新。除非您传递对象的不可变副本,否则情况就不同了。

标签: java static-methods inner-classes


【解决方案1】:

静态内部类用于静态访问同一类。例如:

public class Parent{
    public static class Child{
        public void aMethod(String s){
            System.out.println("Hi!" + s);
        }
    }
}

public class AnotherClass{
    public void AnotherMethod(){
        Parent.Child.aMethod("From AnotherClass");
    }
}

输出:

嗨!来自另一个类

或者在你的情况下:

PTdo.Agreement

        ^

这是静态类

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2018-06-12
    • 2010-09-09
    相关资源
    最近更新 更多