charやStringをクラスやメソッドの戻り値として先頭で宣言できますが、変数の定義と同じ形なので違いが分かりにくいと思います。
char a; や int b; は変数の定義です。この変数はabs(b)のように関数に入れることはできますが、b.abs()のようなメソッドは持てません。
一方、String c; は文字列クラスのインスタンスcの宣言です。このインスタンスは、c.length()のように(戻り値は整数型の文字数)メソッドを使えます。もちろん使えるメソッドは決まっていますが、自作のクラスなら自分の作ったメソッドは自由に使えるわけです。その際に変数やメソッドの参照範囲が大切になります。
私がJavaの勉強をし始めた頃、String型のインスタンスの内容比較がうまくいかないので長い間苦労したことがあります。結局、
Java
1 if(strKekka == "OK"){
と書いていたのが間違いで、
Java
1 if(strKekka.equals("OK")){
と書くのが正しかったのでした。
この際にString型のインスタンスは変数ではないと痛切に実感したのでした。
String型の文字列は1文字ずつがどこにどのように格納されているのかもクラス任せと考えなければなりません。C言語の文字列のポインタ操作とは無縁の世界です。
要するに、String型のような与えられたオブジェクトの操作と、自作のクラスのインスタンス操作と同等に捉えて、クラスを組み合わせて処理していくのがJavaプログラミングの特徴です。その際の戻り値やスコープが自分で決められないとブログラムが働きません。様々な宣言を沢山のサンプルコードをみて、意味をくみ取りましょう。