如何解决有没有办法可以设置特定的子类以具有相对于父类中的变量的特定值?
我正在建造一个可以养狗和猫的“狗窝”。我对 java 比较陌生,所以我仍然试图弄清楚面向对象编程的基础知识,并且正在使用这个小项目作为一种课程。我将 Kennelpoly 作为常规类,将 Pet 作为父类,将 Dog 和 Cat 作为扩展 Pet 的两个独立类。目标是让控制台显示“我是一只狗/猫,我的名字是 .”。其次是动物发出的声音,“汪”或“喵”。我的问题是如何在构造函数中没有这些信息的情况下,让狗说汪汪,猫说喵喵?有没有办法让所有使用 Dog 类的东西都使用字符串“woof”,而猫使用字符串“meow”?只在构造函数中包含信息会更简单,但我已经知道如何做到这一点,并想以这种方式尝试。我尝试了我能想到的逻辑事物,例如 if 语句,但发现(至少我这样做的方式)您无法比较类。截至目前,我的程序打印“我为空,我的名字是”我仍在努力让它打印类型,我不太确定如何做到这一点,但一次一个问题。 下面是我的基础类,Kennelpoly;
public class Kennelpoly {
public Kennelpoly() {
}
public static void main(String args[]) {
System.out.println("Kennelpoly");
Pet[] pets = new Pet[10];
pets[0] = new Cat("Princess");
pets[1] = new Dog("Max");
pets[2] = new Cat("Pepper");
pets[3] = new Cat("Monday");
for (Pet pet : pets) {
if (pet != null) {
pet.print();
pet.makeSound();
}
}
}
}
这是我的宠物班
public class Pet {
private String type;
private String name;
private String sound;
public Pet() {
// Todo Auto-generated constructor stub
}
public void makeSound() {
// System.out.println
}
public void print() {
System.out.println("I am a " + type + " and my name is " + getName());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是狗类,内容不多。
public class Dog extends Pet {
public Dog(String name) {
this.setName(name);
}
}
这是最后一堂猫课
public class Cat extends Pet {
public Cat(String name) {
this.setName(name);
}
}
解决方法
让狗自己负责:
public class Dog extends Pet {
@Override public void makeSound() {
System.out.println("Woof!");
}
}
那么,在我们这样做的同时,让我们要求所有 Pet 的子类都必须明确承担责任:
public abstract class Pet {
public abstract void makeSound();
}
abstract
告诉 java 所有的宠物都可以发出声音,但是 Pet
(类)实际上并不知道怎么做;它的每个子类型都必须指定。 java 将强制执行此操作(不能在没有 makeSound
方法的情况下创建 Pet 的子类)。因此,new Pet()
现在是不可能的,但这是一件好事。
所以,既然你说你是初学者,那么遵循你的概念,也许有些答案对你来说似乎很陌生,这里直接跟进你自己的概念,我们仍然会达到同样的结果,同时它真的很酷也可以从其他预先回答中学习。
您的 KennelPoly 类:
public class KennelPoly {
public KennelPoly() {
}
public static void main(String args[]) {
System.out.println("KennelPoly");
Pet[] pets = new Pet[10];
pets[0] = new Cat("Princess");
pets[1] = new Dog("Max");
pets[2] = new Cat("Pepper");
pets[3] = new Cat("Monday");
for (Pet pet : pets) {
if (pet != null) {
pet.print();
pet.makeSound();
}
}
}
}
您的宠物课程:
public class Pet {
private String type;
private String name;
private String sound;
public Pet() {}
public void makeSound() {
System.out.println(getSound());
}
public void print() {
System.out.println("I am a " + getType() + " and my name is " + getName());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType(){
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSound() {
return sound;
}
public void setSound(String sound) {
this.sound = sound;
}
}
你的狗类:
public class Dog extends Pet {
public Dog(String name) {
this.setName(name);
this.setType("Dog");
this.setSound("woof");
}
}
最后是你的猫课:
public class Cat extends Pet {
public Cat(String name) {
this.setName(name);
this.setType("Cat");
this.setSound("meow");
}
}
显然,您只是缺少一些 getter 和 setter,也没有通过子类的构造函数解析一些信息,只需注意您在做什么。
虽然这是直截了当的,但这真的不是 OOP,它太紧密耦合了,我建议你做一些类似于 @rzwitserloot 所做的事情。 让每个子类对自己的行为负责。
因此,您可以使用以下内容:
你的宠物类:
public abstract class Pet
{
public abstract void print();
public abstract void makeSound();
}
您的狗和猫课程:
public class Dog extends Pet {
private String name;
public Dog(String name) {
this.name = name;
}
@Override
public void print() {
System.out.println("I am a Dog and my name is " + this.name);
}
@Override
public void makeSound() {
System.out.println("woof");
}
}
public class Cat extends Pet {
private String name;
public Cat(String name) {
this.name = name;
}
@Override
public void print() {
System.out.println("I am a Cat and my name is " + this.name);
}
@Override
public void makeSound() {
System.out.println("meoww");
}
}
希望这两个概念能让您清楚您现在在做什么。 注意:还有很多方法可以让这个工作......比如使用
界面概念。
再见。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。