假设您的用户类有两个方法,例如methoda
和methodb
。我们创建了此类a
和b
的两个实例。现在,我想更新我的代码,methoda
应仅对实例a
可见,而methodb
应对实例b
可见。我没有得到如何在Java中实现这一点。
答案 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)
如果a
和b
都是同一个类的实例,则无法执行此操作。两个实例都有相同的方法(也就是OOP中的行为)。
答案 3 :(得分:0)
你需要使用多态性, hage 回答你的问题。
了解读取多态性期间会发生什么。
x.fun(param)
,隐式参数x被声明为类C的对象。请注意,可能有多个方法,都具有相同的名称,有趣,但有不同 参数类型。例如,可能存在方法f(int)和方法f(String)。 编译器枚举C类中称为fun的所有方法以及C超类中称为fun的所有公共/受保护方法。
现在,编译器知道要调用的方法的所有可能候选者。
接下来,编译器确定提供的参数类型 方法调用。如果在所有称为fun的方法中有一种独特的方法,那就是 参数类型是所提供参数的最佳匹配,那么该方法是 选择被召唤。此过程称为重载分辨率。
如果方法是private,static,final或构造函数,那么编译器确切地知道要调用哪个方法。编译器然后使用静态绑定。 否则,如果要调用的方法取决于隐式参数的实际类型,则编译器使用动态绑定。
当程序运行并使用动态绑定来调用方法时,然后是虚拟的 机器必须调用适合实际类型的方法版本 x引用的对象。
假设实际类型是D,C的子类。如果类D定义方法fun(String),则调用该方法。 如果没有,则搜索D的超类方法fun(String),依此类推。 每次调用方法时执行此搜索都会很耗时。 因此,虚拟机为每个类预先计算列出所有类的方法表 方法签名和要调用的实际方法。实际上是一种方法 在调用时,虚拟机只进行表查找。