【问题标题】:Java Access Modifiers: Accessing default class from another packagesJava 访问修饰符:从另一个包访问默认类
【发布时间】:2016-06-15 05:19:07
【问题描述】:

如何使用该包中的公共类访问某个/另一个包中的默认类。

例如,

我的Bank package 有两个班级

  1. public class Bank { ... }

  2. class Account { ... }(默认访问修饰符)

我需要使用Bank 在另一个名为Atmpackage 中访问Account

有什么建议吗?

【问题讨论】:

标签: java class access-modifiers


【解决方案1】:

按照java的Accessing class/method/instances规则,

默认的东西(类/方法/实例)不能被其他东西看到 包。

因此,在您的情况下,无法通过另一个访问它 包,因为那里看不到默认类。

只有在定义/声明的地方才能在同一个包中看到默认的东西

【讨论】:

  • 所以你的意思是我不能访问它,即使我会在公共类中创建它的实例?
  • 当然。调用类对 Account 类型一无所知
  • 默认类在包外的任何地方都不可见,那么如何将它的实例创建到公共类(另一个包)中?
  • 1.在同一个包的公共类中创建默认类 2. 在另一个调用公共类的包中访问它
  • @Atalyk 你说的是内部类(类中的类)吗?
【解决方案2】:

你不能直接从另一个包访问这个类,但是你可以使用proxy pattern并通过调用Bank方法来调用Account方法

【讨论】:

  • 你理解我。这就是我想做的事
  • 在与默认类相同的包中创建一个公共类,然后使用代理模式或委托模式访问默认类。 Eclipse 支持自动生成委托模式。从其他包中,您可以通过公共类访问默认类
【解决方案3】:

根据定义,java 中类的默认访问修饰符只能从其包中访问(请参阅here)。

如果您有权访问源代码,则应考虑将访问级别更改为公开。否则,您可以尝试通过同一包中的公共类访问该类。

package test.bankaccount;
public class Bank {
    public Account getAccount(int id) {
        //here goes the code to retrieve the desired account
    }
}

package test.bankaccount;
class Account {
    // class implementation
}

无论如何,您应该记住,访问限制总是描述应用程序的工作方式。您应该问自己为什么特定课程不公开。

如果这些类是您自己的代码,那么问问自己您设置的访问限制是否正确地代表了您希望应用程序工作的方式。

【讨论】:

  • 像这样。基本上我想在 Atm 类 Account account = (Account)bank.getAccounts().get(customerID); 中调用 Account 方法但帐户不可见。
  • @Atalyk:银行和账户不是在同一个包里吗?
猜你喜欢
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2013-12-01
  • 2011-04-10
  • 2012-11-12
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多