JAVA static、final、interface、abstract

5280 ワード

1、staticは「グローバル」または「静的」を意味し、メンバー変数とメンバーメソッドを修飾するために使用され、静的staticコードブロックを形成することもできる.staticによって修飾されたメンバー変数とメンバーメソッドは、クラスの任意のオブジェクトとは独立しています.共通メモリ領域を使用します.
publicで修飾されたstaticメンバー変数とメンバーメソッドの本質はグローバル変数とグローバルメソッドであり、クラスのオブジェクトを宣言するとstatic変数のコピーは生成されず、クラスのすべてのインスタンスが同じstatic変数を共有します.外部から静的メソッドを呼び出す場合は、「クラス名.メソッド名」を使用するか、「オブジェクト名.メソッド名」を使用します.つまり、静的メソッドを呼び出すと、オブジェクトを作成する必要がなくなります.
static変数の前にprivate修飾があり、この変数はクラスの静的コードブロック、またはクラスの他の静的メンバーメソッドで使用できる(もちろん非静的メンバーメソッドでも使用できる)ことを示しますが、他のクラスではクラス名で直接参照できないことが重要です.privateはアクセス権の制限であることを理解する必要があります
staticはインスタンス化せずに使用できることを示しており、理解しやすくなっています.staticの前に他のアクセス権キーを付ける効果も同様です.
 
static修飾のメンバー変数とメンバーメソッドは慣習的に静的変数と静的メソッドと呼ばれ、直接クラス名でアクセスすることができ、アクセス構文は:クラス名.静的メソッド名(パラメータリスト...)类名静的変数名
スタティック修飾されたコードブロックで静的コードブロックを表し、Java仮想マシン(JVM)がクラスをロードすると、そのコードブロックが実行されます(非常に役に立ちます、ほほほ).
 
1、static変数は静的かどうかのクラスメンバー変数によって分類され、2つに分けることができる.1つはstaticによって修飾された変数で、静的変数またはクラス変数と呼ばれる.もう1つはstaticによって修飾されていない変数で、インスタンス変数と呼ばれます.両者の違いは、静的変数がメモリに1つしかコピーされていない(メモリを節約する)場合、JVMは静的メモリを1回だけ割り当て、クラスをロードする過程で静的変数のメモリ割り当てを完了し、クラス名で直接アクセス(便利)することができ、もちろんオブジェクトでアクセスすることもできます(ただし、これは推奨されません).インスタンス変数の場合、インスタンスを作成しないと、インスタンス変数にメモリが1回割り当てられます.インスタンス変数はメモリに複数のコピーがあり、互いに影響しません(柔軟です).
 
2、静的メソッド静的メソッドはクラス名で直接呼び出すことができ、任意のインスタンスも呼び出すことができるため、静的メソッドではthisとsuperキーワードを使用することはできず、所属クラスのインスタンス変数とインスタンスメソッド(staticを持たないメンバー変数とメンバーメソッド)に直接アクセスすることはできず、所属クラスの静的メンバー変数とメンバーメソッドにのみアクセスできます.インスタンスメンバーが特定のオブジェクトに関連付けられているためです.これは理解して、その中の道理を理解して、记忆ではありません!!!staticメソッドは任意のインスタンスとは独立しているため、抽象的なabstractではなく、staticメソッドを実装する必要があります.
 
