class A
def methoda_public
puts "Hello from methoda_public self=#{self}"
end
def methoda_private
puts "Hello from methoda_private self=#{self}"
end
def methoda_protected
puts "Hello from methoda_protected self=#{self}"
end
# 1) Java => class methods are defined using static keyword. instances can access class methods in Java.
# 2) Ruby => class methods are actually singleton methods of class itself. (in Ruby a class is an object itself.). class methods are actually defined in
# singleton class of "class object" and hence called as singleton methods. Only that object can call singleton method on which it is defined and none other.
# Singleton methods are Exclusive to a single particular object only. Hence even the instances created from class A cannot access class methods.
# derived class can invoke base class' singleton object. Again instances of Derived class cannot access singleton method defined on base class.
def self.methoda_classmethod_public
puts "hello from methoda_classmethod_public self=#{self}"
end
private :methoda_private
protected :methoda_protected
end
class B < A
def public_methodb_calling_private_methoda
# 1) Java => private members are not inherited directly in derived class. So this will not work in Java.
# Derived class inherits base class' protected and public members. So if Base class' protected/public method access private member
# then Derived class can also 'work' on private member via inherited protected/public methods.
# 2) Ruby => private members are inherited in Ruby. So this will work in ruby.
methoda_private
# 1) Java => you cannot access private memebers directly in derived class. So this will not work in Java.
# 2) Ruby => Will not work as private members must be accessed WITHOUT explicit receiver in derived class.
#A.new.methoda_private # A new object is created and we are trying to access its private member. will not work.
#self.methoda_private # An equivalent in Java would be this.methoda_private(). But ofcourse in Java private members are not inherited so will not work.
# 1) Java => Protected members can be accessed in derived class directly becuase they are inherited. So this will work.
# 2) Ruby => Protected members are inherited in Ruby as well. So this will work.
methoda_protected
# 1) Java => protected memeber cannot be accessed in drived class using reference variable(i.e. by creating object).
# 2) Ruby => This will work. But this will NOT work in Ruby also if below expression i.e. A.new.methoda_protected is called outside class B.
A.new.methoda_protected
# 1) Java => A Java equivalent would be this.methoda_protected() . This will work in Java. As protected methods are inherited in Java directly. Needed verification.
# 2) Ruby => This will work. Ruby will be calling inherited method. Java will also do the same.
self.methoda_protected
# 1) Java => Instance method can call static method (class method).
# 2) Ruby => This will not work. Instance method CANNOT call class method.
#methoda_classmethod_public
# 1) Java => instance method can call static method (class method). In java it would be this.methoda_classmethod_public()
# 2) Ruby => this will not work. Because inside instance method self will be referring to the instance of B. And instance of B CANNOT call
# singleton method of class A.
#self.methoda_classmethod_public
end
# 1) Java => Both below statements are not allowed in Java. These are called outside any method definition.
# 2) Ruby => Both below will work in Ruby. Hence class methods are inherited but only to be called by derived class itself.
# class methods are singleton method. Normally singleton methods are called by only their own onjects.
# But when in case of singleton methods defined on class (class methods), they can be called by dervied class also. (Not by derived class instances).
methoda_classmethod_public
self.methoda_classmethod_public
end
#A.new.methoda_private # => will not work. (same as in Java)
#A.new.methoda_protected # => will not work. (same as in Java). Compare and take a note of this expression inside class B as well.
#A.new.methoda_classmethod_public # => Will not work in Ruby but will work in Java. Java syntax would be: A a = new A(); a.methoda_classmethod_public() .
B.new.public_methodb_calling_private_methoda
B.methoda_classmethod_public # => will work both in Java and Ruby
Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts
Tuesday, 8 March 2016
Java and Ruby Inheritance Comparison
Following is a Ruby Program. This is heavily commented with reference to Java and Ruby both.
Tuesday, 1 March 2016
Understanding JAVA Nested Classes
class OuterClass {
private String outerClassPrivateInstanceVar = "outerClassPrivateInstanceVar";
public static String outerClassPublicStaticVar = "outerClassPublicStaticVar";
public String outerClassPublicInstanceVar = "outerClassPublicInstanceVar";
void outerClassInstanceMethod() {
System.out.println("Inside outerClassInstanceMethod.");
}
static void outerClassStaticMethod() {
System.out.println("Inside outerClassStaticMethod.");
}
// NON-STATIC Inner class
class InnerClass {
// Non-static innerClass cannot have static members. Following will not work.
// static String InnerClassStaticVar = "InnerClassStaticVar";
public void innerClassMethod() {
System.out.println("Inside innerClassMethod.");
}
public void innerClassAccessOuterClassVars() {
System.out.println(outerClassPrivateInstanceVar);
System.out.println(outerClassPublicInstanceVar);
System.out.println(outerClassPublicStaticVar);
}
}
// STATIC Inner class
static class InnerClassStatic {
// Following is allowed in Static InnerClass but not in non-static inner class.
static String StaticInnerClassStaticVar = "StaticInnerClassStaticVar";
String InnerClassStaticInstanceVar = "InnerClassStaticInstanceVar";
public void innerClassStaticMethod() {
System.out.println("Inside InnerClassStatic.");
}
public void innerClassStaticAccessOuterClassVars() {
// Following will not work. Beacuse InnerClassStatic is like static member inside OuterClass
// and static members/methods can never access instance members.
//System.out.println(outerClassPrivateInstanceVar);
//System.out.println(outerClassPublicInstanceVar);
System.out.println(outerClassPublicStaticVar);
}
}
// Local Inner Class inside Instance method.
void outerClassInstanceMethodForLocalClass() {
// Local Inner Classes cannot be private, protected, public and static. Because inside method
// these keywords have no sense. We don't use these words inside methods.
class LocalClassInInstanceMethod {
// Static members are not allowed in Local Inner classes defined inside instance method.
// Following will not work.
//static String LocalClassInInstanceMethodStaticVar = "LocalClassInInstanceMethodStaticVar";
void localClassInInstanceMethod_instanceMethod() {
System.out.println("Inside localClassInInstanceMethod_instanceMethod.");
}
}
LocalClassInInstanceMethod localClassInInstanceMethodObj = new LocalClassInInstanceMethod();
localClassInInstanceMethodObj.localClassInInstanceMethod_instanceMethod();
}
// Local Inner Class inside Static method.
static void outerClassStaticMethodForLocalClass() {
// Local Inner Classes cannot be private, protected, public and static. Because inside method
// these keywords have no sense. We don't use these words inside methods.
class LocalClassinStaticMethod {
// Static members are not allowed in Local Inner classes defined inside static method.
// Following will not work.
//static String LocalClassinStaticMethodStaticVar = "LocalClassinStaticMethodStaticVar";
void LocalClassinStaticMethod_instanceMethod() {
System.out.println("Inside LocalClassinStaticMethod_instanceMethod.");
}
}
LocalClassinStaticMethod locallassinStaticMethodObj = new LocalClassinStaticMethod();
locallassinStaticMethodObj.LocalClassinStaticMethod_instanceMethod();
}
// Anonymous Inner classes
interface InnerInterface {
void InnerInterfaceMethod();
}
// Anonymous inner class object defined at class member level.
InnerInterface anonymousClassObj = new InnerInterface() {
public void InnerInterfaceMethod() {
System.out.println("Inside InnerInterfaceMethod.");
}
};
void callAnonymousObjectMethod() {
anonymousClassObj.InnerInterfaceMethod();
}
// Anonymous inner class inside instance method.
//void anonymousInnerClassInsideMethod() {
OuterClass anonymousInnerClassInsideMethod() {
OuterClass anon = new OuterClass() {
void outerClassInstanceMethod() {
System.out.println("Inside anonymousInnerClassInsideMethod.");
}
};
//anon.outerClassInstanceMethod();
return anon;
}
}
public class InnerClassesTest {
public static void main(String[] args) {
OuterClass outerClassObj = new OuterClass();
// Call to instance method using instance variable.
outerClassObj.outerClassInstanceMethod();
// Call to static method using instance variable. In Ruby there is something called self instead of static. And
// self.outerClassStaticMethod in Ruby is actually a singleton method defined on a "class object (OuterClass)" and in Ruby class
// itself is an object. And singleton methods can be called by only object on which it is defined, in this case OuterClass object.
// Hence in Ruby object created by a class cannot access class method. Following is invalid in Ruby.
outerClassObj.outerClassStaticMethod();
// NON-STATIC INNER CLASSES
// Creating InnerClass object.
System.out.println("====NON-STATIC INNER CLASSES====");
OuterClass.InnerClass innerClassObj = new OuterClass().new InnerClass();
innerClassObj.innerClassMethod();
// Following will not work. outerClassPublicInstanceVar is not defined in InnerClass.
//System.out.println(innerClassObj.outerClassPublicInstanceVar);
innerClassObj.innerClassAccessOuterClassVars();
// STATIC INNER CLASSES.
// Creating Static Innerclass object. You will be using Class not object.
System.out.println("====STATIC INNER CLASSES====");
OuterClass.InnerClassStatic innerClassStaticObj = new OuterClass.InnerClassStatic();
// You cannot use OuterClass object to use StaticInnerClass object. This is in contrast with creating InnerClass(non-static) object.
// Also normally an object can access static class fields. But Following will not work.
//OuterClass.InnerClassStatic innerClassStaticObj2 = outerClassObj.InnerClassStatic();
// Access static inner class' static member using static inner class' object.
System.out.println(innerClassStaticObj.StaticInnerClassStaticVar);
// Access static inner class' static member using Classes directly.
System.out.println(OuterClass.InnerClassStatic.StaticInnerClassStaticVar);
// Access static inner class' instance member using static inner class' object.
System.out.println(innerClassStaticObj.InnerClassStaticInstanceVar);
// LOCAL INNER CLASSES
System.out.println("====LOCAL INNER CLASSES====");
outerClassObj.outerClassInstanceMethodForLocalClass();
outerClassObj.outerClassStaticMethodForLocalClass();
OuterClass.outerClassStaticMethodForLocalClass();
// ANONYMOUS INNER CLASSES
System.out.println("====ANONYMOUS INNER CLASSES====");
outerClassObj.callAnonymousObjectMethod();
// Following works because, interface InnerInterface is visible in this class as well due to default access.
// If inner interface in made private then following will not work. Only inner interfaces can be made private.
outerClassObj.anonymousClassObj.InnerInterfaceMethod();
OuterClass anonymousObj = new OuterClass() {
void outerClassInstanceMethod() {
System.out.println("inside anonymousObjOfOuterClassSubClass Method.");
}
void anotherMethod() {
System.out.println("Inside anotherMethod.");
}
};
anonymousObj.outerClassInstanceMethod();
// Following will not work. Because anonymousObj is refering to actually subclass of OuterClass (in memory). But it is declared as OuterClass.
// That means, anonymousObj is actually a "Subclass of OuterClass" but its type is declared as OuterClass. Hence polymorphism will come in.
// anonymousObj being declared as superclass variable will only be able to execute methods defined in super class not in sub class. Hence
// following will not work.
//anonymousObj.anotherMethod();
//Following works provided relevant lines are un-commented inside anonymousInnerClassInsideMethod instance method.
//outerClassObj.anonymousInnerClassInsideMethod();
OuterClass out = outerClassObj.anonymousInnerClassInsideMethod();
out.outerClassInstanceMethod();
}
}
Compile and Output:
$ java -version java version "1.8.0_66" Java(TM) SE Runtime Environment (build 1.8.0_66-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode) $ $ javac InnerClassesTest.java $ java InnerClassesTest Inside outerClassInstanceMethod. Inside outerClassStaticMethod. ====NON-STATIC INNER CLASSES==== Inside innerClassMethod. outerClassPrivateInstanceVar outerClassPublicInstanceVar outerClassPublicStaticVar ====STATIC INNER CLASSES==== StaticInnerClassStaticVar StaticInnerClassStaticVar InnerClassStaticInstanceVar ====LOCAL INNER CLASSES==== Inside localClassInInstanceMethod_instanceMethod. Inside LocalClassinStaticMethod_instanceMethod. Inside LocalClassinStaticMethod_instanceMethod. ====ANONYMOUS INNER CLASSES==== Inside InnerInterfaceMethod. Inside InnerInterfaceMethod. inside anonymousObjOfOuterClassSubClass Method. Inside anonymousInnerClassInsideMethod.
Subscribe to:
Comments (Atom)