Sorry but Java doesn't have operator overloading. That's builtin operator behavior. Method overloading isn't a feature of polymorphism. It's a separate feature. Polymorphism is a trait of an object where it can appear as a single base type but can have a completely different implementation in a subclass. E.g. public void method (List<String> list) { //... } method(myArrayList); method(List.of( "A" , "B" , "C" ); Notice that method accepts two different object types both of which implement the List interface. Yet treats them as the same type due to inherited traits. That's polymorphism. It's always in runtime. ArrayList will define the method get so the compiler must define it as a virtual call. That means that runtime needs to invoke the right implementation of that method.
