Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #8750
| From | Lew <lewbloch@gmail.com> |
|---|---|
| Newsgroups | comp.lang.java.programmer |
| Subject | Re: Java casting question |
| Date | 2011-10-12 19:05 -0700 |
| Organization | http://groups.google.com |
| 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> |
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 | Next — Previous in thread | Next in thread | Find similar
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