Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #8750

Re: Java casting question

Path csiph.com!x330-a1.tempe.blueboxinc.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!news.glorb.com!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
From Lew <lewbloch@gmail.com>
Newsgroups comp.lang.java.programmer
Subject Re: Java casting question
Date Wed, 12 Oct 2011 19:05:40 -0700 (PDT)
Organization http://groups.google.com
Lines 94
Message-ID <4447573.399.1318471540216.JavaMail.geo-discussion-forums@prfp13> (permalink)
References <c6d9d3ed-7892-40e0-ac9a-abb957b93241@e9g2000prg.googlegroups.com> <4e964097$0$281$14726298@news.sunsite.dk>
Reply-To comp.lang.java.programmer@googlegroups.com
NNTP-Posting-Host 67.218.107.62
Mime-Version 1.0
Content-Type text/plain; charset=ISO-8859-1
Content-Transfer-Encoding quoted-printable
X-Trace posting.google.com 1318471996 6332 127.0.0.1 (13 Oct 2011 02:13:16 GMT)
X-Complaints-To groups-abuse@google.com
NNTP-Posting-Date Thu, 13 Oct 2011 02:13:16 +0000 (UTC)
In-Reply-To <4e964097$0$281$14726298@news.sunsite.dk>
Complaints-To groups-abuse@google.com
Injection-Info glegroupsg2000goo.googlegroups.com; posting-host=67.218.107.62; posting-account=CP-lKQoAAAAGtB5diOuGlDQk0jIwmH0T
User-Agent G2/1.0
X-Google-Web-Client true
Xref x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:8750

Show key headers only | View raw


Arne Vajhøj wrote:
> Chad wrote:
>> Given the following...
>>
>> class X {
>>      void f1() { System.out.println("XXX");}
>>      void f2() { System.out.println("AAA"); f1();}
>> }
>>
>> class Y extends X {
>>      void f1() { System.out.println("YYY"); }
>> }
>>
>> class Z extends X {
>>      void f1() { System.out.println("ZZZ"); }
>> }
>> public class Main {
>>
>>      static void g(X a) {
>>          a.f2();
>>      }
>>      public static void main(String[] args) {
>>          X x = new X();
>>          Y y = new Y();
>>          Z z = new Z();
>>
>>          Object obj = new Y();
>>          ((X) obj).f2();
>>          g(z);
>>          //y = (Y)x;
>>      }
>>
>> }
>>
>> I get the following output..
>>
>> AAA
>> YYY
>> AAA
>> ZZZ
>>
>>
>> The question is about
>>
>> Object obj = new Y();
>> ((X) obj).f2();
>>
>>
>> How come YYY, but not XXX, gets printed on the second line? Both f1()
>> and f2() are in class X. So shouldn't f1() also have been casted [sic] to
>> (type) X?

The past participle of "to cast" is "cast", not "casted".

Casting from a type to a supertype is automatic, so the '(X)' cast in your code is superfluous.  Since 'Y' /is-an/ 'X',. your 'obj' of type 'Y' is already of type 'X'; no cast needed.  (In Java, casting to a parent type is "upcasting" or "widening", and comes for free.  Casting to an extending type is "downcasting" or "narrowing", and requires a cast operator.)

And no, you should not see the 'X' version of the output from your 'Y' instance, for the reason Arne explained:
> ((X) obj).f2(); 
> 
> and
> 
> ((Y) obj).f2();
> 
> should give the same output.
> 
> Virtual methods are stored in the object and it really
> does not matter what type the ref is declared to.

To put it another way, the object instance "knows" its own type.  You cannot call a method on the supertype that exists only in the subtype, but if you call a method that exists in the supertype that the instance's subtype overrides, you will get the overridden version.

This is a key to how object-oriented programming works.

Instances own their own members (methods and variables); the declared type only controls what the compiler is allowed to see, not how the method behaves.

Arne referred to "virtual methods".  That means the method call is dispatched to the instance, not literally called from the reference.  The instance uses its own version of the method - the parent type's if not overridden, the derived type's if it is overridden.

Read the Java Language Specification (JLS) for the gory details.

-- 
Lew

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Java casting question Chad <cdalten@gmail.com> - 2011-10-12 18:27 -0700
  Re: Java casting question Arne Vajhøj <arne@vajhoej.dk> - 2011-10-12 21:36 -0400
    Re: Java casting question Lew <lewbloch@gmail.com> - 2011-10-12 19:05 -0700
      Re: Java casting question Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-10-13 10:24 +0000
  Re: Java casting question Travers Naran <tnaran@gmail.com> - 2011-10-12 23:40 -0700

csiph-web