155

The topic says the most of it - what is the reason for the fact that static methods can't be declared in an interface?

public interface ITest { public static String test(); } 

The code above gives me the following error (in Eclipse, at least): "Illegal modifier for the interface method ITest.test(); only public & abstract are permitted".

7
  • 2
    Please unaccept Espo's answer, as it is flawed. An interface has a class-file that could contain the implementation of a static method (if the Java-designer would allow this), so there is no problem in resolving the implementation of the static method. It works exactly as with other static classes. Commented Sep 26, 2008 at 8:51
  • i kind of agree with the answer given by "erickson" stackoverflow.com/questions/512877/… Commented Nov 11, 2013 at 11:59
  • 10
    This will be available in Java 8 btw. Commented Dec 29, 2013 at 14:11
  • 1
    @Vadorequest GIYF but anyway, check here Commented Feb 5, 2014 at 11:47
  • 2
    Links from official documentation : Java SE tutorial & Java Language Specification 9.2 Commented Apr 22, 2015 at 8:31

14 Answers 14

87

There are a few issues at play here. The first is the issue of declaring a static method without defining it. This is the difference between

public interface Foo { public static int bar(); } 

and

public interface Foo { public static int bar() { ... } } 

The first is impossible for the reasons that Espo mentions: you don't know which implementing class is the correct definition.

Java could allow the latter; and in fact, starting in Java 8, it does!

Sign up to request clarification or add additional context in comments.

4 Comments

Yes - it's idealogical not technical. The reason I would like it is. that one can have a static "implementation" method in an interface that only references other "interface" methods in the interface that can be easily re-used by implementing classes. But one can declare a static class in an interface so one could have such things reside there like MyInterface.Impl.doIt(MyInterface i, Object[] args) { ... }
Since Java 8, you can define static methods in an interface. The methods must be public.
@OlivierGrégoire ...and they are not inherited, which is key.
Good answer, though "approximately equivalent" ROFLMAO xD I would have put it more like "somewhat resembles".
45

The reason why you can't have a static method in an interface lies in the way Java resolves static references. Java will not bother looking for an instance of a class when attempting to execute a static method. This is because static methods are not instance dependent and hence can be executed straight from the class file. Given that all methods in an interface are abstract, the VM would have to look for a particular implementation of the interface in order to find the code behind the static method so that it could be executed. This then contradicts how static method resolution works and would introduce an inconsistency into the language.

3 Comments

This explanation doesn't explain the problem. Every interface have it's own class-file, it could contain the static-method. So no lookup for a particular implementation would be needed.
Not every interface type in Java is within it's own file, nor should it be according to JLS. Additionally JLS doesn't stipulate that classes have to be always stored withing a file system, quite the contrary.
@Totophil: Interfaces must not be in a single java-file, but it will have an own class-file after compiling. That's what I wrote.
19

I'll answer your question with an example. Suppose we had a Math class with a static method add. You would call this method like so:

Math.add(2, 3); 

If Math were an interface instead of a class, it could not have any defined functions. As such, saying something like Math.add(2, 3) makes no sense.

Comments

12

The reason lies in the design-principle, that java does not allow multiple inheritance. The problem with multiple inheritance can be illustrated by the following example:

public class A { public method x() {...} } public class B { public method x() {...} } public class C extends A, B { ... } 

Now what happens if you call C.x()? Will be A.x() or B.x() executed? Every language with multiple inheritance has to solve this problem.

Interfaces allow in Java some sort of restricted multiple inheritance. To avoid the problem above, they are not allowed to have methods. If we look at the same problem with interfaces and static methods:

public interface A { public static method x() {...} } public interface B { public static method x() {...} } public class C implements A, B { ... } 

Same problem here, what happen if you call C.x()?

7 Comments

Any reason for the downvote? A explaining comment would be nice.
i am not the downvoter, but isn't this valid for non-static methods too?
OK, here are two different possibilities. A method could be implemented or only declared. I understood, that the static method has to be implemented. In that meaning I encounter the problem presented in my answer. If you don't do that, you run into the problem Espo described - and that I didn't understand because I assumed the static method would be implemented. You also cannot declare a static abstract method for this reason, try it out, the compiler will complain.
Ok, forget the implementation part. the question is why cant we declare. yes the compiler will complain and why is that is the question. to which I dont think you have answered.
How would the situation there be any worse than having interface A contain int x(int z); and interface B contain string x(int x);? What is the meaning of x(3) in interface C?
|
8

Static methods are not instance methods. There's no instance context, therefore to implement it from the interface makes little sense.

