Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通用接口方法在java中的实现_Java_Interface_Java 8_Static Methods - Fatal编程技术网

通用接口方法在java中的实现

通用接口方法在java中的实现,java,interface,java-8,static-methods,Java,Interface,Java 8,Static Methods,我有两个实现特定接口的类。 我想实现一个由这两个类共享的方法。 我可以将该方法实现添加到接口类中,然后从这两个类调用该方法吗 例如: public interface DM { public static void doSomething() { System.out.println("Hello World");} } public class A implements DM { doSomething(

我有两个实现特定接口的类。
我想实现一个由这两个类共享的方法。
我可以将该方法实现添加到接口类中,然后从这两个类调用该方法吗

例如:

public interface DM 
{
    public static void doSomething() { 
        System.out.println("Hello World");}
    }

    public class A implements DM
    {
        doSomething();
    }

    public class B implements DM
    {
        doSomething();
    }
}
这可行吗?

正确的方法是什么?

首先,
接口
不是一个类。接下来,是的,使用java 8,您可以向接口添加方法定义,

是的,如果您使用java 8,您可以创建一个
默认
实现,如下所示:

public interface DM
{
    default void doSomething() { System.out.println("Hello World");}
}
或者,如果它应该是静态的:

public interface DM
{
    static void doSomething() { System.out.println("Hello World");}
}
有关详细信息,请参阅

如果您能够对代码进行更广泛的更改,则可以使用另一种策略,即使用
抽象类
而不是接口,并让您的实现类扩展该类。界面中任何您不想为其编写默认值的方法都应标记为
抽象

public abstract class DM
{
    public void doSomething() { System.out.println("Hello World");}
    public abstract void doSomethingElse();
}

public class A extends DM
{
  doSomething();
}
如果您想使用接口,但不能/不会使用默认值,也可以结合使用这些方法:

public abstract class DMImpl impelements DM
{
    @Override        
    public void doSomething() { System.out.println("Hello World");}
}

public class A extends DM
{
  doSomething();
}

您可以使用Java8创建一个
default
方法。它有一些局限性,但对一些常见的共享功能有好处

你可以试试这个

interface DM 
{
    public void doSomething();
}

class A implements DM
    {
        public void doSomething()
        {
            System.out.println("Hello World");
        }
    }

class B implements DM
    {
        public void doSomething()
        {
            System.out.println("Hello World");
        }
    }
class Test111
{
    public static void main(String args[])
    {
        System.out.println("Hello");
    }
}

将起作用-不过请注意,接口的默认方法实际上是为了确保在向接口添加新方法时所有实现类都不会中断。如果你真的需要一个两个或多个类的通用方法——考虑一个抽象类或组成。一个更彻底的模式是从接口<代码>公共接口DM 开始-创建一个具有公共/共享/缺省实现的抽象基类:代码>公共抽象类抽象BaseTM。
public类A扩展了AbstractBaseDM
,而
public类B扩展了AbstractBaseDM
(但是对于Java 8,我将在许多情况下使用默认值)
interface DM 
{
    public void doSomething();
}

class A implements DM
    {
        public void doSomething()
        {
            System.out.println("Hello World");
        }
    }

class B implements DM
    {
        public void doSomething()
        {
            System.out.println("Hello World");
        }
    }
class Test111
{
    public static void main(String args[])
    {
        System.out.println("Hello");
    }
}