To make you understand the concepts i have created the whole project..
The project structure is as below.
// Demo class which the super class
// Demo class which the super class
package com.source; public class Demo { private int a; public int b; protected int c; int d; public Demo() { System.out.println("This is a public demo constructor"); } private Demo( String one ){ System.out.println("This is a private one argument demo constructor"); } private void method(){ System.out.println("This is a private method"); } public void method1(){ System.out.println("This is a public method1"); } protected void method2(){ System.out.println("This is a protected method2"); } void method3(){ System.out.println("This is a defualt method"); } // Playing with inner classes public static class PublicStaticInnerClassOfDemo{ public void InnerMethod(){ System.out.println("public static class *Hi I am inside an innerMethod which is public"); } public static void staticInnerMethod(){ System.out.println("public static class *Hi I am inside an innerMethod which is public static "); } private static void staticInnerMethodPrivate(){ System.out.println("public static class *Hi I am inside an innerMethod which is private static "); } protected static void staticInnerMethodProtected(){ System.out.println("public static class *Hi I am inside an innerMethod which is protected static "); } static void staticInnerMethodDefault(){ System.out.println("public static class *Hi I am inside an innerMethod which is default static "); } } protected class ProtectedInnerClassOfDemo{ public void InnerMethodPublic(){ System.out.println("ProtectedInnerClassOfDemo *Hi I am inside an innerMethod which is public"); } private void InnerMethodPrivate(){ System.out.println("ProtectedInnerClassOfDemo *Hi I am inside an innerMethod which is private "); } protected void InnerMethodProtected(){ System.out.println("ProtectedInnerClassOfDemo *Hi I am inside an innerMethod which is protected "); } void InnerMethodDefault(){ System.out.println("ProtectedInnerClassOfDemo *Hi I am inside an innerMethod which is default "); } } class DefaultInnerClassOfDemo{ public void InnerMethodPublic(){ System.out.println("DefaultInnerClassOfDemo *Hi I am inside an innerMethod which is public"); } private void InnerMethodPrivate(){ System.out.println("DefaultInnerClassOfDemo *Hi I am inside an innerMethod which is private "); } protected void InnerMethodProtected(){ System.out.println("DefaultInnerClassOfDemo *Hi I am inside an innerMethod which is protected "); } void InnerMethodDefault(){ System.out.println("DefaultInnerClassOfDemo *Hi I am inside an innerMethod which is default "); } } private class PrivateInnerClassOfDemo{ // you can't extend private inner class of Demo } public class PublicInnerClassOfDemo{ /*The method innerMethod1 cannot be declared static; static methods can only be declared in a static or top level type*/ // public static void innerMethod1(){} public void InnerMethodPublic(){ System.out.println("PublicInnerClassOfDemo *Hi I am inside an innerMethod which is public"); } private void InnerMethodPrivate(){ System.out.println("PublicInnerClassOfDemo *Hi I am inside an innerMethod which is private "); } protected void InnerMethodProtected(){ System.out.println("PublicInnerClassOfDemo *Hi I am inside an innerMethod which is protected "); } void InnerMethodDefault(){ System.out.println("PublicInnerClassOfDemo *Hi I am inside an innerMethod which is default "); } } } =============================END OF DEMO CLASS ====================== // class which extends Demo class in the same package and will tell which of the methods and variables can be accessed. public class DemoInSamePackage extends Demo{ public DemoInSamePackage() { System.out.println("DemoInSamePackage is called"); } public void mySamePackageMethod(){ System.out.println("MySamePackage public method is accessing params of super class's variables"); System.out.println("a === private but not allowed"); System.out.println("b === public allowed "+b); System.out.println("c === pretected allowed"+c); System.out.println("d === default "+d); callingMethods(); } private void callingMethods() { System.out.println("\n MySamePackage private method is accessing methods of super class"); System.out.println("Not allowed to call the private method of the super class"); method1(); method2(); method3(); } } =========================END OF THE CLASS======================= // class that extends inner classes of Demo class and tells which vars and methos can be accessible public class ExtendInnerClassInSamePackage extends Demo.PublicStaticInnerClassOfDemo{ // When extending Demo.PublicStaticInnerClassOfDemo public void method(){ Demo.PublicStaticInnerClassOfDemo.staticInnerMethod(); // ok Demo.PublicStaticInnerClassOfDemo.staticInnerMethodDefault(); //ok Demo.PublicStaticInnerClassOfDemo.staticInnerMethodProtected(); //ok } /*When extending Demo.ProtectedInnerClassOfDemo*/ } // Important /* * you can't extend the other classes but if you want you can do like below public class ExtendInnerClassInSamePackage extends Demo{ class A extends ProtectedInnerClassOfDemo{ public void method(){ Demo d = new Demo(); Demo.PublicInnerClassOfDemo p = d.new PublicInnerClassOfDemo(); p.InnerMethodPublic(); // ok p.InnerMethodProtected(); // ok p.InnerMethodDefault(); // ok } } like this you can call all the classes but private class and private methods of the classes you can't call * * */ =============================END OF CLASS=========================== // Main class that creates objects of classes package com.source; import com.sourcebits.DemoInOtherPackage; import com.sourcebits.ExtendInnerClassInOtherPackage; public class Main { public static void main( String [] args ){ Demo d = new Demo(); // you can't not call private constructor of a class but default is ok // Demo privateConstructor = new Demo("hi"); System.out.println("========Demo class accessing its own variables "); System.out.println("a === private not allowed "); //but if object is created inside the Demo class then it can access private variable System.out.println("b === public allowed "+d.b); System.out.println("c === protected allowed "+d.c); System.out.println("d === default allowed "+d.d); System.out.println("========Demo class accessing its own Methods "); // d.method(); not allowed but if object is created inside the Demo class then it can access private methods d.method1(); // public method ok d.method2(); // protected ok d.method3(); // defualt ok System.out.println("\n"); System.out.println("When calls are from same package"); DemoInSamePackage samePackageObj = new DemoInSamePackage(); samePackageObj.mySamePackageMethod(); // but if the method were private could not have been accessed System.out.println("\n"); System.out.println("When calls are from other package\n\n "); DemoInOtherPackage otherPackageObj = new DemoInOtherPackage(); otherPackageObj.myOtherPackageMethod(); System.out.println("When calls are from Inner classes which is in same package"); ExtendInnerClassInSamePackage innersame = new ExtendInnerClassInSamePackage(); innersame.method(); innersame.InnerMethod(); // ok ExtendInnerClassInSamePackage.staticInnerMethod(); // ok ExtendInnerClassInSamePackage.staticInnerMethodDefault(); // ok ExtendInnerClassInSamePackage.staticInnerMethodProtected(); // ok System.out.println("When calls are from Inner classes which is in Other package"); ExtendInnerClassInOtherPackage innerother = new ExtendInnerClassInOtherPackage(); innerother.InnerMethod(); innerother.method(); ExtendInnerClassInOtherPackage.staticInnerMethod(); // ok ExtendInnerClassInOtherPackage.staticInnerMethodProtected(); //Ok } } ===============================END OF CLASS========================== /* class extends Demo that tells if we can access vars and methods of Demo class*/ package com.sourcebits; import com.source.Demo; public class DemoInOtherPackage extends Demo{ public DemoInOtherPackage() { System.out.println("DemoInOtherPackage default arguement constructor"); } public void myOtherPackageMethod(){ System.out.println("MyOtherPackage public method is accessing variables of super class"); System.out.println("a === private not allowed"); System.out.println("b === public allowed "+b); System.out.println("c === protected allowed"+c); System.out.println("d === defalut not allowed"); callingMethods(); } private void callingMethods() { System.out.println("MyOtherPackage private method is accessing methods of super class"); System.out.println("Not allowed to call the private method of the super class"); method1(); method2(); System.out.println("Not allowed to call the default method of the super class"); } } =============================END OF CLASS============================ // class that extends inner class of Demo class package com.sourcebits; import com.source.Demo; public class ExtendInnerClassInOtherPackage extends Demo.PublicStaticInnerClassOfDemo{ // When extending Demo.PublicStaticInnerClassOfDemo public void method(){ Demo.PublicStaticInnerClassOfDemo.staticInnerMethod(); // ok // ** Demo.PublicStaticInnerClassOfDemo.staticInnerMethodDefault(); // not allowed Demo.PublicStaticInnerClassOfDemo.staticInnerMethodProtected(); //ok } } //Important /* * you can't extend the other classes but if you want you can do like below public class ExtendInnerClassInOtherPackage extends Demo{ class A extends PublicInnerClassOfDemo{ public void method(){ Demo d = new Demo(); Demo.PublicInnerClassOfDemo p = d.new PublicInnerClassOfDemo(); p.InnerMethodPublic(); // ok InnerMethodProtected(); // allowed p.InnerMethodProtected(); // not allowed p.InnerMethodDefault(); // not allowed } } NOTE : In the different package you can't extend default,private class but public * when extending protected class : public class ExtendInnerClassInOtherPackage extends Demo{ class A extends ProtectedInnerClassOfDemo{ public void method(){ //Demo d = new Demo(); //Demo.ProtectedInnerClassOfDemo p = d.new Prote(); // can’t create object InnerMethodPublic(); // ok InnerMethodProtected(); // ok InnerMethodDefault(); // not allowed } } * */ =====================END OF THE CONCEPT=============================
No comments:
Post a Comment