Java 运行类的重写方法?

Java 运行类的重写方法?,java,interface,Java,Interface,这是我试图做的一个例子,这很难解释,所以这是使用pets的简化版本: public interface Pet { public String talk(); } public class Dog implements Pet{ public String talk() { return "Woof!"; } } import java.util.ArrayList; public class Person {

这是我试图做的一个例子,这很难解释,所以这是使用pets的简化版本:

public interface Pet {

    public String talk();
}

public class Dog implements Pet{

       public String talk()
       {
           return "Woof!";
       }
}

import java.util.ArrayList;


public class Person {

    ArrayList<Pet> pets = new ArrayList<Pet>();

       public Person()
       {
         pets.add(new Dog()); 
       }

       public void makePetsSpeak()
       {
          for(int i=0; i < pets.size(); i++)
          {
            System.out.println(pets.get(i).talk());
          }
       }
}

public class Main
{
    public static void main(String [] args)
    {
        Person p = new Person();
        p.makePetsSpeak();
    }
}
公共接口宠物{
公共字符串对话();
}
公营狗具宠物{
公共字符串对话()
{
回“汪!”;
}
}
导入java.util.ArrayList;
公共阶层人士{
ArrayList=new ArrayList();
公众人士()
{
添加(新狗());
}
公共void makePetsSpeak()
{
对于(int i=0;i

运行Person.MakePetsSpeak()时,它不返回任何内容。我正在做的是可能的还是有其他方法可以做到?

接口总是抽象的。所以

public abstract interface Pet
将是

public interface Pet
在一些代码(旧代码)中使用抽象只是为了兼容性,但您不再需要它了

列表没有
Count
方法。使用

要从列表中获取项目,应使用方法

你应该换衣服

System.out.println(pets(i).Talk());


而且,不管怎样,你的代码记住我一个C代码。遵循有关命名约定的java规则。

此修改后的代码运行正常。确实,MakePetsSpeak返回值
没有宣布无效的东西。但是“汪汪!”是打印出来的。所以答案是
您在这里没有真正的问题(一旦修复了编译错误)

import java.util.ArrayList;
导入java.util.List;
抽象界面Pet{
公共字符串对话();
}
宠物狗{
公共字符串对话(){
回“汪!”;
}
}
公共阶层人士{
List pets=new ArrayList();
公众人士(){
添加(新狗());
}
公共void MakePetsSpeak(){
对于(int i=0;i
纠正了您的编译问题,看起来它工作正常,符合预期的行为。 另外,遵循
Java
命名约定-函数以小写开头

Pet.java

public interface Pet {

    public String talk();
}
Dog.java

public class Dog implements Pet{

       public String talk()
       {
           return "Woof!";
       }
}
Person.java

import java.util.ArrayList;


public class Person {

    ArrayList<Pet> pets = new ArrayList<Pet>();

       public Person()
       {
         pets.add(new Dog()); 
       }

       public void makePetsSpeak()
       {
          for(int i=0; i < pets.size(); i++)
          {
            System.out.println(pets.get(i).talk());
          }
       }
}
输出:

Woof!

如果您声称正在运行可编译代码,请发布可编译代码,而不仅仅是随机代码。此外,请向我们展示您是如何运行的。请使用适当的命名约定。在Java中,方法名称以小写字母开头。很抱歉回复太晚,但我确信我已将其设置为“回复时发送电子邮件”。所有语句都应为注释。你没有回答这个问题。@SotiriosDelimanolis我不知道,它实际上解决了所有问题并提供了代码。@SotiriosDelimanolis他的头衔说他不能运行这个方法。我的回答解释了他为什么不能t@BrianRoach如果这真的是个问题,我们应该结束讨论。
这个问题是由一个无法再复制的问题或一个简单的印刷错误引起的。
@SotiriosDelimanolis,我们可以达成一致:)(我在10分钟前就投票结束了讨论)谢谢。这也适用于hashmaps吗?我看不出这段代码与
hashmaps
的关系。对不起,我不明白你的意思。这是
主类。如果这可以与
hashmaps
一起使用,这是什么意思?对不起,我一直按enter键而不是shift+enter键来输入新行是的,您可以使用类似的功能。实际上,一个
可以有多个
Pet
,因此
HashMap
应该有
宠物
列表。此外,要从键
Person
获取值,您必须重写
equals
方法,该方法在
HashMap
get
方法中使用。希望有帮助。再次感谢。对我来说,写出来非常困难,因为我写的代码非常复杂,而且比制作一个较小的示例要花费更长的时间:D
import java.util.ArrayList;


public class Person {

    ArrayList<Pet> pets = new ArrayList<Pet>();

       public Person()
       {
         pets.add(new Dog()); 
       }

       public void makePetsSpeak()
       {
          for(int i=0; i < pets.size(); i++)
          {
            System.out.println(pets.get(i).talk());
          }
       }
}
public class Main
{
    public static void main(String [] args)
    {
        Person p = new Person();
        p.makePetsSpeak();
    }
}
Woof!