Monday, August 16, 2010

Interface related questions

1:
public interface AQuestion
{
     public abstract void someMethod() throws Exception;
}


class AQuestionImpl implements AQuestion
{
    public void someMethod()
    {
        System.out.println("someMethod");
    }
}

Q: Will the code compile? Why did the code compile successfully when implementation method is not declared abstract?
The above code will compile as all methods of interface are public and abstract. And implementation method should implement the method.

Q: Why did code compile when implementation method did not throw Exception?
A:  Exception is not a checked exception so it is not necessary to specify throws clause for Exception.

                                                                                                                                                                                     

Can an interface be private or protected?

private interface PrivateInf
{
    public abstract void someMethod() throws Exception;
}

class AQuestionImpl implements PrivateInf
{
    public void someMethod()
    {
        System.out.println("someMethod");
    }
}

Output: Compile error
modifier private not allowed here
private interface PrivateInf
        ^
1 error

                                                                                                                                                                                      


public interface AQuestion
{
     void someMethod() throws Exception;
}

class AQuestionImpl implements AQuestion
{
    void someMethod()
    {
        System.out.println("someMethod");
    }

}

Output: Compile error

attempting to assign weaker access privileges; was public
    void someMethod()
         ^
1 error

Reason: the method declared in interface is implicitly public. So the implementation must be declared public.

________________________________________________________________________________________

public interface AQuestion
{
     void someMethod() throws Exception;
}

class AQuestionImpl implements AQuestion
{
    public final void someMethod()
    {
        System.out.println("someMethod");
    }

}

Output: It compiles, the methods declared in interface are implicitly public and abstract. However its implementation can be final. It means that the implemented method cannot be overridden.

How to set classpath?

See article http://download-llnw.oracle.com/javase/1.4.2/docs/tooldocs/solaris/classpath.html

Class Access

1:
package com.sunil.scjp.puzzles;

public interface AQuestion
{
     void someMethod() throws Exception;
}

class AQuestionImpl implements AQuestion
{
    public final void someMethod()
    {
        System.out.println("someMethod");
    }

}

public class ClassB
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");

        AQuestion = new AQuestionImpl();
    }
}


Compilation:   
javac -cp . ClassB.java
ClassB.java:10: com.sunil.scjp.puzzles.AQuestionImpl is not public in com.sunil.scjp.puzzles; cannot be accessed from outside package
        AQuestion aQ = new AQuestionImpl();
                           ^
1 error

Reason: the AQuestionImpl is of default access, It can be accessed only in the same package.

__________________________________________________________________________________
 2:

package com.sunil.scjp.puzzles;

public interface AQuestion
{
     void someMethod() throws Exception;
}

class AQuestionImpl implements AQuestion
{
    public final void someMethod()
    {
        System.out.println("someMethod");
    }

}
 
package com.sunil.scjp.puzzles;


public class ClassB
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");

        AQuestion aQ = new AQuestionImpl();
    }
}


Compilation: Success
Output: Hello World!
Reason: Since the package is same, the ClassB can access AQuestionImpl

___________________________________________________________________________________
3:
package com.sunil.scjp.puzzles;

class Beverage
{
}

package com.sunil.scjp;

import com.sunil.scjp.puzzles.Beverage;

class  Tea extends Beverage
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}

Compilation:
D:\workings\Sunil\skillsets\Java\SCJP\eclipse\SCJP\src>javac -cp . com/sunil/scjp/puzzles/Beverage.java

D:\workings\Sunil\skillsets\Java\SCJP\eclipse\SCJP\src>javac -cp . com/sunil/scjp/Tea.java
com\sunil\scjp\Tea.java:3: com.sunil.scjp.puzzles.Beverage is not public in com.sunil.scjp.puzzles; cannot be accessed from outside package
import com.sunil.scjp.puzzles.Beverage;
                             ^
com\sunil\scjp\Tea.java:5: cannot find symbol
symbol: class Beverage
class  Tea extends Beverage
                   ^
2 errors


Explanation: 
Beverage file compiles fine. 
Beverage class is in package com.sunil.scjp.puzzles and Tea is in package com.sunil.scjp. The import statement itself fails while compiling Tea.java
_________________________________________________________________________________
4:

package com.sunil.scjp.puzzles;

public class Beverage
{
}

package com.sunil.scjp;

class  Tea extends Beverage
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}

Compilation:
D:\workings\Sunil\skillsets\Java\SCJP\eclipse\SCJP\src>javac -cp . com/sunil/scjp/puzzles/Beverage.java

D:\workings\Sunil\skillsets\Java\SCJP\eclipse\SCJP\src>javac -cp . com/sunil/scjp/Tea.java

