#1 от #2 отличаются только явной инициализацией переменной во втором случае. В первом - она инициализируется при создании объекта.
#3 и #4 сами по себе вполне корректны, но бессмыслены: ht, я так понимаю - рост кошки. Нет никакого смысла переносить эту переменную внутрь метода. Метода может и не быть, а рост, видимо, быть должен. Кроме того, если бы в классе Cat были еще какие-то методы (например int getHeight() ), то они не имели возможность получить доступ к этой переменной в последних случаях.
Вот еще пример:
public class Cat {
int height;
public int getHeight() {
return height; //Все ок переменную видно.
}
public void setHeight(int height) {
this.height = height; //Все ок переменную видно. this.height - эта переменная, обозначенная в классе.
}
public void setInternalVar(int var) {
int internalVar = var; //Все ок, но переменная скрыта внутри метода
}
public int getInternalVar() {
return internalVar; // !!Не компилируется - переменная internalVar не определена внутри класса.
}
}