3、staticコードブロックstaticコードブロックは静的コードブロックとも呼ばれ、クラスの中でクラスメンバーとは独立したstatic文ブロックであり、複数あってもよいし、位置は自由に置くことができ、それはいかなる方法の体内にもなく、JVMがクラスをロードする時にこれらの静的コードブロックを実行し、staticコードブロックが複数ある場合、JVMはクラスに表示される順に順次実行され、各コードブロックは1回のみ実行されます.
2、finalキーワードはクラス、メソッド、変数を修飾するために使用できます.それぞれ違う.
A、修飾クラス(class).1、このクラスは継承できません.2、クラス内のメソッドは上書きされないので、デフォルトはfinalです.3、用途:クラスを設計する際、そのクラスにサブクラスが必要でなく、拡張される必要がなく、クラスの実現の詳細が変更されることが許されない場合、finalクラスに設計する
B、修飾方法(method)1、この方法は継承できますが、上書きできません.2、用途:1つのクラスがこの方法を上書きすることを許さない場合、finalで3、利点を修飾する:そのサブクラスを継承してこの方法の意義と実現を修正することを防止することができる;より効率的に、コンパイラは呼び出しfianalメソッドに遭遇して埋め込みメカニズムに移行し、実行効率を向上させる.4、注意:親クラスのprivateメンバーメソッドはクラスで上書きできないため、privateメソッドのデフォルトはfinal型です(コンパイルされたclassファイルを表示できます)
C、修飾変数(variable)1、finalで修飾すると定数になります.静的変数、インスタンス変数、ローカル変数の3つが含まれます.2、特徴:まず宣言して、初値をあげないで、これをfinal空白と言います.ただし、使用前に初期化する必要があります.いったん付与されると、これ以上変更されません.
D、修飾パラメータ(arguments)1、finalでパラメータを修飾する場合は、そのパラメータを読み取ることができますが、変更することはできません.
A、抽象クラス(abstract class)1、抽象メソッド(abstract method):メソッド体を含まないメソッドで、そのサブクラスを継承して需要に応じて実現し、abstractで修飾しなければならない.さらに、このメソッドはサブクラスに表示される必要があるため、publicまたはprotectedしか追加できません.2、抽象クラス:少なくとも1つの抽象メソッドを含むクラス(非抽象メソッドを含むことができる).abstractで修飾しなければなりません.3、特徴:抽象クラスはインスタンス化できない(つまりnewオブジェクトができない);抽象メソッドを含むクラスは抽象クラスとして宣言する必要があります.1つのクラスは、抽象クラス内のすべてのメソッドを実装してこそインスタンス化されます.そうしないと、抽象クラスです.
B、インターフェース(interface)1、インターフェース定義:抽象メソッドと定数値の集合(すべてのメソッドは抽象メソッド).これは特殊な抽象クラスです(xxx.classファイルが生成され、コンパイラはinterfaceキーワードの前にabstractを自動的に追加します).2、特徴:a、インタフェースの定数のデフォルトはpublic static finalで修飾されています(何も書かないと、コンパイラが自動的に書きます).b、インタフェースの方法のデフォルトはpublic abstractで修飾されています(何も書かないと、コンパイラが自動的に書きます).c、extendsで既存のインタフェースを継承できます.d、implementsで1つ以上のインタフェース内のすべてのメソッド(このインタフェースの親インタフェース内のメソッドを含む)を実装できるクラス.e、1つの抽象クラスであり、implementsがインタフェースの一部のメソッドf、1つのクラスを実現することができ、extendsが1つの親クラスと同時にimplementsが複数のインタフェースを実現することができるが、extendsキーワードはimplementsキーワードの前になければならない.
3、Java抽象クラスと抽象方法:
<span style="font-size:18px;">package OOTest;
public abstract class Human {//    
	private final int time=++count;//     
	private static int count;//   
	//    
	private String name;//    :    ,  getter setter  ,     setter   
	private int age;
	private String sex;
	
	//getter&&setter
	public String getName(){
		return this.name;
	}
	public void setName(String name){
		//    :      ,       
		if(name.length()==0){
			System.out.println("      ");
		}
		else if(this.isWrongName(name)){//        
			System.out.println("    ,      ");
		}
		else{
			this.name=name;
		}
	}
	private boolean isWrongName(String name){//        (  )
		char[] ch=name.toCharArray();
			for(int i=0;i<ch.length;i++){
				try{
					int s=Integer.parseInt(String.valueOf(ch[i]));
					s++;// 
					return true;
				}
				catch(Exception e){
					continue;//            
				}
				}
		return false;//     
	}
	public int getAge(){
		return this.age;
	}
	public void setAge(int age){
		if(age<=0){
			System.out.println("    ");
		}
		else{
			this.age=age;
		}
	}
	public String getSex(){
		return this.sex;
	}
	public void setSex(String sex){
		if(sex.length()>1||sex.length()==0){
			System.out.println("      ");
		}
		else if(sex.toCharArray()[0]==' '||sex.toCharArray()[0]==' '){
			this.sex=sex;
		}
		else{
			System.out.println("      ");
		}
	}

	//  
	public Human(){//  
		this(" 1  ",25," ");
	}
	public Human(String name,int age,String sex){//  
		this.setName(name);
		this.setAge(age);
		this.setSex(sex);
	}

	//    
	public abstract void speak();//  
	public abstract void work();//  
	public abstract void eat();
	
	//        
	public int getHumanClassUseTimes(){
		return this.time;
	}
}
</span>