在java中为两个不使用继承的类创建公共方法

在java中为两个不使用继承的类创建公共方法,java,class,methods,Java,Class,Methods,我只是想知道是否有任何方法可以创建两个不相关但具有相同方法实现的类。我知道有接口和静态方法,但它们似乎只有在类中有静态字段时才有用。当该方法使用特定于确切对象的字段时,是否可以执行这种操作? 我知道写这样的代码是一种糟糕的做法,但我只是好奇 编辑: 我的意思是这样的: public class Person implements MakingOlder { private int age; } public class Cat implements MakingOlder { priv

我只是想知道是否有任何方法可以创建两个不相关但具有相同方法实现的类。我知道有接口和静态方法,但它们似乎只有在类中有静态字段时才有用。当该方法使用特定于确切对象的字段时,是否可以执行这种操作? 我知道写这样的代码是一种糟糕的做法,但我只是好奇

编辑: 我的意思是这样的:

public class Person implements MakingOlder {
  private int age;
}

public class Cat implements MakingOlder {
  private int age;
}

public interface MakingOlder {
  public static void makeOlder() {
        this.age += 2;
  }
}
我不想为Person和Cat创建公共基类,接口不起作用。我试图避免两次编写同一个实现并复制代码。

当然,这被称为“组合+委派”,用以下方式替换继承通常是一种好的做法:

当然,这被称为“组合+委派”,用以下方式取代继承通常是一种好的做法:


…或者您可以使用Java 8+中的默认实现

public interface MakingOlder {

    public default void makeOlder() {
        setAge(getAge() + 2);
    }

    int getAge();

    void setAge(int age);

}

当然,您的Person和Cat实现了
MakingOlder

…或者您可以使用Java 8+中的默认实现

public interface MakingOlder {

    public default void makeOlder() {
        setAge(getAge() + 2);
    }

    int getAge();

    void setAge(int age);

}

当然,您的Person和Cat实现了
MakingOlder

可能是因为您试图在接口中实现一种方法,所以您的接口无法工作:

public static void makeOlder() {
    this.age += 2;
}
为了使其正常工作,请尝试添加
default
关键字,使其看起来像:

default Integer makeOlder(Integer age) {
    age += 2;
    return age;
}
然后,实现该接口的类只需要包含以下内容:

public class Dummy implements AA {

    Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
Dummy d = new Dummy();
d.setAge(d.makeOlder(7));
System.out.println(d.getAge());
d.setAge(d.makeOlder(d.getAge()));
System.out.println(d.getAge());
要测试结果,可以调用以下命令:

public class Dummy implements AA {

    Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
Dummy d = new Dummy();
d.setAge(d.makeOlder(7));
System.out.println(d.getAge());
d.setAge(d.makeOlder(d.getAge()));
System.out.println(d.getAge());

您的接口可能无法工作,因为您试图在接口中实现一个方法:

public static void makeOlder() {
    this.age += 2;
}
为了使其正常工作,请尝试添加
default
关键字,使其看起来像:

default Integer makeOlder(Integer age) {
    age += 2;
    return age;
}
然后,实现该接口的类只需要包含以下内容:

public class Dummy implements AA {

    Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
Dummy d = new Dummy();
d.setAge(d.makeOlder(7));
System.out.println(d.getAge());
d.setAge(d.makeOlder(d.getAge()));
System.out.println(d.getAge());
要测试结果,可以调用以下命令:

public class Dummy implements AA {

    Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
Dummy d = new Dummy();
d.setAge(d.makeOlder(7));
System.out.println(d.getAge());
d.setAge(d.makeOlder(d.getAge()));
System.out.println(d.getAge());

你想用同样的方法写两次吗?也许你可以用一个例子来说明这个问题,说明你想要实现什么以及为什么?也许泛型会对你有所帮助。但是,您需要提供有关类的更多信息编写一个静态方法,该方法将要处理的对象作为其输入。一个例子是静态的
对象。散列(对象)
。你能添加一些代码来澄清吗?给定实现某些方法的类
Z
,类
A
B
可以委托给
Z
,以避免代码重复。回复:您的编辑。。。这是一个抽象基类的经典学术用例。你为什么不想用它呢?你想写两次同样的方法?也许你可以用一个例子来说明这个问题,说明你想要实现什么以及为什么?也许泛型会对你有所帮助。但是,您需要提供有关类的更多信息编写一个静态方法,该方法将要处理的对象作为其输入。一个例子是静态的
对象。散列(对象)
。你能添加一些代码来澄清吗?给定实现某些方法的类
Z
,类
A
B
可以委托给
Z
,以避免代码重复。回复:您的编辑。。。这是一个抽象基类的经典学术用例。你为什么不想用它呢?非常感谢!这就是我一直在找的汉克斯!这是我一直在寻找的…只是我的意见,这不是很好,调用
makeOlder
,必须调用setter for age…只是我的意见,这不是很好,调用
makeOlder
,必须调用setter for age。。。