CoreJava学習ノート5


javaの修饰符
staticは静的であり、属性、方法、およびコードブロックを修飾することができる。
1,static修飾属性(インスタンス変数)(クラス変数)は、この属性がクラス名・属性名来を用いてアクセスできます。この属性はこのクラスのクラス変数となり、このクラスのオブジェクトに共有されます。この属性はすべて共有されています。(共通のクラス変数は対象とは関係なく、クラスのみに関係があります)。
例:
public class Test{
	private static int testnum;
/*
          static     ,         
*/
	……
}
クラスローディングのプロセスは、クラス自体がファイル(バイトコードファイルがクラスの情報を保存しています)に保存されています。javaは、クラスのファイル(バイトコードファイル)をI/Oストリームを介してJVM(java仮想マシン)に読み込んでいます。このプロセスをクラスのローディングといいます。JVM(java仮想マシン)は、クラスパス(CLASSPATH)を介してロードするバイトコードファイルを探しています。
クラス変数は、ロード時に自動的に初期化され、初期化規則とインスタンス変数は同じです。
クラスのインスタンス変数は、オブジェクトを作成する際に初期化され、クラス変数はクラスローディング時に作成され、初期化されます。クラスローディングのプロセスは一回だけです。クラス変数は作成され、初期化されます。
2,static修飾方法(静的方法)は、この方法を全体の種類で共有する方法として、
クラス名.メソッド名アクセス。
例:
public class Test{
	private static int num;
	public int testage;
	public static int test(){
			num++;
		Test t=new Test();
		t.age
		/*
			              ,         
			        
		*/
	}
}
注意:
1)static修飾の方法は、直接的に(組み合わせによってアクセスすることができる)クラスの非静的(static)メンバ(方法と属性を含む)にアクセスすることができず、本クラスの非静的(static)方法は、本クラスの静的メンバ(方法と属性を含む)にアクセスすることができ、静的方法を呼び出すことができる。静的な方法は慎重に使うべきです。静的方法ではthisのキーワードが現れません。
2)静的方法に関するカバー問題:
<1>親類では静的な方法であり、サブクラスでは非静的な方法としてカバーすることができず、カバールールに適合している前提で、父子類では、父子類では静的な方法でふとん類でも静的な方法でもカバーできますが、多状態ではありません。(オブジェクトを使って静的な方法を呼び出す場合は、コンパイルを呼び出す場合のタイプの静的な方法です。)
<2>父子類では、静的方法は静的方法でしかカバーできず、父子類では非静的方法でしかカバーできない。
Javaにおけるmainメソッドはstaticに書かれていなければなりません。クラスローディング時にオブジェクトを作成することができません。静的な方法はオブジェクトを介して呼び出すことができませんので、mainメソッドは静的です。クラスでロードすると、メーンメソッドの入り口でプログラムを実行できます。
注意:組み合わせは、方法で必要なオブジェクトを作成し、このオブジェクトで任意の必要なオブジェクトのコンテンツを呼び出し、静的にのみアクセスできる制約を受けないようにする必要があります。
例:
public class Test{
	private int a;
	public static void main(String[] args){
	}
	public static void test(){
		Test t=new Test();
		 t.a=20;
    }
}
3,staticは初期コードブロックを修飾し、この初期コードブロックは静的な初期コードブロックと呼ばれ、このコードブロックはクラスローディング時に一回だけ実行されます。静的な初期コードブロックでクラスを初期化することができる。
初期化コードブロックはクラス内のコードブロックであり、方法の実現ではない。クラスの属性を初期化するために使用できます。
例:
public class Test{
	private static int num;//         
	static{                //        
   		num=12;
}
}
動的初期コードブロックは、クラスに記述された「{}」であり、このコードブロックは、オブジェクト初期化属性を生成するときに実行される。このコードブロックはダイナミック初期コードブロックといいます。
例:
public class Test{
	private static int num;//         
	{//        
   		num=12;
}
}
クラスはいつロードされますか?
オブジェクトを作成(作成)するには、このクラスをロードします。
クラス中の静的な方法を呼び出したり、静的な属性にアクセスしたりしても、この静的な方法が本当にあるクラスをロードします。
親オブジェクトを作成する場合は、サブクラスの静的方法を呼び出していないか、または静的属性にアクセスしていないと、サブクラスはロードされません。
サブクラスのオブジェクトを作成するには、親クラスを先に読み込む必要があります。
クラスローディングの遅延ローディングの原則は、必ずローディングしなければならない時にのみロードされます。
シングルモードは、このクラスのオブジェクトを生成する例です。
例:
public class TestSingleton{
public static void main(String[]args){
)
)
class Xiao{
/*
怠け者式の実現、この方法の実現のシングルモードはこれまでしか使っていません。
クラスのオブジェクトの場合のみ対象が発生しますが、マルチスレッドの場合は問題が発生します。
*/
private static Xiao x=null;
	private Xiao(){}
	public static Xiao newInstance(){
		if (x==null) x=new Xiao();
		return x;
	}
}
class Wife{
	  /*
        ,                ,  
                      ,     
         
*/
	private static Wife w=new Wife();
	private Wife(){}//      
	public static Wife newInstance(){
		return w;
	}
} 
final修飾子は、変数、方法、クラスを修飾することができます。
1,final修飾変数(局所変数とインスタンス変数を含む)
finalで修飾された変数は定数となり(定数名は大文字とする)、一度値が変更されないと(初期化時に直接値を付与でき、構造方法ではそのために値を割り当てることができます。この2つの方法の中で1つしか選択できません。定数は初期値を与えないことができます。)、定数はデフォルトの初期値がなく、final修飾子はstatic修飾子と一緒に使用されます。
例:
public class Test{
	private static final int NUM=2;
// final       
	……
}
2,finalの飾り方、finalの飾り方は布団類ではカバーできません。保持方法の安定はカバーできません。
例:
public class Test{
	public final int test(){
		......
	}
}
3,final修飾類、final修飾の類は引き継がれません。final類の中の方法も全部finalです。
例:
public final class Test{
	public final int test(){
		......
	}
}
注意:finalは、構造方法を修飾することができません。父類には定数属性があり、サブクラスでは定数属性を使用すると親類のクラスローディングは行われません。静的定数は値が確定すれば、このクラスをローディングしません。確定できないとその定数が存在するクラスがロードされます。
モードを変更しない場合、オブジェクトは属性を作成すると変更されません。finalで属性(弱不変モード)を修飾します。
不変パターンの典型的な表現:java.lang.Stringクラスでは、不変パターンは、オブジェクトの共有を実現することができる(オブジェクトのインスタンスで複数のオブジェクトへの参照を割り当てることができる)。
池化の思想は、共有したいデータを池に置く(省スペース、共有データ)
String類は「  ”のワード面の値でオブジェクトを作成します。Stringクラスでは、ワード面の値で作成すると、Javaメソッド空間のストリップ空間で検索します。ストリップ内の文字列のアドレスに戻り、このアドレスを対象に参照します。ストリップ内に文字列のオブジェクトを作成することはなく、そのアドレス付けの購入先の参照に戻ります。他の文字面の値でオブジェクトを作成する場合は、上記のように繰り返します。道のり
ヒープ空間にString類のオブジェクトを作成するには、上記のようなプロセスはありません。
例:
public class TestString{
	public static void main(String[] args){
		String str1=”abc”;
		String str2=”abc”;
		String str3=new String(“abc”);
		System.out.println(str1==str2);
		System.out.println(str1==str3);
	}
}
   :
