Javaの中で常量を宣言してなぜstaticで修飾しますか?


Androidの開発をする時、Androidのソースコードを調べたら、簡単に見つけられます。その中で、声明の定数は以下のフォーマットです。
private static final String TAG = "FragmentActivity";
なぜstaticのキーワードを追加しますか?
以前は、静的変数で修飾された定数CONSTANT_を含むクラスAを定義することについて考えられていた。Aと直接finalで修飾する定数CONSTANT_B
public class A {
    public static final String CONSTANT_A = "Hello";
    public final String CONSTANT_B = "Hello";
}
複数のAのオブジェクトを作成する時、定数Aはメモリの中でコピー一つしかないです。Bは複数のコピーがあります。後者は明らかに私たちが見たくないものです。
今日はAndroid公式サイトを見ています。
http://developer.android.com/training/articles/perf-tips.html
原文:
Use Static Final For Contnts
Conser the follwing declaration at the top of a class:
static int intVal = 42;
static String strVal = "Hello, world!";
The compler generates a class initializer method、caled  、that is executed when the class is first used.The method stores the value 42 into  intVal、and extraces a reference from the classifile streing connt table for  strVal.When these values are referenced later on,they are accessed with field lookup.
クラスが初めて実行されるとき、コンパイラは、対応する変数intValに42の値を格納する初期化方法を生成し、同時に定数テーブルを介してstoralの参照を得る。これらの変数を後で参照すると、クエリー(テーブル)を行います。
We can improve maters with the「final」keyword:
finalを使って性能を向上させます。
static final int intVal = 42;
static final String strVal = "Hello, world!";
The classのlonger requires a   method、because the constants go in to static field initializers in the dex file.Code that referst to  intVal will use the integer value 42 directly、and accesses to  strVal will use a relatively inexpensive「string constant」instruction instead of a field lookup.
このように、定数はdexファイルの静的領域初期化部分に入り、初期化方法(変数に対して値を割り当てる)が必要ではなく、コードには42の定数値が直接使用され、straValもファイルチェックテーブルの代わりに、安価な「文字列定数」をオーバーヘッドする。
ノート: This optimization appies only to prmitive types and  String constants,not arbitrary reference types.Still,it's good practice to declare constants  static final whenever possible.
一番小さいヒントはこの右の線は基本的なデータタイプとString定数にしか効果がありません。他の引用タイプは含まれません。
Googleのこの文章を読み終わって、中の一部の名詞に対してまだ少し分かりませんが、static finalパートナーの別の原因が分かりました。