ファイナル、スタティック、ディス、スーパー

最終、静的、これ、スーパーキーワードの概要

最終キーワード

finalキーワードは、主に変数、メソッド、クラスの3か所で使用されます。

  1. 最終変数の場合、基本データ型の変数の場合、初期化後に値を変更することはできません。参照型の変数の場合、初期化後に別のオブジェクトを指すようにすることはできません。

  2. クラスがfinalで変更されると、クラスを継承できないことを示します。最終クラスのすべてのメンバーメソッドは、暗黙的に最終メソッドとして指定されます。

  3. 最終的な方法を使用する理由は2つあります。最初の理由は、継承されたクラスがその意味を変更しないようにメソッドをロックすることです。2番目の理由は効率です。初期のJava実装バージョンでは、finalメソッドはインライン呼び出しに変換されます。ただし、メソッドが大きすぎると、インライン呼び出しによるパフォーマンスの向上が見られない場合があります(現在のJavaバージョンでは、これらの最適化にfinalメソッドを使用する必要がなくなりました)。クラス内のすべてのプライベートメソッドは、暗黙的にfinalとして指定されます。

静的キーワード

staticキーワードには、主に次の4つの使用シナリオがあります。

  1. 変更されたメンバー変数とメンバーメソッド: staticによって変更されたメンバーは、単一のクラスのオブジェクトではなくクラスに属し、クラス内のすべてのオブジェクトによって共有されます。クラス名を介して呼び出すことが可能であり、推奨されます。staticによって宣言されたメンバー変数は静的メンバー変数であり、静的変数はJavaメモリ領域のメソッド領域に格納されます。通話形式:类名.静态变量名 类名.静态方法名()
  2. 静的コードブロック:静的コードブロックはクラスのメソッドの外部で定義され、静的コードブロックは非静的コードブロックの前に実行されます(静的コードブロック->非静的コードブロック->構築メソッド)。このクラスで作成されるオブジェクトの数に関係なく、静的コードブロックは1回だけ実行されます。
  3. 静的内部クラス(静的変更クラスが内部クラスのみを変更できる場合):静的内部クラスと非静的内部クラスの最大の違いは1つです。非静的内部クラスは、コンパイルの完了後に参照を暗黙的に保存します。それを作成した外部クラスですが、静的内部クラスは作成しません。この参照がないということは、次のことを意味します。1。その作成は、ペリフェラルクラスの作成に依存する必要はありません。2.外部クラスの非静的メンバー変数およびメソッドを使用することはできません。
  4. 静的ガイドパッケージ(クラス内の静的リソースのインポートに使用、1.5以降の新機能):形式は次のとおりです。import staticこれら2つのキーワードを一緒に使用して、クラス内の指定された静的リソースのインポートを指定できます。使用する必要はありません。クラスを呼び出すためのクラス名静的メンバーの場合、クラス内の静的メンバー変数とメンバーメソッドを直接使用できます。

このキーワード

thisキーワードは、クラスの現在のインスタンスを参照するために使用されます。例えば:

class Manager {
    
    
    Employees[] employees;
     
    void manageEmployees() {
    
    
        int totalEmp = this.employees.length;
        System.out.println("Total employees: " + totalEmp);
        this.report();
    }
     
    void report() {
    
     }
}

上記の例では、thisキーワードは次の2つの場所で使用されています。

  • this.employees.length:クラスManagerの現在のインスタンスの変数にアクセスします。
  • this.report():クラスManagerの現在のインスタンスのメソッドを呼び出します。

このキーワードはオプションです。つまり、上記の例でこのキーワードを使用しなくても同じように動作する場合です。ただし、このキーワードを使用すると、コードが読みやすく、理解しやすくなる場合があります。

スーパーキーワード

superキーワードは、サブクラスから親クラスの変数とメソッドにアクセスするために使用されます。例えば:

public class Super {
    
    
    protected int number;
     
    protected showNumber() {
    
    
        System.out.println("number = " + number);
    }
}
 
public class Sub extends Super {
    
    
    void bar() {
    
    
        super.number = 10;
        super.showNumber();
    }
}

上記の例では、サブクラスは親クラスのメンバー変数番号にアクセスし、その親クラスのスーパーshowNumber()メソッドを呼び出します。

これとスーパーを使用する際の注意点:

  • コンストラクターではsuper()、他のコンストラクターが親クラスを呼び出す場合、ステートメントはコンストラクターの最初の行である必要があります。そうでない場合、コンパイラーは文句を言います。さらに、これがこのクラスの他の構築メソッドを呼び出す場合は、最初の行にも配置する必要があります。
  • thisとsuperは静的メソッドでは使用できません。

簡単に説明してください:

staticによって変更されたメンバーは、単一のクラスのオブジェクトではなくクラスに属し、クラス内のすべてのオブジェクトによって共有されます。そして、これは、このクラスのオブジェクトを指す、このクラスのオブジェクトへの参照を表します。superは、親クラスオブジェクトを指す、親クラスのオブジェクトへの参照を表します。したがって、thisとsuperは、カテゴリ内のものです。オブジェクトの、および静的メソッドはクラスのカテゴリにあるものです

参照

  • https://www.codejava.net/java-core/the-java-language/java-keywords
  • https://blog.csdn.net/u013393958/article/details/79881037

静的キーワードの詳細な説明

staticキーワードには、主に次の4つの使用シナリオがあります。

  1. メンバー変数とメンバーメソッドを変更する
  2. 静的コードブロック
  3. 変更されたクラス(変更できるのは内部クラスのみ)
  4. 静的ガイドパッケージ(クラス内の静的リソースのインポートに使用、1.5以降の新機能)

メンバー変数とメンバーメソッドを変更する(一般的に使用される)

staticによって変更されたメンバーは、単一のクラスの特定のオブジェクトではなく、クラスに属し、クラス内のすべてのオブジェクトによって共有されます。クラス名を介して呼び出すことが可能であり、推奨されます。staticによって宣言されたメンバー変数は静的メンバー変数であり、静的変数はJavaメモリ領域のメソッド領域に格納されます。

メソッド領域は、Javaヒープと同様に、各スレッドによって共有されるメモリ領域であり、クラス情報、定数、静的変数、ジャストインタイムコンパイラによってコンパイルされたコードなどのデータを格納するために使用されます。仮想マシン。Java仮想マシン仕様では、メソッド領域がヒープの論理部分として記述されていますが、非ヒープ(非ヒープ)と呼ばれるエイリアスがあり、Javaヒープと区別することを目的としています。

HotSpot仮想マシンのメソッド領域は「永続世代」とも呼ばれ、本質的に2つは同等ではありません。これは、HotSpot仮想マシンの設計チームが永続的な生成を使用してメソッド領域を実装しているためです。これにより、HotSpot仮想マシンのガベージコレクターは、Javaヒープのようにメモリのこの部分を管理できます。ただし、メモリオーバーフローの問題が発生しやすいため、これはお勧めできません。

通話形式:

  • 类名.静态变量名
  • 类名.静态方法名()

変数またはメソッドがプライベートの場合、プロパティまたはメソッドにはクラス内でのみアクセスでき、クラス外ではアクセスできないことを意味します。

試験方法:

public class StaticBean {
    
    

    String name;
    //静态变量
    static int age;

    public StaticBean(String name) {
    
    
        this.name = name;
    }
    //静态方法
    static void SayHello() {
    
    
        System.out.println("Hello i am java");
    }
    @Override
    public String toString() {
    
    
        return StaticBean{
    
     +
                name=' + name + ''' + age + age +
                '}';
    }
}
public class StaticDemo {
    
    

    public static void main(String[] args) {
    
    
        StaticBean staticBean = new StaticBean(1);
        StaticBean staticBean2 = new StaticBean(2);
        StaticBean staticBean3 = new StaticBean(3);
        StaticBean staticBean4 = new StaticBean(4);
        StaticBean.age = 33;
        StaticBean{
    
    name='1'age33} StaticBean{
    
    name='2'age33} StaticBean{
    
    name='3'age33} StaticBean{
    
    name='4'age33}
        System.out.println(staticBean+ +staticBean2+ +staticBean3+ +staticBean4);
        StaticBean.SayHello();Hello i am java
    }

}

静的コードブロック

静的コードブロックはクラス内のメソッドの外部で定義され、静的コードブロックは非静的コードブロックの前に実行されます(静的コードブロック-非静的コードブロック-構築メソッド)。このクラスで作成されるオブジェクトの数に関係なく、静的コードブロックは1回だけ実行されます。

静的コードブロックの形式は次のとおりです。

static {    
语句体;   
}

クラスには複数の静的コードブロックが存在する可能性があり、場所は自由に配置できます。メソッド本体にはありません。JVMはクラスのロード時にこれらの静的コードブロックを実行します。複数の静的コードブロックがある場合、 JVMは、クラスでそれらを追跡します。それらを表示される順序で実行し、各コードブロックは1回だけ実行されます。

静的コードブロックは、その後に定義された静的変数に値を割り当てることができますが、それにアクセスすることはできません。

静的内部クラス

静的内部クラスと非静的内部クラスには最大の違いが1つあります。非静的内部クラスは、コンパイルの完了後に参照を暗黙的に保存することがわかっています。参照は、それを作成した外部クラスを参照しますが、静的内部クラス番号。この参照がないということは、次のことを意味します。

  1. その作成は、ペリフェラルクラスの作成に依存する必要はありません。
  2. 外部クラスの非静的メンバー変数およびメソッドを使用することはできません。

例(静的内部クラスはシングルトンモードを実装します)

public class Singleton {
    
    
    
    //声明为 private 避免调用默认构造方法创建对象
    private Singleton() {
    
    
    }
    
   // 声明为 private 表明静态内部该类只能在该 Singleton 类中被访问
    private static class SingletonHolder {
    
    
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getUniqueInstance() {
    
    
        return SingletonHolder.INSTANCE;
    }
}

Singletonクラスがロードされると、静的内部クラスSingletonHolderはメモリにロードされません。この時点でSingletonHolderがロードされるときgetUniqueInstance()にトリガーするメソッドを呼び出し場合のみ、SingletonHolder.INSTANCEINSTANCEインスタンスを初期化し、INSTANCEJVMが1回だけインスタンス化されるようにします。

このメソッドには、レイジー初期化の利点があるだけでなく、JVMによって提供されるスレッドセーフもサポートします。

静的ガイドパッケージ

形式は次のとおりです。importstatic

これらの2つのキーワードを一緒に使用して、特定のクラスに指定された静的リソースをインポートするように指定できます。クラス名を使用してクラスの静的メンバーを呼び出す必要はありません。静的メンバー変数とメンバーメソッドを直接使用できます。クラスで



 //将Math中的所有静态资源导入,这时候可以直接使用里面的静态方法,而不用通过类名进行调用
 //如果只想导入单一某个静态方法,只需要将换成对应的方法名即可
 
import static java.lang.Math.;//换成import static java.lang.Math.max;具有一样的效果
 
public class Demo {
    
    
  public static void main(String[] args) {
    
    
 
    int max = max(1,2);
    System.out.println(max);
  }
}

追加する

静的および非静的メソッド

静的メソッドはクラス自体に属し、非静的メソッドはクラスから生成されたすべてのオブジェクトに属します。メソッドによって実行される操作がそのクラスのさまざまな変数やメソッドに依存しない場合は、静的に設定します(これにより、プログラムのフットプリントが小さくなります)。それ以外の場合は、非静的である必要があります。

class Foo {
    
    
    int i;
    public Foo(int i) {
    
     
       this.i = i;
    }

    public static String method1() {
    
    
       return An example string that doesn't depend on i (an instance variable);
       
    }

    public int method2() {
    
    
       return this.i + 1;  Depends on i
    }

}

次のような静的メソッドを呼び出すことができますFoo.method1()この方法でmethod2を呼び出そうとすると、失敗します。しかし、これは機能します:Foo bar = new Foo(1);bar.method2();

総括する:

  • 静的メソッドを外部から呼び出す場合は、「クラス名。メソッド名」メソッドまたは「オブジェクト名。メソッド名」メソッドを使用できます。インスタンスメソッドには後者の方法しかありません。つまり、オブジェクトを作成せずに静的メソッドを呼び出すことができます。
  • 静的メソッドがこのクラスのメンバーにアクセスする場合、静的メンバー(つまり、静的メンバー変数と静的メソッド)のみがアクセスを許可されますが、インスタンスメンバー変数とインスタンスメソッドは許可されません。インスタンスメソッドにはそのような制限はありません。

static{}静的コードブロックと{}非静的コードブロック(構築されたコードブロック)

類似点:これらはすべて、JVMがクラスをロードするとき、および構築メソッドの実行前に実行されます。クラスで複数の定義を定義できます。複数の定義が定義されている場合、それらは定義順に実行されます。通常、一部の静的変数コードブロックで割り当てられます。

違い:静的コードブロックは、非静的コードブロックの前に実行されます(静的コードブロック-非静的コードブロック-構築方法)。静的コードブロックは、初めてnewで1回だけ実行され、その後は実行されませんが、非静的コードブロックは新しい時間ごとに1回実行されます。非静的コードブロックは通常の方法で定義できます(ただし効果はほとんどありません)。静的コードブロックは定義できません。

修正問題#677:静的コードブロックは最初の新規で実行される場合がありますが、必ずしも最初の新規でのみ実行されるとは限りません。たとえば、Class.forName("ClassDemo")Classオブジェクトの作成時にも実行されます。

通常の状況では、プロジェクトで最も一般的に使用される変数やオブジェクトなどのコードをプロジェクトの開始時に実行する必要がある場合は、静的コードブロックが必要です。この種のコードはアクティブに実行されます。配列、文字、文字列などのオブジェクトを作成せずにクラス内のメソッドを呼び出すことができるように設計する場合は、静的メソッドを使用する必要があります。2つの違いは、静的コードブロックが自動的に実行されることです。静的メソッド呼び出されたときに実行されます。

例:

public class Test {
    
    
    public Test() {
    
    
        System.out.print("默认构造方法!--");
    }

    //非静态代码块
    {
    
    
        System.out.print("非静态代码块!--");
    }

    //静态代码块
    static {
    
    
        System.out.print("静态代码块!--");
    }

    private static void test() {
    
    
        System.out.print("静态方法中的内容! --");
        {
    
    
            System.out.print("静态方法中的代码块!--");
        }

    }

    public static void main(String[] args) {
    
    
        Test test = new Test();
        Test.test();//静态代码块!--静态方法中的内容! --静态方法中的代码块!--
    }
}

上記のコードの出力:

静态代码块!--非静态代码块!--默认构造方法!--静态方法中的内容! --静态方法中的代码块!--

Test.test();出力のみを実行する場合:

静态代码块!--静态方法中的内容! --静态方法中的代码块!--

Test test = new Test();出力のみを実行する場合:

静态代码块!--非静态代码块!--默认构造方法!--

非静的コードブロックとコンストラクターの違いは次のとおりです。非静的コードブロックはすべてのオブジェクトを均一に初期化するのに対し、コンストラクターは対応するオブジェクトを初期化することです。複数のコンストラクターが存在する可能性があるため、コンストラクターは何かを作成します。このようなオブジェクトは、どのオブジェクトが作成されても、同じコンストラクターコードブロックが最初に実行されます。つまり、構築コードブロックで定義されているのは、さまざまなオブジェクトに共通の初期化コンテンツです。

参照

  • httpsblog.csdn.netchen13579867831articledetails78995480
  • httpwww.cnblogs.comchenssyp3388487.html
  • httpwww.cnblogs.comQian123p5713440.html
    ); `出力時:
静态代码块!--非静态代码块!--默认构造方法!--

非静的コードブロックとコンストラクターの違いは次のとおりです。非静的コードブロックはすべてのオブジェクトを均一に初期化するのに対し、コンストラクターは対応するオブジェクトを初期化することです。複数のコンストラクターが存在する可能性があるため、コンストラクターは何かを作成します。このようなオブジェクトは、どのオブジェクトが作成されても、同じコンストラクターコードブロックが最初に実行されます。つまり、構築コードブロックで定義されているのは、さまざまなオブジェクトに共通の初期化コンテンツです。

参照

  • httpsblog.csdn.netchen13579867831articledetails78995480
  • httpwww.cnblogs.comchenssyp3388487.html
  • httpwww.cnblogs.comQian123p5713440.html

おすすめ

転載: blog.csdn.net/qq_38893133/article/details/108071063