D:\workings\Sunil\skillsets\Java\SCJP\eclipse\SCJP\src>javac -cp . com/sunil/scjp/Tea.java
com\sunil\scjp\Tea.java:4: cannot find symbol
symbol: class Beverage
class  Tea extends Beverage
                   ^
1 error

Explanation: Even-though the Beverage class is public, compilation of Tea.java fails as it does not import the Beverage class.

------------------------------------------------------------------------------------------------------------
5:
package com.sunil.scjp.puzzles;

final abstract public class PerfectlyValidClass
{
    public void someMethod()
    {
        System.out.println("");
    }
   
}
Compilation: 
D:\workings\Sunil\skillsets\Java\SCJP\eclipse\SCJP\src>javac -cp . com/sunil/scjp/puzzles/PerfectlyValidClass.java
com\sunil\scjp\puzzles\PerfectlyValidClass.java:3: illegal combination of modifiers: abstract and final
final abstract public class PerfectlyValidClass
                      ^
1 error

Explanation: You cannot mix non access modifiers while declaring a class.
--------------------------------------------------------------------------------------------------------------
6:

abstract strictfp public class PerfectlyValidClass
{
    public strictfp final String myStr = new String("Hello");

    public void someMethod()
    {
        System.out.println("");
    }
   
}


Compilation:
D:\workings\Sunil\skillsets\Java\SCJP\eclipse\SCJP\src>javac -cp . com/sunil/scjp/puzzles/PerfectlyValidClass.java
com\sunil\scjp\puzzles\PerfectlyValidClass.java:5: modifier strictfp not allowed here
    public strictfp final String myStr = new String("Hello");
                                 ^
1 error

Explanation: strictfp is only class and method modifier.

----------------------------------------------------------------------------------------
7:
abstract strictfp public class PerfectlyValidClass
{
    public final String myStr = new String("Hello");

    public strictfp void someMethod()
    {
        System.out.println("");
    }
   
}

Compilation: Success
-----------------------------------------------------------------------------------------------------------

class final ManThisIsFinal
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}


Compilation:

com\sunil\scjp\puzzles\ManThisIsFinal.java:3: <identifier> expected
class final ManThisIsFinal
     ^
com\sunil\scjp\puzzles\ManThisIsFinal.java:3: <identifier> expected
class final ManThisIsFinal
                          ^
2 errors

Explanation: accessor should be followed by an identifier while defining class or variable
--------------------------------------------------------------------------------------------------------

AQuestion


public class AQuestion
{

    public void method(Object o)
    {
        System.out.println("Object Version");
    }

    public void method(String s)
    {
        System.out.println("String version");
    }

    public static void main(String[] args)
    {
        AQuestion question = new AQuestion();
        question.method(null);
    }
}

Output:
String version
Reason: According to JLS, if both methods are suitable for a method call then the method whose arguments are most specific is choosen. Here String argument is more specific than Object

Variant 2:
public class AQuestion
{

    public void method(Object o, String s)
    {
        System.out.println("Object Version");
    }

    public void method(String s, Object o)
    {
        System.out.println("String version");
    }

    public static void main(String[] args)
    {
        AQuestion question = new AQuestion();
        question.method(null, null);
    }
}


Output:
compilation error
AQuestion.java:19: reference to method is ambiguous, both method method(java.lang.Object,java.lang.String) in
com.sunil.scjp.puzzles.AQuestion and method method(java.lang.String,java.lang.Object) in com.sunil.scjp.puzzles.AQuestion match
        question.method(null, null);
                ^
1 error

Variant 3:

public class AQuestion
{

    public void method(StringBuffer sb)
    {
        System.out.println("StringBuffer Version");
    }

    public void method(String s)
    {
        System.out.println("String version");
    }

    public static void main(String[] args)
    {
        AQuestion question = new AQuestion();
        question.method(null);
    }
}

Output: compilation error
AQuestion.java:19: reference to method is ambiguous, both method method(java.lang.StringBuffer) in com.sunil.scjp.puzzles.AQuestion and method method(java.lang.String) in com.sunil.scjp.puzzles.AQuestion match
        question.method(null);
                ^
1 error

Sunday, August 15, 2010

String Equal

Source: http://www.angelfire.com/or/abhilash/Main.html


public class StringEqual
{


    public static void main(String[] args)
    {
        if("String".toString() == "String")
            System.out.println("Equal");
        else
            System.out.println("Not Equal");

    }

}

Output: Equal
Reason? :


Variant 2:
public class StringEqual
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        String str1 = "String";
        if(str1 == "String")

            System.out.println("Equal");

        else

            System.out.println("Not Equal");

    }

}

Output: Equal

Variant 3:

public class StringEqual
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        String str1 = "String";
        String str2 = "String";
        if(str1 == str2)

            System.out.println("Equal");

        else

            System.out.println("Not Equal");

    }

}

Output: Equal