Here is a useful list of Java IDEs. They are in NO specific order!

Eclipse
This is a very good and open source IDE. It is used a lot commercially and personally. It was made in Java so it's cross-platform. It has a lot of support for additional plug-ins to extend your developing needs. What I love about Eclipse is that it compiles your code as you type. It highlights compiling errors and mistakes like how MS Word does for mis-spelled words.


MyEclipse
Developers worldwide choose MyEclipse because it is the most affordable and comprehensive J2EE IDE and Web development tool suite for the Eclipse open-source platform. MyEclipse is the Eclipse plugin-based solution for all your UML, AJAX, Web,Web Services, J2EE, JSP, XML,Struts, JSF, Java Persistence,EJB, extended database support and application server integration needs.
Netbeans
This is a very good IDE also. It has a built-in GUI Builder for those you like that R.A.D. . It is used a lot commercially too. It was made in Java so it's cross-platform like Eclipse.

BlueJ
This is an IDE developed towards first time Java developers. It teaches you a lot of programming concepts in Java and has a nice UML tool.

JCreator
This is my first Java IDE I used. It is very good and very easy to use. This IDE was made in C++ unlike the ones above, which were all made in Java. Only runs on Windows platform.

IntelliJ IDEA 
IntelliJ IDEA is an intelligent Java IDE intensely focused on developer productivity that provides a robust combination of enhanced development tools.

Borland JBuilder
This is a great commerial IDE for Java. It does have a price but some developers believe it's worth it. It also has a built-in Java GUI Builder.

Dr. Java
Dr. Java is a lightweight development environment for writing Java programs. It is designed primarily for students, providing an intuitive interface and the ability to interactively evaluate Java code. It also includes powerful features for more advanced users. 

Static variables can't be local why ??

Because  In C and C++, you can have local static variables. The scope of such variables is the method they are defined in, but they continue to exist when the method ends. Next time the same method is called, such a variable will still have the value it had when the method was called the previous time. 
 Although Java took a number of features from C++, it isn't the same as C++, and this feature was left out. Probably the designers of the Java language didn't think this was a very useful feature to borrow from C++. So, This is not a feature that you really need, and it can be hard to understand. 


We can't override a static method by a non-static method why ??

Have a look at the below code...

class Parent
{
                   static void m1()
                           {
                                    System.out.println("static m1 in Test");
                            }
}

class Child extends Parent
{
                      void  m1()
                            {
                                      System.out.println("non static m1 in Test1");
                            }
}

class Demo
{
                  public static void main(String...args)
                            {
                                        Parent obj = new Child();
                                         obj.m1();          // Give Attention on This line

                            }
}

Now, picture is clear i think. Suppose compiler compiles this code without any problem then at compile time compiler checks the m1 method's availability and type in Parent class which is static Hence, changes obj to Parent (class name) .Its okay for now. Now you have your your byte code BUT at run time when JVM checks the object type it will call m1 method in the Child class but now the problem is obj (Refrence variable) have changed to class name Which is Parent (class name) and m1 method in the Child class is non-static then there will be a strange condition.
I think now it is clear that we can't override a static method by a non-static method & vice-versa .  

Why we always declare main method public ?

Because the rules of the JVM say that

Can We overload main method ??

Point here is that main() is no different from any other method.

Is it possible to override main method?

In Java we can not override a method which is static, but we can implement the method with the same name and parameters. This is called shadowing and not overriding.
Have a Look Here For A better explanation

what is the use of constructor inside abstract class

Instance of Abstract class cant be created but still there are few things that needs to be taken care: