对同一类的不同实例的Java方法限制

时间:2012-02-02 07:37:52

标签: java

假设您的用户类有两个方法,例如methodamethodb。我们创建了此类ab的两个实例。现在,我想更新我的代码,methoda应仅对实例a可见,而methodb应对实例b可见。我没有得到如何在Java中实现这一点。

4 个答案:

答案 0 :(得分:1)

不,方法可见性始终基于类型,而不是单个实例。听起来好像你应该有两个子类,一个有methodA,一个有methodB;然后,您可以创建相应子类的实例。

答案 1 :(得分:1)

你可以这样做:

public interface InterfaceA { void methodA(); }

public interface InterfaceB { void methodB(); }

public class User implements InterfaceA, InterfaceB {

public void methodA() { System.out.println("method A"); }

public void methodB() { System.out.println("method B"); }

}

//其他地方

InterfaceA a = new User();
InterfaceB b = new User();

现在,a“只看到methodA()b只看到”methodB()

我认为没有其他办法可以做到这一点。

答案 2 :(得分:0)

如果ab都是同一个类的实例,则无法执行此操作。两个实例都有相同的方法(也就是OOP中的行为)。

答案 3 :(得分:0)

你需要使用多态性, hage 回答你的问题。

了解读取多态性期间会发生什么。

  1. 编译器查看对象的声明类型和方法名称。让我们说吧 我们调用x.fun(param),隐式参数x被声明为类C的对象。
  2. 请注意,可能有多个方法,都具有相同的名称,有趣,但有不同 参数类型。例如,可能存在方法f(int)和方法f(String)。 编译器枚举C类中称为fun的所有方法以及C超类中称为fun的所有公共/受保护方法。

    现在,编译器知道要调用的方法的所有可能候选者。

    1. 接下来,编译器确定提供的参数类型 方法调用。如果在所有称为fun的方法中有一种独特的方法,那就是 参数类型是所提供参数的最佳匹配,那么该方法是 选择被召唤。此过程称为重载分辨率

    2. 如果方法是private,static,final或构造函数,那么编译器确切地知道要调用哪个方法。编译器然后使用静态绑定。 否则,如果要调用的方法取决于隐式参数的实际类型,则编译器使用动态绑定。

    3. 当程序运行并使用动态绑定来调用方法时,然后是虚拟的 机器必须调用适合实际类型的方法版本 x引用的对象

    4. 假设实际类型是D,C的子类。如果类D定义方法fun(String),则调用该方法。 如果没有,则搜索D的超类方法fun(String),依此类推。 每次调用方法时执行此搜索都会很耗时。 因此,虚拟机为每个类预先计算列出所有类的方法表 方法签名和要调用的实际方法。实际上是一种方法 在调用时,虚拟机只进行表查找