Comments

7

Now Java8 allows us to define even Static Methods in Interface.

interface X { static void foo() { System.out.println("foo"); } } class Y implements X { //... } public class Z { public static void main(String[] args) { X.foo(); // Y.foo(); // won't compile because foo() is a Static Method of X and not Y } } 

Note: Methods in Interface are still public abstract by default if we don't explicitly use the keywords default/static to make them Default methods and Static methods resp.

Comments

5

There's a very nice and concise answer to your question here. (It struck me as such a nicely straightforward way of explaining it that I want to link it from here.)

1 Comment

This is not an answer to the question, at best it should be a comment.
4

It seems the static method in the interface might be supported in Java 8, well, my solution is just define them in the inner class.

interface Foo { // ... class fn { public static void func1(...) { // ... } } } 

The same technique can also be used in annotations:

public @interface Foo { String value(); class fn { public static String getValue(Object obj) { Foo foo = obj.getClass().getAnnotation(Foo.class); return foo == null ? null : foo.value(); } } } 

The inner class should always be accessed in the form of Interface.fn... instead of Class.fn..., then, you can get rid of ambiguous problem.

Comments

3

An interface is used for polymorphism, which applies to Objects, not types. Therefore (as already noted) it makes no sense to have an static interface member.

1 Comment

In some reflective contexts is almost seems to make sense though
1

Java 8 Had changed the world you can have static methods in interface but it forces you to provide implementation for that.

public interface StaticMethodInterface { public static int testStaticMethod() { return 0; } /** * Illegal combination of modifiers for the interface method * testStaticMethod; only one of abstract, default, or static permitted * * @param i * @return */ // public static abstract int testStaticMethod(float i); default int testNonStaticMethod() { return 1; } /** * Without implementation. * * @param i * @return */ int testNonStaticMethod(float i); 

}

Comments

0

Illegal combination of modifiers : static and abstract

If a member of a class is declared as static, it can be used with its class name which is confined to that class, without creating an object.

If a member of a class is declared as abstract, you need to declare the class as abstract and you need to provide the implementation of the abstract member in its inherited class (Sub-Class).

You need to provide an implementation to the abstract member of a class in sub-class where you are going to change the behaviour of static method, also declared as abstract which is a confined to the base class, which is not correct

1 Comment

How does this answer the question? The OP asked about interface while you wrote about class.
0

Since static methods can not be inherited . So no use placing it in the interface. Interface is basically a contract which all its subscribers have to follow . Placing a static method in interface will force the subscribers to implement it . which now becomes contradictory to the fact that static methods can not be inherited .

1 Comment

static methods are always inherited but they can't be overridden.
0

With Java 8, interfaces can now have static methods.

For example, Comparator has a static naturalOrder() method.

The requirement that interfaces cannot have implementations has also been relaxed. Interfaces can now declare "default" method implementations, which are like normal implementations with one exception: if you inherit both a default implementation from an interface and a normal implementation from a superclass, the superclass's implementation will always take priority.

3 Comments

OMG! We have a serious programmer(and me,commenter) answering(and me,commenting) 10 year old question.
I didn't notice the date :)
Haha! No problem!
-2

Perhaps a code example would help, I'm going to use C#, but you should be able to follow along.

Lets pretend we have an interface called IPayable

public interface IPayable { public Pay(double amount); } 

Now, we have two concrete classes that implement this interface:

public class BusinessAccount : IPayable { public void Pay(double amount) { //Logic } } public class CustomerAccount : IPayable { public void Pay(double amount) { //Logic } } 

Now, lets pretend we have a collection of various accounts, to do this we will use a generic list of the type IPayable

List<IPayable> accountsToPay = new List<IPayable>(); accountsToPay.add(new CustomerAccount()); accountsToPay.add(new BusinessAccount()); 

Now, we want to pay $50.00 to all those accounts:

foreach (IPayable account in accountsToPay) { account.Pay(50.00); } 

So now you see how interfaces are incredibly useful.

They are used on instantiated objects only. Not on static classes.

If you had made pay static, when looping through the IPayable's in accountsToPay there would be no way to figure out if it should call pay on BusinessAcount or CustomerAccount.

1 Comment

Just because static methods make no sense in THIS example, does not mean that they don't make sense in ANY example. In your example if the IPayable interface had static method "IncrementPayables" that kept track of how many payables were added, this would be a real use case. Of course, one could always use an abstract class, but that's not what you addressed. Your example in itself does not undermine static methods in interfaces.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.