2015-06-16 5 views
0

Я не знаю, как этот способ передачи объекта в качестве параметра называется. Поэтому я не знал, что искать на сайте. Мои извинения, если это было задано раньше, и я уверен, что это так.Что означает эта часть Java?

Может кто-нибудь сказать мне, какая разница между этими двумя способами передачи объекта в качестве параметра? И почему я не могу переопределить свойства, а также методы в первую очередь?

myObject.doSomethingWithOtherObject((new OtherObject() { 
    // why can't I override properties here? 
    public String toString() { 
    return "I am the other object."; 
    } 
    ... 
})); 
myOtherObject = new OtherObject(); 
myObject.doSomethingWithOtherObject(myOtherObject); 

Тогда у меня есть второй вопрос, но, возможно, отвечая на первый вопрос будет также ответить на этот вопрос. Почему это не работает:

public class OtherObject { 
    public OtherObject (String str) { 
     super(); 
    } 
} 

myObject.doSomethingWithOtherObject((new OtherObject("string arg") { 
    public void overrideSomething() { 

    } 
})); 

Строка «строка агд» не передается в конструктор, как я ожидал бы. Вместо этого жалуется на то, что не найдет конструктор OtherObject(). Почему Java не распознается Я пытаюсь отправить аргумент конструктору?

Спасибо за чтение!

+3

* «Тогда у меня есть второй вопрос» * ** ** Один вопрос на вопрос, пожалуйста. В частности, см. [Тур] и [помощь], в частности [* Как задать хороший вопрос?] (/ Help/how-to-ask) –

+0

Прочитайте, что такое анонимные классы .... – Garry

+1

Лучше всего если вы разделите свои 2 вопроса как отдельные вопросы. Таким образом, ответы всегда будут касаться текущего вопроса. Как и другие, создание класса внутри другого класса (как и вы здесь) называется анонимным внутренним классом. Если вы все еще изучаете основы, я лучше всего это сделаю немного позже, пока вы не почувствуете себя комфортно. – miva2

ответ

3

, когда вы делаете new OtherObject, а затем открываете фигурные скобки { ..., вы создаете новый (анонимный) класс. а не новый объект уже определенного класса OtherObject. посмотрите на анонимные классы Java, чтобы лучше понять

1

Первый называется анонимным классом. Это означает, что вы фактически создаете подкласс без имени, чтобы переопределить что-то.

Во втором компилятор жалуется, что у вас нет конструктора. Как описано в ответе на ваш первый вопрос, вы на самом деле являетесь подклассом здесь, то есть вам нужно определить конструктор, если он вам нужен.

+0

Второй пример имеет конструктор ... 'public OtherObject (String str)' –

0

Вызов метода с новым объектом, за которым следуют фигурные скобки, походит на расширение этого класса, и он называется анонимным классом в java.

myObject.doSomethingWithOtherObject(new OtherObject() { 
    public String toString() { 
    return "I am the other object."; 
    } 

}); 

Причина, по которой вы не можете переопределить свойства, вероятно, связана с их модификаторами доступа. Для переопределения члена класса он должен иметь модификатор доступа, по меньшей мере, защищенный.

public class OtherObject { 
    protected String name; 
} 

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

1

Ваш код:

myObject.doSomethingWithOtherObject((new OtherObject() { 
    // why can't I override properties here? 
    public String toString() { 
    return "I am the other object."; 
    } 
... 
})); 

примерно эквивалентно:

class OtherSubObject extends OtherObject { 
    public String toString() { 
    return "I am the other object."; 
    } 
} 

... 
myObject.doSomethingWithOtherObject(new OtherSubObject()); 

за исключением того, что подкласс OtherObject был создан без имени (то есть анонимно) и поэтому не может быть передан в любую точку остальное.

Ваш код:

myOtherObject = new OtherObject(); 
myObject.doSomethingWithOtherObject(myOtherObject); 

не создает новый класс, он просто передает экземпляр OtherObject в качестве параметра.

1

Прежде всего я хотел бы подтвердить, что мои предыдущие ораторы говорили:

Когда вы добавляете фигурные скобки для инициализации объекта вы будете создавать анонимный подтип класса, для которого вы можете переопределить методы, как вам сделал это в вашем примере.

Но теперь на ваш вопрос-ответ: почему я не могу переопределить свойства здесь?

Вы можете: путем добавления еще одной пары фигурных скобок, которая будет создавать конструктор для анонимного типа, например:

public class OtherObject { 
    protected String name; 

    public OtherObject(String name) { 
     super(); 
     this.name = name; 
    } 

    public String toString() { 
     return getClass() + ": " + name; 
    } 

    public static void main(String[] args) { 
     OtherObject o1 = new OtherObject("bar"); 
     OtherObject o2 = new OtherObject("bar") { // will call parent constructor first -> name = "bar" 
      { 
       // constructor for the anonymous type 
       name = "foo"; // overwrite the name 
      }   
     }; 

     System.out.println(o1); // prints "class OtherObject: bar" 
     System.out.println(o2); // prints "class OtherObject$1: foo" 
    } 
} 
Смежные вопросы