MCP
MCP

Reputation: 117

How can I get the data fields from subclass not superclass?

I have a super class named TestSuper

public class TestSuper {
  int a = 0;
}

and I have 2 sub classes named TestSub and TestSub2 that extend TestSuper

public class TestSub extends TestSuper{
   int a=1;
}

public class TestSub2 extends TestSuper{
   int a=2;
}

in my main class i created a method that takes in a type TestSuper and returns the a value of it and in the main i display it on the console

public class Main {
public static void main(String[] args){

    System.out.println(test(new TestSub())+" "+test(new TestSub2()));
}
public static int test(TestSuper b){
    return b.a;
}
}

but the output is "0 0" instead of "1 2", what do I do?

Upvotes: 4

Views: 1276

Answers (4)

Mustafa Çil
Mustafa Çil

Reputation: 776

When you call test method like this:

test(new TestSub())+" "+test(new TestSub2())

You use upcasting. Upcasting seperates interface and implementation for an object. But for seperating interface and implementation and achieving true implementation in polymorphism, you must use polymorphic structures. The instance variables aren't polymorphic. Because of this, actually you call a variable which is in TestSuper class.

Only instance methods are polymorphic.

Upvotes: 0

GhostCat
GhostCat

Reputation: 140407

You can look into the theory behind this, and then do the only reasonable thing -forget about writing such kind of code.

In good OOP you consider your fields to be part of your "secret" internal implementation. You don't use fields of sub classes in the super class context. Period.

You are even very conservative about making a field protected in the superclass and to use that in subclasses.

Upvotes: 0

Peter Lawrey
Peter Lawrey

Reputation: 533432

You need to cast the reference so say which one you want.

public static int test(TestSuper b){
    return b instanceof TestSub ? ((TestSub) b).a :
           b instanceof TestSub2 ? ((TestSub2) b).a :
           b.a;
}

If this seems needlessly complicated, it is. You should use polymorphism instead.

public class TestSuper {
    int a = 0;
    public int getA() { return a; }
}

public class TestSub extends TestSuper {
    int a = 1;
    public int getA() { return a; }
}

public class TestSub2 extends TestSuper {
    int a = 2;
    public int getA() { return a; }
}

public static int test(TestSuper b) {
    return b.getA();
}

Upvotes: 3

TmTron
TmTron

Reputation: 19371

First understand the difference between hiding and overriding: https://docs.oracle.com/javase/tutorial/java/IandI/override.html

Then create a getter method in the base-class which you can override in the subclass.

Upvotes: 0

Related Questions