Java всегда будет пытаться использовать наиболее подходящую версию доступного метода (см. JLS §15.12.2 ).
Object
, char[]
и Integer
могут принимать null
в качестве действительного значения. Поэтому все 3 версии применимы, поэтому Java придется найти наиболее конкретный.
Поскольку Object
является супертипом char[]
, версия массива более специфична, чем Object
-версия. Поэтому, если существуют только эти два метода, будет выбрана версия char[]
.
Если доступны версии char[]
и Integer
, то оба они более специфичны, чем Object
, но ни один более конкретный, чем другой, поэтому Java не может решить, какой из них вызывать. В этом случае вам придется явно указать, какой из них вы хотите вызвать, отвечая аргумент соответствующему типу.
Обратите внимание, что на практике эта проблема встречается гораздо реже, чем можно было бы подумать. Причиной этого является то, что это происходит только тогда, когда вы явно вызываете метод с null
или с переменной довольно неспецифического типа (например, Object
).
Напротив , следующий вызов будет совершенно однозначным:
char[] x = null;
doSomething(x);
Хотя вы все еще передаете значение null
, Java точно знает, какой метод вызывать, поскольку он учитывает тип переменной .
Поток имеет ссылочный график, таким образом, объект, который отправляется дважды, не даст два объекта на другом конце, Вы только получите тот. И отправка того же объекта дважды отдельно приведет Вам тот же пример дважды (каждый с теми же данными - который является тем, что Вы видите).
Видят сброс () метод, если Вы хотите сбросить график.
Max корректен, но можно также использовать:
public void writeUnshared(Object obj);
См. комментарий ниже для протеста
То, что Вы, вероятно, хотите:
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
List same = new ArrayList();
same.add(0);
oos.writeObject(same);
oos.flush(); // flush the stream here
same.clear();
same.add(1);
oos.writeObject(same);
Иначе тот же объект будет сброшен дважды, когда поток будет закрыт, или его буфер заканчивается.
Просто к вашему сведению, когда Вы десериализовываете объекты в, скажем, o1
и o2
, o1 != o2
.