2012-02-02 41 views
1

假设您的用户类有两种方法,如methodamethodb。我们创建了这个类的两个实例ab。现在我想更新我的代码,methoda应该是可见的,只有实例amethodb应该对实例b可见。我没有得到我们如何在Java中实现这一点。对于同一类别的不同实例的Java方法限制

+0

怎么样实例C和D等?我的意思是方法应该是可见的或不是? – 2012-02-02 07:41:37

回答

1

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

0

如果ab都是同一类的实例,则不能这样做。这两个实例都有相同的方法(即OOP中的行为)。

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()

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

+0

这确实是要走的路。使用接口来限制引用的行为可能是安全设计最重要的设计模式。 – 2012-02-02 07:46:17

0

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

了解在多态性读取过程中会发生什么。

  1. 编译器查看对象的声明类型和方法名称。比方说, 我们称之为x.fun(param),并且隐含参数x被声明为C类的一个对象

注意,可能有多种方法,都具有相同的名称,好玩的,但具有不同的 参数类型。例如,可能有一个方法f(int)和一个方法f(String)。 编译器列举了类C中所有称为fun的方法以及所有在C的超类中称为fun的公共/受保护方法fun。现在,编译器知道调用方法的所有可能候选者。

  1. 接着,编译器确定的类型被在 方法调用提供的参数。如果在所有被称为乐趣的方法中有一种独特的方法,其参数类型是所提供的参数的最佳匹配,则该方法是 被选择调用。这个过程被称为超载分辨率

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

  3. 当程序运行,并使用动态绑定来调用一个方法,则虚拟机 必须调用适合于实际类型的 目的是其中x是指该方法的版本。

假设实际类型是D,C的一个子类。如果类D定义了一个方法fun(String),那么调用该方法。 如果不是,则搜索D的超类,以搜索方法fun(String),等等。每次调用某个方法时执行此搜索将非常耗时。 因此,虚拟机会为每个类预先计算一个方法表,其中列出了所有方法签名和要调用的实际方法。当一个方法实际上调用 时,虚拟机只是简单地进行表查找

相关问题