Класс, который расширен от абстрактного класса до метода toString, не работает: / - PullRequest
0 голосов
/ 08 ноября 2018

Это основной демонстрационный класс

public class Ongoing{

  public static void main(String[] args){

    ExtendsAbstract josh = new ExtendsAbstract(5, "donkey");

    System.out.println(josh.toString());



  }

}

это класс, расширенный от абстрактного класса, метод tostring не будет работать.

public class ExtendsAbstract extends Abstract{

  private String t;

  public ExtendsAbstract(int y, String t){
    super(y);
    this.t = t;
  }

  public String getString(){
    return this.t;  
  }

  public int getInt(){
    return super.getInt();
  }

  public String toString(int y){

    return(/*super.toString(y)+*/"The integer is "+ y) ;

  }

}

Это абстрактный класс

public abstract class Abstract{

  private int y;


  public Abstract(int y){
    this.y = y;
  }

  public int getInt(){
    return y;
  }

  public String toString(int y){
    return("The integer is :"+y);
  }


}

Каждый раз, когда я пытаюсь получить доступ к методу toString из расширенного класса, он просто печатает то, что я считаю адресом памяти. Я даже не связывался с абстрактным классом, и он все еще делал это, кто-нибудь знает почему? Еще один вопрос об абстрактных классах, какие преимущества они приносят, это просто память? Поскольку вы не можете получить доступ к закрытым членам из него, не так ли это, как обычный класс, просто больше ограничений?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Метод toString () должен быть таким:

@Override
public String toString(){
     return("The integer is "+ y) ;
}

Аннотации "@Override" используются для проверки компилятором, не являются обязательными. Подробнее об аннотации здесь: https://docs.oracle.com/javase/7/docs/api/java/lang/Override.html

0 голосов
/ 08 ноября 2018

Скажем, у вас есть классы Dad и Son, которые определены следующим образом

public class OverLoadedToString {

    public static void main(String[] args) {
        Son son = new Son();
        son.test();
        son.test(90);
    }
}

class Dad {

    void test() {
        System.out.println("Dad - test");
    } 
}

class Son extends Dad {

    void test(int testTime) {
        System.out.println("Son - test1" + testTime);
    }
}

Класс Son расширяется Dad, поэтому test() без аргументов наследуется дляSon, так же, как у вашего ExtendsAbstract класса toString() без аргументов, наследующих класс Object (каждый класс в Java наследует класс Object).

Затем в классе Son я добавил новый метод test(int testTime), у которого есть аргумент, который отличает test() и test(int testTime), что называется методом overloading.В вашем ExtendsAbstract классе есть два toString метода: один наследуется без аргументов, а другой вы определили.

Теперь позвольте мне показать вам поток наследования

Object ---> Abstract ---> ExtendsAbstract

Объектный класс toString() методы печатает адрес памяти, мы можем переопределить его в наших классах, чтобы изменить его определение, вы можетевернуть любую строку, которую вы хотите.Но вы нигде не переопределили его ни в классе Abstract, ни в классе ExtendsAbstract, поэтому в обоих классах он напечатает адрес памяти.

Теперь в вашем классе Ongoing вы вызываете этот класс ObjecttoString() метод, который всегда печатает адрес памяти.Ваша путаница заключается в том, что вы думаете, что переопределили метод toString(), но на самом деле вы только что перегрузили его и вызываете неправильный метод для ожидаемого вывода.

Ссылка: Перегрузка и переопределение Java

0 голосов
/ 08 ноября 2018

В настоящее время происходит вызов функции toString () объекта, которая выглядит следующим образом: ClassName@HashCode.

Вы можете сделать это, чтобы напечатать: (Добавьте @Override в toString ()). Кроме того, нет необходимости вызывать josh.toString (). Вы можете просто позвонить System.out.println(josh); (произойдет волшебство, и оно вызовет toString) ..

public class ExtendsAbstract extends Abstract{

private String t;

public ExtendsAbstract(int y, String t){
 super(y);
 this.t = t;
}

 public String getString(){
   return this.t;  
}

public int getInt(){
return super.getInt();
}

@Override
public String toString(int y){

return(/*super.toString(y)+*/"The integer is "+ y) ;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...