当前位置: 首页 > 知识库问答 >
问题:

为对象分配常量

宋琛
2023-03-14
public abstract class Animal {
private int weight;
private int height;

public Animal (int weight, int height) {
setWeight(weight);
setHeight(height);
}

public int getWeight() {
    return weight;
}
public void setWeight(int weight) {
     this.weight = weight;
}

public int getHeight() {
    return height;
}

public void setHeight(int height) {
    this.height = height;
}
}

这是一个子类

public class Dog extends Animal {

public static final int ANIMALNUMBER= 1;
public static final int MAXIMUMNUMBERALLOWED= 5;

//the constructor
public Dog (int weight, int height, int animalNumber, int maximumNumberAllowed) {
    super(weight, height)
    Dog.animalNumber = ANIMALNUMBER;
    Dog.maximumNumberAllowed = MAXIMUMNUMBERALLOWED;
}
}

这是另一个子类

public class Cat extends Animal {

public static final int ANIMALNUMBER= 2;
public static final int MAXIMUMNUMBERALLOWED= 10;

//the constructor
public Cat (int weight, int height, int animalNumber, int maximumNumberAllowed) {
    super(weight, height)
    Cat.animalNumber = ANIMALNUMBER;
    Cat.maximumNumberAllowed = MAXIMUMNUMBERALLOWED;
}
}

我最终想要的是这样的:

这不仅表示:不能分配最后一个字段dog.animalnumber,而且我认为它也行不通。有什么建议吗?

提前感谢!

共有1个答案

长孙星汉
2023-03-14

所以对于每只狗,动物数量应该是1,对于每只猫,动物数量应该是2。

你把事情搞得太复杂了。最简单的解决方案是删除构造函数参数并保持AnimalNumber不变。

但是

 public abstract class Animal {
  // common fields
   public Animal (int weight, int height) {
    // initialize
   }

   public abstract sting giveSound();
}

public class Dog extends Animal {
   @Override
   public  sting giveSound(){
     return "Wooff";
}


public class Cat extends Animal {
   @Override
   public  sting giveSound(){
     return "Meaw";
}

public class Rabbit extends Animal {
   @Override
   public  sting giveSound(){
     return "";
}

我得承认这是个拐角处的案子...

我可以根据他们的班级来计算吗?

是,通过使用映射:

 public abstract class Animal {
   public addToCount(Map<String,Integer> counters){
     // gets the class name of the child that has been called *new* on...
     String myClassName =  getClass().getName(); 
     Integer oldCount = conters.getOrDefault(myClassName, Integer.ZERO);
     conters.put(myClassName,oldCount.add(Integer.ONE));
   }
}
 类似资料:
  • 问题内容: 我是Java的新手,因此我对对象分配有一些疑问。例如, 假设变量的测试类中定义的,我说得对假设T1和T2点到修改同一个对象会影响和?其实我测试了一下,似乎我是对的。但是,当我尝试相同的操作时,修改仅发生在不影响另一侧的一侧。这是什么原因呢? 编辑:我尝试使用String的情况。 我通过测试String的大小写来意识到我的错误,因为它是不可变的。我认为修改字符串的情况实际上是将对“ 1”

  • 假设我有一个变量,我想设置一些默认值。 这两种选择的好处/缺点是什么? 使用对象传播 或者用Object.assign 这就是让我好奇的promise。

  • 根据这个答案,https://stackoverflow.com/a/12020435/562222,将一个对象分配给另一个对象只是复制引用,但让我们看看以下代码段: 运行它可以提供:

  • 问题内容: 我多次听说,在实例化对象时应该执行以下操作: “接口”名称=新的“类”(); 例如,针对实现的类链表: 实现许多接口,包括队列,双端队列等。上面的代码和 要么 为什么必须同时指定两次类型?似乎多余,但oracledocs似乎没有提及。 问题答案: 在Java 7中是多余的。可以将其重写为。 你想写类似的原因: 如果您改变主意,则可以为您提供以后更改数据收集的自由。这样,您的代码将更加灵

  • 主要内容:1.对象如何定位的,2.对象怎么分配1.对象如何定位的 1.句柄方式 2.直接指针方式 一个直接寻址:访问速度快 一个是间接寻址:垃圾回收起来比较稳定 第二个比如如果是G1垃圾回收器的话,垃圾回收会进行垃圾的复制。会将垃圾移到另一个位置。如果用直接指针的方式的话就会发现T来回发生变化,效率低,所以句柄方式,GC回收比较稳定 句柄方式: 第一个指针是真正new出来的对象 第二个指针是类型数据指针 2.对象怎么分配 对象首先会尝试在栈上

  • 问题内容: 我正在尝试在用户点击操作时将其分配给操作。 我知道如何为a创建动作,但是如何模仿a的相同行为却使用a ? 问题答案: 您需要一个。要进行设置,请使用以下命令: (您也可以使用,并为其分配图片,不添加文字,而只需连接即可)