Consider the following Java program:

class A extends Object  { 
     void m1() { System.out.println("A_m1");  }
     void m2() { System.out.println("A_m2");  } 
     void m3() { m4();                        } 
     void m4() { System.out.println("A_m4");  } 
}
class B extends A { 
     void m2() { m1();                        } 
     void m3() { super.m3();                  } 
}
class C extends B { 
     void m1() { super.m1();
                 System.out.println("C_m1");  }
     void m2() { super.m2();                  } 
     void m3() { super.m3();                  } 
}
class D extends C { 
     void m2() { System.out.println("D_m2");  } 
} 
class E extends D {     
     void m4() { super.m3();                  } 
} 
public class Exercise extends Object {
        public static  void main(String[] args) {  
            A a = new B();
            a.m1();
            a = new E();
	    a.m1();
	    a.m2();
            a = new C();
            a.m2();
            a = new E();
	    a.m3();
        }
}

What is the output of this program?

A_m1 A_m1 C_m1 D_m2 A_m1 C_m1 then goes into an infinite loop
  • A_m1 then goes into an infinite loop
  • A_m1 A_m1 C_m1 D_m2 A_m1 C_m1 then crashes because some method is not found
  • A_m1 A_m1 C_m1 D_m2 A_m1 C_m1 then goes into an infinite loop
  • A_m1 A_m1 C_m1 D_m2 then goes into an infinite loop
  • None of the above