0

I think I'm misunderstanding something, and if so, I need help..

Let's say I have the following two classes:

public abstract class Abstraction() {
   protected int number = 0;
   public void printNumber() {
       System.out.println(this.number);
       System.out.println(getNumber());
   }
   public int getNumber() {
       return this.number();
   }
}

public class Reality extends Abstraction {
   int number = 1;
   public Reality() {
       this.printNumber();
   }
}

// some other class
new Reality();

What should the output be? I'm getting 0, 0 (the code here is a bit more complicated but still the same issue). How can I get the output to be 1,1?

StackOverflowed
  • 5,854
  • 9
  • 55
  • 119

4 Answers4

9

The number in the Reality class doesn't overwrite the number in the Abstraction class. Therefore, the Abstraction class still sees his own number value as 0.

A solution would be:

public class Reality extends Abstraction {
   public Reality() {
       number = 1;
       this.printNumber();
   }
}

Because your number in Abstraction is protected, you can access it in your Reality class.


Another example is a parameter in a method:

private int number;

public void myMethod(int number){
    number = 2;
}

Your private int number field won't be set, instead, the parameter number will be set as 2.


Finally, a word on the this and super keywords, see an edit of your classes:

public abstract class Abstraction() {
   protected int number = 0;
   public void printNumber() {
       System.out.println(this.number);
       System.out.println(getNumber());
   }
   public int getNumber() {
       return this.number();
   }
}

public class Reality extends Abstraction {
   int number = 1;
   public Reality() {
       System.out.println(number); //Will print 1
       System.out.println(this.number); //Will print 1
       System.out.println(super.number); //Will print 0
   }
}
nhaarman
  • 98,571
  • 55
  • 246
  • 278
1

You are creating a local variable in Reality but the printNumber() method refers to the the member variable which is still 0.

If you don't create a local varible but you use the field instead like this:

number = 1;

it will be OK.

If you have problems understanding fields you can always refer to the official documentation which can be found here: Oracle java docs

Adam Arold
  • 29,285
  • 22
  • 112
  • 207
1

You could create setter methods in the abstract class:

public void setNumber(int value) {
this.number = value;
}

They way you are trying to achieve this won't work, since the variable doesn't overrite that of the super class.

I hope this helps!

Luke Taylor
  • 9,481
  • 13
  • 41
  • 73
-1
public class Reality extends Abstraction {
    int number = 1;
    public Reality() {
        this.printNumber();
    }
}

Above the code number is an instance variable Of class Reality and calling method of super class. In super class printNumber() method will print value of number 0 because it is initialized with 0.

If you want to get subclass variable value of number, you have to pass value as method argument as follows:

public Reality(int num) {
    this.printNumber();
}
ataulm
  • 15,195
  • 7
  • 50
  • 92
Mohammod Hossain
  • 4,134
  • 2
  • 26
  • 37