true
false//ヒープ空間で作成されたSrtingはシリアルから引用されません。
Stringクラスのintern()メソッドは、ヒープ空間で作成されたString類のオブジェクトの文字列と、ストリッププールの中の文字列とを照合し、同じ列があると、このストリングのストリップのアドレスに戻ります。
不変パターンは対象を修正し、追加操作はかなり面倒で、多くの中間ゴミの対象が発生します。作成と廃棄の資源の支出はかなり大きいです。
String類は文字列接続時の効率が低いので、生成したオブジェクトの属性は変更できません。文字列を接続する時は新しいオブジェクトを作成するしかありません。
多くの文字列接続に対しては、StringBuffer類またはStringBuiderを使用して、この類のオブジェクトを使って文字列接続を行う場合、余分な中間オブジェクトが生成されず、効率を最適化します。
例:
上の文字列接続はSteringBufferを使うと以下のようになります。
public class TestString{
	public static void main(String[] args){
		String str=“a”+“b”+”c”;
/*
    String  str    1   String  “ab”
                      
         */
		StringBuffer str=new StringBuffeter();
        //  StringBuffer          
str.append(“a”);
str.append(“b”);
str.append(“c”);
String strs=str.toString();

	}
}
abstract(抽象)修飾子は、クラスと方法を修飾することができます。
1,abstract修飾類は、このクラスを抽象的なクラスにします。このクラスは対象インスタンスを生成できなくなります。対象として声明を引用するタイプです。つまり、コンパイル時タイプです。抽象類は一種の半製品に相当します。サブクラスの継承とその中の抽象的な方法をカバーする必要があります。
例:
public abstract class Test{
	public int test(){
        ……
}
……….
}
2,abstract修飾方法は、この方法を抽象的な方法に変え、声明(定義)だけが実現されておらず、実現部分は「;」で代替される。
例:
public abstract class Test{
	public abstract int test();//             
}
abstract修飾方法は、サブクラスのカバー(実現)を求める方法であり、呼び出し時には、サブクラスのカバー(実現)をマルチモードで呼び出す方法であり、抽象的な方法は、そのサブクラスで実現しなければならない。
  • 注意:
  • )抽象的な方法があるクラスは抽象的なクラスに違いないですが、抽象的なクラスは必ずしも抽象的な方法ではなく、全部具体的な方法でもいいです。abstract修飾子はクラスを修飾する時にクラス名の前に置かなければなりません。
  • )親類は抽象類であり、抽象的な方法があり、子類は父類を継承し、父類の抽象的な方法をすべて実現しました。子類は対象を作成する実例を持つ能力があります。さもなければ、子類も抽象類でなければなりません。抽象類には構成方法があります。子類のオブジェクトを構成する時に呼び出す親類(抽象類)です。の構造方法。
  • 修飾子の組み合わせの使用問題
    finalとabstract、prvateとabstract、staticとabstract、これらは一緒に置くことができない修饰符です。マルチモードで起動することができます。以上の修飾子は修飾方法の時期にはサブクラスをカバーできません。finalはカバーできません。prvateはサブクラスを継承できないので、カバーできません。staticはカバーできますが、呼び出し時にコンパイルを呼び出すことができます。父親タイプの方法です。父タイプの方法は抽象的な方です。また、呼び出しもできませんので、修饰符を一绪に置くことはできません。
    抽象的な方法はある標準を表しています。標準を定義し、機能を定義し、サブクラスで機能を実現します。
    方法は時間が経つと、どのように実現されるか、あるいはサブクラスを意図的に実現させて、ある種の標準を定義します。この方法は抽象と定義されます。(abstract)
    テンプレートモード
    abstractで標準を制定し、標準を実現するために、制定された標準がテンプレートであり、テンプレートの標準に従って実現され、テンプレートを継承し、テンプレートの中の対応する機能を実現する方法である。