Причина находится в принципе разработки, тот Java не позволяет множественное наследование. Проблема со множественным наследованием может быть проиллюстрирована следующим примером:
public class A {
public method x() {...}
}
public class B {
public method x() {...}
}
public class C extends A, B { ... }
Теперь, что происходит, если Вы называете C.x ()? Будет A.x () или B.x () выполнен? Каждый язык со множественным наследованием должен решить эту проблему.
Интерфейсы позволяют в Java своего рода ограниченное множественное наследование. Для предотвращения проблемы выше им не позволяют иметь методы. Если мы смотрим на ту же проблему с интерфейсами и статическими методами:
public interface A {
public static method x() {...}
}
public interface B {
public static method x() {...}
}
public class C implements A, B { ... }
Та же проблема здесь, что происходит, если Вы называете C.x ()?
read_some и write_some могут возвращаться, как только был передан хотя бы один байт. Таким образом, вам нужно выполнить цикл, если вы хотите убедиться, что вы получили все данные - но это может быть то, что вам нужно.
Бесплатные функции являются оболочками для read_some и write_some и имеют разные условия завершения в зависимости от перегрузки. Обычно они ждут, пока буфер будет полностью передан (или возникнет ошибка, или в некоторых перегрузках возникнет явное условие завершения)