Win a copy of The Little Book of Impediments (e-book only) this week in the Agile and Other Processes forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

Inheritance with extended classes

 
Jason Attin
Ranch Hand
Posts: 232
2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi guys, I'm having some problems understanding this code.

A. The code will print 10 and 40 if // 3 is commented.
B. The code will print 40 if // 2 and // 3 are commented.
C. The code will not compile because of // 1.
D. The code will compile if the line marked // 2 is commented out.
E. None of these.


Apparently the correct answer is B. Now, I would have thought that C could access i (so c.i was valid) because C is A anyway and even if B's i is private, surely C inherits A's i. But apparently if we want to call i from C we have to do and what I don't get is the reason for the cast.
ANy idea?
thanks
 
Henry Wong
author
Marshal
Pie
Posts: 22113
88
C++ Chrome Eclipse IDE Firefox Browser Java jQuery Linux VI Editor Windows
 
praveen kumaar
Ranch Hand
Posts: 242
4
Chrome Java Oracle
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi! jason,"i" is a private variable in class B so you have not inherit it during sub-classing B and by doing like this-
((A) C).i you are actually casting in accordance for the heirarchy,compiler interpret it as--->((A)((B) C)).i,this is all about how java compiler is intelligent.remember in java a class can only have a single parent for ex-
Class HeirarchySub-classingIS-A Relationship
Class Asub-class of ObjectA is-a Object,A's only parent is object
Class Bsub-class of AB is a A but A is-a Object =>B is a Object,B's only parent is A
Class Csub-class of BC is a B but B is-a A =>C is a A & A is a Object => C is a object,C's only parent is B

the only parent of C is B,B is A,A is Object.But due to is-a relationship and polymorphism,that holds according to the class heirarchy,we can cast class C to A which is up in the heirarchy(acc. to C).and one more thing you have quote-
Jason Attin wrote:surely C inherits A's i
this is incorrect,c only inherits its super class B member(though it cannot inherit B's private member acc. to the inheritance rule).
so the only reason for casting is a multiple-level inheritance(Acc.to the class heirarchy).

Hope this will help!

kind regards,
Praveen.
 
Jason Attin
Ranch Hand
Posts: 232
2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Please QuoteYourSources.

Right, sorry it's Glenn, Mitchell. OCAJP Oracle Certified Associate Java SE 8 Programmer Practice Exams (Kindle Location 4738). Enthuware. Kindle Edition.


OK I understand now thanks.
A couple of other points though:
1)Usually if you go up the hierarchy, say you want to access from a subclass variables or methods of a superclass you don't need to cast because if A is superclass of B then B is A. But you need to cast if you go down the hierarchy, correct?
2)In a slightly different scenario, say we have again superclass A, subclass B extending A and subclass C extending B, and let's say that all the variables are all public, then all the members in A are also inherited by B and by C, so C effectively has members in A. Correct?
 
Henry Wong
author
Marshal
Pie
Posts: 22113
88
C++ Chrome Eclipse IDE Firefox Browser Java jQuery Linux VI Editor Windows
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Jason Attin wrote:
1)Usually if you go up the hierarchy, say you want to access from a subclass variables or methods of a superclass you don't need to cast because if A is superclass of B then B is A. But you need to cast if you go down the hierarchy, correct?


For variables (including ones that hides other variables), that is correct. If you have an A reference that is pointing to a B instance, then you need to cast in order to use B instance variables.

For instance methods (that correctly overrides), casting is not necessary. Instance methods are polymorphic, meaning the overridden method is called.

Henry
 
praveen kumaar
Ranch Hand
Posts: 242
4
Chrome Java Oracle
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
remember this rule while casting-
--->(class you are casting) IS-A (class to which you are casting)=>if this statement holds cast is permissible or other wise you will get a ClassCastException,you can always check for it by using instanceof operator before casting to avoid this kind of error.

Jason Attin wrote:1)Usually if you go up the hierarchy, say you want to access from a subclass variables or methods of a superclass you don't need to cast because if A is superclass of B then B is A. But you need to cast if you go down the hierarchy, correct?
i am not pretty sure what you intended to say but it is not possible to perform a cast down the heirarchy.for-ex-
suppose their is  class A,B is a sub-class of A and C is a sub-class of B.
Jason Attin wrote:2)In a slightly different scenario, say we have again superclass A, subclass B extending A and subclass C extending B, and let's say that all the variables are all public, then all the members in A are also inherited by B and by C, so C effectively has members in A. Correct?

Yes all the members of A are inherited in C indirectly and due to the fact that all members are publically accessible,indirectly means via multiple-level-inheritance(i.e.A to B,B to C) but not multiple inheritance.

Kind Regards,
Praveen.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic