Javaベースのタンプのシリーズ7:テキストとJavaコードのブロックの実行順序を読みます

ディレクトリ

記事のこのシリーズは、GitHubのの「Javaのインタビューガイド」の倉庫に私に手配します、よりエキサイティングなコンテンツが私の倉庫のビューにアクセスしてください

https://github.com/h2pl/Java-Tutorial

そのトラブルのスポットスターカザフスタン下のように

記事は、最初に私の個人ブログに登場しました。

www.how2playlife.com

この記事では、ネットワークから、この記事の一部は、この記事の主題に明確かつ徹底的に話す、と私は技術のブログのコンテンツの優れた統合をたくさん考えている「のJava Foundationシリーズボーエンを強化する」Javaテクノロジのいんちきは、[の]マイクロチャンネル公共番号ですその侵害は、作者に連絡してください場合は、良いブログの記事の数を挙げています。
、全体のJavaテクノロジー・システムのより完全な理解は、自分自身を形成するためにこのブログのシリーズは、高度にエントリから、ステップバイステップでは、Javaの基本を学習する方法をお見せし、実際の戦闘を開始します、その後、各ポイントの原理を実現するためにJavaの知識を理解します知的枠組み。あなたの学習成果を要約し、テストするために、このシリーズは面接の質問に対応するすべての知識ポイントを提供し、答えを提案します。

あなたがこの記事のシリーズのための提案を持っている、またはご質問がある場合は、あなたが公共の川や湖[] Javaテクノロジ作者に連絡するために多くの懸念もすることができます、あなたはこのブログシリーズの作成・改訂に参加することを歓迎しています。

Javaでのコンストラクタ

コンストラクタのプロフィール

コンストラクタは、新しいオブジェクトクラスを初期化するために使用される方法の特殊なタイプです。Javaは、  各クラスは、デフォルトコンストラクタを持っている、そしてそれは、クラス名、およびノーリターン型と同じ名前を持つ必要があります。デフォルトのコンストラクタの戻り値の型は、オブジェクト自体の一種であり、施工方法は、静的、最終的に、同期、抽象的でネイティブ変更することはできません。

ヒント:コンストラクタは、それは静的な修正と意味がない、新しいオブジェクトを初期化するために、コンストラクタは、サブクラスによって継承されないので、最終的かつ抽象的な意味で何も変更することはできません。複数のスレッドが同時に同じオブジェクトの同じメモリアドレスを作成しませんので、同期の変更を使用する必要はありません。

次のようにコンストラクタの構文は次のとおりです。

CLASS_NAMEクラス
{ 
    パブリックCLASS_NAME(){} //引数なしのデフォルトコンストラクタ
    パブリックciass_name([paramList]){ } // コンストラクタ定義
    ... 
    //クラスの本体
}

一つのクラスでは、同じ名前がクラスのコンストラクタです。各クラスは、建設方法を複数有していてもよい、しかし別の方法パラメータを含むそれぞれが必要とします。

例のコンストラクタ

例 1

例えば、メインのコンストラクタ引数コンストラクタ引数のコンストラクタメソッドと2種類の方法があります。

MyClassのクラス公開
{ 
    プライベートint型のM; //プライベート変数定義
    のMyClass()
    { 
        引数なしコンストラクタ//定義
        M = 0; 
    } 
    MyCiass(整数mは)
    { 
        //コンストラクタはを参照して定義され
        this.m = M。
    } 
}

これは、それぞれ、2つのコンストラクタを定義し、コンストラクタ引数、引数のないコンストラクタを持っています。メソッドをオーバーロードされたクラス内の別の方法と同じ名前の複数のパラメータを定義します。両方の名前が同じクラス名のコンストラクタです、MyClassのです。インスタンス化されたときにクラスが設定を初期化するためにさまざまな方法を呼び出すことができます。

注意:クラスのコンストラクタを定義する必要はありません。コンストラクタクラスのいずれかで定義されていない場合は、Javaは自動的にクラスのデフォルトコンストラクタを生成します。デフォルトコンストラクタは、任意のパラメータが含まれていない、とメソッド本体は空です。クラスが明示的に一つ以上のコンストラクタを定義する場合、Javaのデフォルトコンストラクタが使用できなくなりました。

例 2

異なる条件下で異なる初期動作を持つオブジェクトクラスを作成するには、この時間は、あなたは、クラスに複数のコンストラクタを作成する必要があります。ここでは例の方法の使用を示すように構成されています。

(1)まず、以下のように、従業員の労働者のクラスコードが2つのコンストラクタを定義します。

ワーカークラス公開
{ 
    公共の文字列名; //名前
    のプライベートint型の年齢; //年齢
    //コンストラクタのパラメータで定義された
    パブリック・ワーカー(文字列名)
    { 
        this.name =名; 
    } 
    二つのパラメータで定義された//コンストラクタ
    公共労働者(文字列名、int型年齢)
    { 
        this.name =名; 
        this.age =年齢; 
    } 
    パブリック文字列のtoString()
    { 
        リターン「私はスタッフに新しいですみなさん、こんにちは、私の名前!」+名+ "今年歳「+年齢+」「; 
    } 
}

ワーカー2つの属性が名前の属性が変更されていないクラスで定義されています。パラメータと2つのパラメータを持つコンストラクタを定義し、そのプロパティを初期化します。最後に、クラスのtoString()メソッドの定義では、新入社員の紹介文を返します。

ヒント:Objectクラスは、文字列の文字列型を返すこのメソッドを、継承する各クラスを作成するための特別な方法であるのtoString()メソッドを持っています。クラスはこの方法では、呼び出し元のクラスオブジェクトに定義されている場合は、そのオブジェクトが自動的に呼び出しますのtoString()メソッドは文字列を返し、その後することができ、「するSystem.out.println(オブジェクト名)」を使用しますプリントアウトの文字列の内容を返します。

(2)異なる施工方法ワーカーオブジェクトをインスタンス化し、次のようにオブジェクト属性コードが初期化するmain()メソッドと呼ばれるプログラムへの入り口としてのクラス()メソッドの主TestWorkerを作成します。

TestWorkerクラス公開
{ 
    パブリック静的無効メイン(文字列[] args)
    { 
        コンストラクタパラメータとするSystem.out.println(「----------- ---------- - 「); 
        コンストラクタ// 1つの引数、スタッフの性別や年齢クラス属性値を変更しないで呼び出さ
        ワーカーworker1 =新しいワーカー(」張強「); 
        System.out.printlnは(worker1); 
        のSystem.out。 println(「-----------コンストラクタは------------二つの引数を取る」); 
        //二つのパラメータ、スタッフとのコンストラクタを呼び出しますセックスクラス属性値そのまま
        ワーカーworker2 =新しいワーカー( "李"、25); 
        System.out.printlnは(worker2); 
    } 
}

上記のコードでは、2つの異なる作業員オブジェクトを作成する:一つは張強の従業員オブジェクトの名前であり、自分の名前が25高齢李、従業員オブジェクトです。最初のワーカーオブジェクトworker1については、年齢プロパティの値が指定されていないと、プログラムはデフォルト値0を使用します。第worker2ワーカーオブジェクトに対して、それぞれ、その割り当てられた名前は、value属性の値と年齢属性、したがってプログラムのパラメータの値は、ワーカークラス属性値を送信に再割り当てされます。

以下のようにファイル名を指定して実行TestWorkerクラスは、結果を出力します。

-----------つのパラメータを持つコンストラクタ----------- 
みなさん、こんにちは!私は、新しい従業員、私の名前は今年0歳の張強、ですよ。
二つのパラメータを持つコンストラクタ------------ ----------- 
みなさん、こんにちは!私は新入社員です、私の名前は、今年25歳の李は、あります。

あなたが一緒に初期化オブジェクトのメンバーが完了して、オブジェクトを作成するとき、コンストラクタの引数を呼び出すことにより、オブジェクトの初期化コードを簡素化します。

詳細でJavaを構築するいくつかの方法

一般的なコンストラクタ

クラス名やメソッド名と同じ

なし戻り値の型ません

サブクラスは、親クラスのコンストラクタを継承することはできません

静的、最終的に、抽象的修正をすることができません。(そこに最終的なものであるとキルト静的クラスの継承を変更することはできません、抽象修正は抽象クラスである、抽象クラスは新しいものではありませんこれは、インスタンス化することはできません)

クラスはインスタンス化が、外部のオブジェクトをインスタンス化することはできません内部でprivate修飾子とすることができる、それが存在することができる(注意します!)

public class A{
    int i=0;
    public A(){
        i=2;
    }
    public A(int i){
        this.i=i;
    }
}

デフォルトコンストラクタ

ノーコンストラクタた場合は、コンパイル時にシステムが自動的に引数なしでデフォルトコンストラクタを追加します

暗黙のデフォルトコンストラクタ

    public A(){}

デフォルトコンストラクタ表示

    public A(){
    System.out.print("显示的默认构造方法")
    }

オーバーロードコンストラクタ

たとえば、元のクラスのコンストラクタは、パラメータであり、新しいオブジェクトは現在三つのパラメータである、そして我々はオーバーロードコンストラクタ必要があります

クラスは複数のコンストラクタを持っているとき、あなたはこの文で他のコンストラクタを呼び出すことができ、繰り返しのアクションがあるかもしれません。

public class A{
    private int age;
    private String name;
    public A(int age,String name){
        this.age=age;
        this.name=name;
    }
    public A(int age){
        this(age,"无名氏");//调用 A(int age,String name)构造方法
    }
    public A(){
        this(1);//调用 A(int age)构造方法
    }
    public void setName(String name) {this.name=name;}
    public String getName() {return name;}
    public void setAge(int age) {this.age=age;}
    public int getAge() {return age;}
}

A a=new A(20,"周一");
A b=new A(20);
A c=new A();
String name = a.getName();
String name1 = b.getName();
int age = c.getAge();
System.out.println(name);
System.out.println(name1);
System.out.println(age);

Javaのサブクラスのコンストラクタメソッド呼び出しの親クラスのコンストラクタ

まず、親クラスのコンストラクタは間違いなくサブクラスに継承されていません。

サブクラスのコンストラクタは、親クラスのコンストラクタに焦点を当てるだろう呼び出す:サブクラスのコンストラクタは、親クラスとにかくコンストラクタを呼び出します。

サブクラスのコンストラクタは、引数なしで親クラスのコンストラクタを呼び出すのいずれか(なしコンストラクタ親クラスを含む。引数なしのデフォルトのコンストラクタに)、または親クラスがコンストラクタのパラメータを持って呼び出します。サブクラスのコンストラクタは、引数なしで親クラスのコンストラクタを呼び出すと、通常はデフォルトでは単語を書くために、書くことではありません(スーパー)であり、最初の文のコンストラクタを配置します。親クラスのコンストラクタを呼び出すために、サブクラスのコンストラクタは、パラメータを持っている場合は、そのサブクラスのコンストラクタは、親クラスのコンストラクタを呼び出すために、コンストラクタの最初の文を置くために、スーパー(パラメータ)を使用する必要があります。

サブクラスを作成するときに引数なしのコンストラクタは、引数なしで親クラスのコンストラクタを呼び出す必要があります。システムは自動的に親クラスが引数なしのコンストラクタを持っていないでしょうのでいない場合、システムは文句を言うでしょう:引数なしで親クラスのコンストラクタのない定義が存在しないこと。

サブクラスのコンストラクタ引数のコンストラクタメソッドがある場合、その後、2例があるでしょう。
最初:サブクラスのコンストラクタには、引数が同じでないと、あなたが引数なしで親クラスのデフォルトコンストラクタを呼び出し、そのサブクラスのコンストラクタに意味し、スーパー書いていません。

第二は:サブクラスのコンストラクタのスーパー(パラメータ)がある場合、親クラスのコンストラクタ呼び出しのパラメータを持つことで、見つけるシステムは、一貫した親パラメータ(パラメータの数、およびそれを可能にするための一種)、もしコンストラクタのパラメータを持つことはありませんない場合は、同じエラーがなります。

しかし、この出会いや過負荷にコンストラクタこの問題として、コンストラクタパラメータのコンストラクタは、独自の値を定義するには、何のパラメータを複数のパラメータを呼び出すことはできないことも可能です。

Javaでコードのブロックについて

{}コードブロックと呼ばれる囲まれたJavaでは、コード・ブロックは、次の4つに分かれています。

I.はじめに

1.通常のコードブロック:

メソッド本体のクラスメソッド

コードの構成ブロック2

ビルディングブロックが作成されたオブジェクトを使用すると、クラスのコンストラクタでの優先実行を作成するたびに呼び出されるときに呼び出されます。

3.コードの静的ブロック。

一度だけ、コードスニペットでラップ{}静的。ビルディングブロックに優先して実行されるコードの静的ブロック。

4.シンクブロックは:

、マルチスレッド環境で読み出したコードのブロックを包ん同期(){}を使用し、共有データへの書き込み動作をそれ以外の場合は、データの矛盾につながる、相互に排他的である必要があります。同期コードブロックは、プロセス中に記述する必要があります。

II。類似性および静的コードブロックとコードブロック構造の違い

同じポイント:すべてのJVMロードクラスのコンストラクタの後、実行する前に、クラスは、一般的に静的変数の複数の定義されてもよいが、コードブロックの番号が割り当てられます。

異なる点:コードブロック非静的前に、コードの静的ブロック。コードの静的ブロックは、まず新しいなく、実行後に一度だけ実行されます。むしろ静的コードブロックよりも、それぞれの新しい時間のために一度実行されます。

使用したJavaコード・ブロック

部分ブロック

位置:ローカル(内部メソッド)の位置

役割:ライフサイクル定義された変数、初期のリリースは、メモリを節約します

コール:あなたは彼らが呼ぶ方法で実行した場合

 public class 局部代码块 {
@Test
public void test (){
    B b = new B();
    b.go();
}
}
class B {
    B(){}
    public void go() {
        //方法中的局部代码块,一般进行一次性地调用,调用完立刻释放空间,避免在接下来的调用过程中占用栈空间
        //因为栈空间内存是有限的,方法调用可能会会生成很多局部变量导致栈内存不足。
        //使用局部代码块可以避免这样的情况发生。
        {
            int i = 1;
            ArrayList<Integer> list = new ArrayList<>();
            while (i < 1000) {
                list.add(i ++);
            }
            for (Integer j : list) {
                System.out.println(j);
            }
            System.out.println("gogogo");
        }
        System.out.println("hello");
    }
}

コンフィギュレーションコードブロック

場所:Locationクラスのメンバーは、クラスメソッド以外の場所であります

効果:抽出されたコンフィギュレーション方法の複数の部分が共通の、一般的な構成のコード・ブロック

コール:あなたはコンストラクタを呼び出すたびに、コンストラクタは自動的に新しいオブジェクトがオブジェクト初期化されるたびに呼び出され、実装、を優先させて頂きます

class A{
    int i = 1;
    int initValue;//成员变量的初始化交给代码块来完成
    {
        //代码块的作用体现于此:在调用构造方法之前,用某段代码对成员变量进行初始化。
        //而不是在构造方法调用时再进行。一般用于将构造方法的相同部分提取出来。
        //
        for (int i = 0;i < 100;i ++) {
            initValue += i;
        }
    }
    {
        System.out.println(initValue);
        System.out.println(i);//此时会打印1
        int i = 2;//代码块里的变量和成员变量不冲突,但会优先使用代码块的变量
        System.out.println(i);//此时打印2
        //System.out.println(j);//提示非法向后引用,因为此时j的的初始化还没开始。
        //
    }
    {
        System.out.println("代码块运行");
    }
    int j = 2;
    {
        System.out.println(j);
        System.out.println(i);//代码块中的变量运行后自动释放,不会影响代码块之外的代码
    }
    A(){
        System.out.println("构造方法运行");
    }
}
public class 构造代码块 {
    @Test
    public void test() {
        A a = new A();
    }
}

静的コードブロック

 位置:类成员位置,用static修饰的代码块

 作用:对类进行一些初始化  只加载一次,当new多个对象时,只有第一次会调用静态代码块,因为,静态代码块                  是属于类的,所有对象共享一份

 调用: new 一个对象时自动调用

 public class 静态代码块 {

@Test
public void test() {
    C c1 = new C();
    C c2 = new C();
    //结果,静态代码块只会调用一次,类的所有对象共享该代码块
    //一般用于类的全局信息初始化
    //静态代码块调用
    //代码块调用
    //构造方法调用
    //代码块调用
    //构造方法调用
}

}
class C{
    C(){
        System.out.println("构造方法调用");
    }
    {
        System.out.println("代码块调用");
    }
    static {
        System.out.println("静态代码块调用");
    }
}

(継承を含む)は、Javaコードブロックコンストラクタ実行シーケンス

これは、この例を見てみましょう、その質問に答えるために、一般的な面接の質問です。

三つのカテゴリーの合計:A、B、C
、AはBの親であり、C出力のみ非継承として

クラスA:

public class A {

static {
    Log.i("HIDETAG", "A静态代码块");
}

private static C c = new C("A静态成员");
private  C c1 = new C("A成员");

{
    Log.i("HIDETAG", "A代码块");
}

static {
    Log.i("HIDETAG", "A静态代码块2");
}

public A() {
    Log.i("HIDETAG", "A构造方法");
}

}

クラスB:

public class B extends A {

private static C c1 = new C("B静态成员");

{
    Log.i("HIDETAG", "B代码块");
}

private C c = new C("B成员");

static {
    Log.i("HIDETAG", "B静态代码块2");
}

static {
    Log.i("HIDETAG", "B静态代码块");
}

public B() {
    Log.i("HIDETAG", "B构造方法");

}

}

クラスC:

public class C {

public C(String str) {
    Log.i("HIDETAG", str + "构造方法");
}
}

文を実行:新しいBを();

出力:

 I/HIDETAG: A静态代码块
 I/HIDETAG: A静态成员构造方法
 I/HIDETAG: A静态代码块2
 I/HIDETAG: B静态成员构造方法
 I/HIDETAG: B静态代码块2
 I/HIDETAG: B静态代码块
 I/HIDETAG: A成员构造方法
 I/HIDETAG: A代码块
 I/HIDETAG: A构造方法
 I/HIDETAG: B代码块
 I/HIDETAG: B成员构造方法
 I/HIDETAG: B构造方法

それは結論付けました。

执行顺序依次为:
父类的静态成员和代码块
子类静态成员和代码块
父类成员初始化和代码快
父类构造方法
子类成员初始化和代码块
子类构造方法

注:コードブロックとメンバーの初期化の同じレベルを見つけることができます上から下へのコードの順序で実行されています

このデモの上読んだ後、のは、以下のこの質問を見て、あなたはまだセットを行うかどうかを確認してみましょうか?

以下のコードは、実行要件の順序を参照してください。

class A {
    public A() {
        System.out.println("1A类的构造方法");
    }
    {
        System.out.println("2A类的构造快");
    }
    static {
        System.out.println("3A类的静态块");
    }
}
 
public class B extends A {
    public B() {
        System.out.println("4B类的构造方法");
    }
    {
        System.out.println("5B类的构造快");
    }
    static {
        System.out.println("6B类的静态块");
    }
    public static void main(String[] args) {
        System.out.println("7");
        new B();
        new B();
        System.out.println("8");
    }
}

実行結果の順序:367215421548

なぜ?

まず第一に、私たちは以下の5点ということを知っている必要があります。

コンストラクタは毎回ビルディングブロックと新しいが実行されます。
コンテンツのビルディングブロックは、コンストラクタの前に実行されます。
静的ブロックが非プライマリタイプ、およびクラスはビルディングブロックをロードされるコンストラクタの前に実行され、切断は一度だけ行われます。
静的ブロックは、内部メインメインクラス(パブリッククラス)の前に行われます。
継承は、サブクラスをインスタンス化され、第一のサブクラスのコンストラクタを呼び出す次に、親クラス・オブジェクトをもたらす、親クラスのコンストラクタを実行します。
だから、理由はメインクラスBのタイトルは、継承し、それはAをロードし、その最初の3の最初の実装されます。

私たちは前に実行される点4 6 7から知っているので、最初の3文は367です。

インスタンス化されたBの後に二回、毎回彼の最初のインスタンス化された親クラスA、次にBの例、及び1,2,5-ポイントに従って、2154の順序を知っています。

最後の実行8

だから、注文は367 215 421 548です

参考記事

https://blog.csdn.net/likunkun__/article/details/83066062
https://www.jianshu.com/p/6877aae403f7
https://www.jianshu.com/p/49e45af288ea
ます。https://blog.csdn .NET / du_du1 /記事/詳細/ 91383128
http://c.biancheng.net/view/976.html
https://blog.csdn.net/evilcry2012/article/details/7949​​9786
ます。https://www.jb51。ネット/記事/ 129990.htm

マイクロチャンネル公衆数

Javaテクノロジの川や湖

SSM、SpringBoot:あなたは私のリアルタイム更新記事とドライの共有に注力したい場合は、川や湖の私の公共の数に焦点を当てることができます] [Javaの技術のJava、テクニカルエンジニアアリステーション、著者黄斜めには、Javaの関連技術に焦点を当てMySQL、分散、ミドルウェア、クラスタ、Linuxでは、ネットワーク、マルチスレッド、時には完全なJavaスタックの開発に取り組ん学習経験を共有するポイントドッカー、ELKだけでなく、ドライ商品や技術を話します!

Javaのエンジニアは、学習リソースを必要と:一部のJavaエンジニアの一般的な学習リソースを、世間の注目の数は、背景がキーワードの返信の「Java」何のルーチンを無料で入手することがありません。

私の公共の番号

個人公開番号:黄斜め

学び続ける、SpringBoot、MySQLの、分散、ミドルウェア、サービス、だけでなく、投資銀行業務のポイントを理解し、時折話すポイントアルゴリズムとコンピュータの理論的根拠:著者はマスター985、JAVAのバックエンドテクノロジ・スタックに特化したアリゴールドのドレスJAVAエンジニアであり、書き込みは、生涯学習の力を信じて!

プログラマ3T技術学習リソース:リソースまくる技術を学ぶいくつかのプログラマは、世間の注目の数は、背景がキーワード返信「データ」は何のルーチンを無料で入手することはできません。

おすすめ

転載: www.cnblogs.com/AliCoder/p/11600918.html