我必须创建两个具有相似成员变量和方法的不同类,除了其中一个没有的两个方法。因此,我决定将不完整类的实例创建到另一个类中,以免有重复的代码。
所以它们看起来像这样:
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学习阶段)
如果这只是某种难题,这里有几种方法可以在没有继承、获取者或反射的情况下做到这一点。
嵌套类可以访问其封闭类的私有变量,以及同一作用域中的其他嵌套类。
class Outer { public static class Hero { private int speed; } public static class Beast { private int speed; } }
在该示例中,
Hero
和Beast
现在能够访问彼此的私有speed
变量。这意味着Hero
类可以只做this.speed == aBeast.speed
,或者你想比较什么。使用参数传递。
public class Beast { private int speed; public boolean isSpeedEqualTo(int speed) { return this.speed == speed; } }
然后例如
Hero
可以说aBeast.isSpeedEqualTo(this.speed)
.
但是,使用 getter 更有意义,似乎speed
变量也应该在Hero
和Beast
扩展的超类中声明。
我相信如果没有继承、获取者或反思,你就无法做到这一点。
声明私有变量时,只能在其自己的类中直接访问此变量。
在预言机文档下方:
本着封装的精神,通常将字段设为私有。这意味着它们只能从自行车类直接访问。但是,我们仍然需要访问这些值。这可以通过添加为我们获取字段值的公共方法来间接完成。
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访问它
类名.变量名