Quantos implements podemos fazer em uma classe, isto é, o limite de implements por classe.
Acredito que o limite seja 255 interfaces.
Só pra esclarecer, a palavra chave implements
só pode aparecer uma vez na declaração de uma classe.
Uma classe pode implementar mais de uma interface, neste caso usamos virgula para separar o nome de cada interface implementada.
interface A {}
interface B {}
interface C {}
class X implements A, B, C {}
No caso acima dizemos que as interfaces A
, B
e C
são superinterfaces diretas da classe X
.
Segundo a especificação da JVM, uma classe ou interface pode ter, no máximo, 65535 superinterfaces diretas.
• The number of direct superinterfaces of a class or interface is limited to 65535 by the size of the
interfaces_count
item of theClassFile
structure (§4.1).
Esta limitação acontece porque o campo interface_count
do arquivo class
é do tipo u2, ou seja, um inteiro sem sinal de 2 bytes.
No link abaixo vc pode ver as outras limitações:
https://docs.oracle.com/javase/specs/jvms/se15/html/jvms-4.html#jvms-4.11
Classes aninhadas eu sei que só dá pra aninhar em 255 níveis.
Já fiz isso.
Pelo que vi parece não haver um limite para classes aninhadas, só que na prática o file system pode impor limites. Considere o seguinte código:
public class Test1 {
class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa {
class bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {
class cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc {
class dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd {
}
}
}
}
}
Ao compilar a classe mais interna se tornará um arquivo com o seguinte nome:
Test1$aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb$cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc$dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd.class
Este nome tem exatamente 255 caracteres contando com a extensão, que, segundo a Wikipedia é o máximo permitido para ext4 que é o que eu uso no meu sistema.
Se eu acrescentar um único caractere ao nome de qualquer uma das classes, tipo assim:
public class Test1 {
class Zaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa {
class bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {
class cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc {
class dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd {
}
}
}
}
}
O compilador vai gerar o seguinte erro:
O máximo que eu consegui aninhar antes de receber o erro acima foram 99 classes sendo que o nome de todas tem somente um caractere.
public class A { // @formatter:off
class B { class C { class D { class E { class F { class G { class H { class I { class J { class K {
class L { class M { class N { class O { class P { class Q { class R { class S { class T { class U {
class V { class W { class X { class Y { class Z { class a { class b { class c { class d { class e {
class f { class g { class h { class i { class j { class k { class l { class m { class n { class o {
class p { class q { class r { class s { class t { class u { class v { class w { class x { class y {
class z { class À { class Î { class Í { class Ï { class Ð { class Ñ { class Ò { class Ó { class Ô {
class Õ { class Ö { class Ø { class Ù { class Ú { class Û { class Ü { class Á { class  { class à {
class Ä { class Å { class Æ { class Ç { class È { class É { class Ê { class Ë { class Ì { class Ý {
class Þ { class ß { class à { class á { class â { class ã { class ä { class å { class æ { class ç {
class è { class é { class ê { class ë { class ì { class í { class î { class ï { class ð {
} } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }
} } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }