2013-05-04 5 views
3

Так это то, что я заметил в Java:Есть ли способ «сократить» объект Java до унаследованного класса?

Если я сделать класс:

class IntStorage 
{ 
    public int i; 

    public void setInt(int i) { this.i = i; } 
    public int getInt() { return i; } 
} 

и наследуют его, и хранить другие данные:

class IntAndStringStorage : IntStorage 
{ 
    public String s; 

    public void setString(String s) { this.s = s; } 
    public String getString() { return s; } 
} 

И я делаю это:

IntAndStringStorage IandSstorage = new IntAndStringStorage(); 
IandSstorage.setString("Test"); 
IntStorage Istorage = (IntStorage)IandSstorage; 
IntAndStorageStorage test = (IntAndStorageStorage)Istorage; 
System.out.println(test.getString()); 

Это вполне допустимо, хотя я передал его в унаследованный класс. Теперь я предполагаю, что информация все еще находится внутри объекта, поэтому я могу полностью передать ее унаследованному классу, не сохраняя старую информацию? Я не хочу, чтобы String хранения осталось в моем int класс хранения. Надеюсь, я поставил свой вопрос достаточно ясно! Заранее спасибо!

+5

'class IntAndStringStorage: IntStorage' Является ли это обозначением Java 8? Он не компилируется здесь. –

+1

hmmm просто ищет небольшое разъяснение, это означает, что когда вы бросаете объект, вы храните тот же объект? Также синтаксис наследования выглядит подозрительно, как C#. – Nomad101

+0

@ Nomad101 Я имею в виду, что объект все тот же объект. Он просто «замаскирован» как другой тип объекта. – user2348979

ответ

13

Casts не изменить объект на Java (в отличие от C#, приведение в Java не может быть перегружено). Таким образом, Casting изменяет только тип [compile-time], в котором объект выглядит как - это всегда полностью действителен, чтобы вернуть объект обратно к исходному типу.

К «вырубить» объект требует

  1. создать новый объект (возможно, из базового типа) с меньшей информацией или;
  2. имеют изменяемый объект, который выбрасывает (т. Е. Присваивает значения null/default) различным полям вырезания.

Кроме того, интерфейсы, как правило, представляют собой более удобный способ отображения определенных «взглядов», чем использование базовых типов.

+3

+1 очень хороший всеобъемлющий ответ. Я с нетерпением жду ваших ответов (и вашего имени;) –

2

Лучший способ сделать это в Java - создать новый IntStorage на основе значения int intAndDataStorage.

IntStorage intStorage = new IntStorage(intAndSstorage.getInt()); 

Предполагая, что вы добавили конструктор IntStorage (int) в IntStorage. Не будет остатков String.

+1

или добавления конструктора копирования;) – zeroflagL

Смежные вопросы