如何在不使用继承/getter/反射的情况下比较不同类的私有成员变量?



我必须创建两个具有相似成员变量和方法的不同类,除了其中一个没有的两个方法。因此,我决定将不完整类的实例创建到另一个类中,以免有重复的代码。

所以它们看起来像这样:

public class Beast{
private int speed;
//other variables & methods
...    
}

&

public class Hero{
private int speed;
//other variables
...
Beast beast = new Beast();
...
}

如何在不使用两个类、getter 或反射之间的任何类型的继承的情况下,将Beast实例的speed变量与Hero实例的变量进行比较?(也许接口会对我有所帮助,我不知道,因为我仍处于早期的Java学习阶段)

如果这只是某种难题,这里有几种方法可以在没有继承、获取者或反射的情况下做到这一点。

嵌套类
  1. 可以访问其封闭类的私有变量,以及同一作用域中的其他嵌套类。

    class Outer {
    public static class Hero { private int speed; }
    public static class Beast { private int speed; }
    }
    

    在该示例中,HeroBeast现在能够访问彼此的私有speed变量。这意味着Hero类可以只做this.speed == aBeast.speed,或者你想比较什么。

  2. 使用参数传递。

    public class Beast {
    private int speed;
    public boolean isSpeedEqualTo(int speed) {
    return this.speed == speed;
    }
    }
    

    然后例如Hero可以说aBeast.isSpeedEqualTo(this.speed).

但是,使用 getter 更有意义,似乎speed变量也应该在HeroBeast扩展的超类中声明。

我相信如果没有继承、获取者或反思,你就无法做到这一点。

声明私有变量时,只能在其自己的类中直接访问此变量。

在预言机文档下方:

本着封装的精神,通常将字段设为私有。这意味着它们只能从自行车类直接访问。但是,我们仍然需要访问这些值。这可以通过添加为我们获取字段值的公共方法来间接完成。

Oracle 文档:Java Access Modifiers

如果不在组合类中提供 getter,则无法比较这些不同类实例的private字段。

如果没有反思,您大致有两种选择:

  • 使现场public,这通常是一种不好的做法
  • Hero中引入一种比较方法,以比较速度并在其他类中提供 getter。您无需在Hero中提供 getter,因为私有字段可以在类的实例方法中访问。

对于第二种方式,它可能看起来像:

public class Beast{    
private int speed;
public Beast(int speed){
...
}
public int getSpeed(){
return speed;
}
}
public class Hero {    
private int speed;
private Beast beast;
public Hero (int speed, Beast beast){
...
}
// just an example to use speed from the both instances
public boolean isMoreFast(){
return speed > beast.getSpeed();
}
}

您现在可以执行以下操作:

Beast beast = new Beast(beastSpeed);
Hero hero = new Hero(heroSpeed, beast);
boolean isHeroFaster = hero.isMoreFast();

在 int 之前使用 static 关键字。

静态内速 .

借助静态关键字,您无需创建类的对象,您可以使用like访问它

类名.变量名

最新更新