記事ディレクトリ
序文
修飾子には、Java言語で、メンバー変数、メンバーメソッド、コードブロック、および内部クラスの4つの使用例があります。日常の開発プロセスでは、次の11の一般的な修飾子に遭遇します。この記事は、これらの一般的な修飾子の構文の説明と、最も基本的な最下層および原則からの一般的な開発アプリケーションのケースを理解してクリアするのに役立ちます。1.11の一般的なJava修飾子
1.モディファイアアプリケーションテーブル
修飾子 | クラス | 工法 | 方法 | データ | ピース | 説明 |
---|---|---|---|---|---|---|
(デフォルト) | √ | √ | √ | √ | √ | クラス、コンストラクター、メソッド、またはデータフィールドがパッケージに表示されます |
公衆 | √ | √ | √ | √ | クラス、コンストラクター、メソッド、またはデータフィールドは、すべてのパッケージまたはプログラムに表示されます | |
民間 | √ | √ | √ | コンストラクター、メソッド、またはデータフィールドは、クラスでのみ表示されます | ||
保護 | √ | √ | √ | 構築メソッド、メソッド、またはデータフィールドは、それが属するパッケージに表示されるか、任意のパッケージのこのクラスの任意のサブクラスに表示されます。 | ||
静的 | √ | √ | √ | クラスメソッド、クラスデータフィールド、または静的初期化モジュールを定義します | ||
最後の | √ | √ | √ | 究極のクラスを拡張することはできません。最終的なメソッドは、サブクラスで変更できません。最終的なデータフィールドは一定です | ||
概要 | √ | √ | 抽象クラスを拡張する必要があります。抽象メソッドは、具体的なサブクラスに実装する必要があります | |||
ネイティブ | √ | ネイティブで変更されたメソッドは、Java以外の言語で実装されていることを示しています | ||||
同期 | √ | √ | このメソッドを一度に実行できるのは1つのスレッドのみです | |||
strictfp | √ | √ | 正確な浮動小数点計算モードを使用して、計算結果がすべてのJava仮想マシンで同じになるようにします | |||
一時的 | √ | シリアル化されないようにインスタンスデータフィールドをマークします |
2.アクセス権の比較
パブリック>保護>デフォルト>プライベート
注:以下では、一般的に使用される7つの修飾子構文命令と開発アプリケーション命令のみを紹介します。他の4つの使用法は、修飾子アプリケーションの表で確認できます。
2、パブリックモディファイア
構文の説明:
- クラス、メソッド、および変数を変更します。どこからでも、公共の場所からアクセスできます。
開発と応用:
- 開発では、通常、クラスとビジネスメソッドはパブリックで装飾されます。
3、プライベートモディファイア
構文の説明:
- メソッド、変数、および内部クラスを変更します。プライベートのこのクラスでのみアクセスできます。
開発と応用:
- 開発では、通常、エンティティクラス(Entity、Vo)のメンバー変数はprivateで装飾され、これらの変数にアクセスするためにgetterまたは
setterメソッドが提供されます。原則として、privateメソッドを定義することはできません。 - エンティティデータテーブルは通常、エンティティクラスに対応します。
4、保護された修飾子
構文の説明:
- メソッド、変数、および内部クラスを変更します。
- 同じパッケージにアクセスでき、サブクラスにアクセスできます(サブクラスと親が同じパッケージにない場合は、それらにアクセスできます)。
開発と応用:
- 開発では、通常、メソッドまたは変数が継承に使用され、保護された状態で装飾されます。
- 継承、メソッドの書き換えでは、サブクラスメソッドのアクセス許可は、親メソッドのアクセス許可以上である必要があります。
class Fu {
public void play() {
}
}
class Son extends Fu {
void play() {
}
}
5、デフォルト(アクセス許可修飾子なし)
構文の説明:
- クラス、メソッド、および変数を変更します。
- 同じパッケージ内でのみアクセスでき、サブクラスも同じパッケージ内にある必要があります。
開発と応用:
- プロジェクトでは、クラス、メソッド、および変数には通常、要件に基づいてアクセス許可が割り当てられます。
6、静的修飾子
1.静的に変更されたメンバー変数(静的変数/クラス変数)
構文の説明:
- Javaでは、変数をstaticキーワードで変更して、グローバル変数の効果を実現できます。
- 静的変更変数(静的変数)はクラスに属し、クラスがクラスローダーを初めてjvmに渡すときにメソッド領域に割り当てられます。
- 静的に変更されていない変数は、インスタンス変数と呼ばれます。
1.1、クラス変数とインスタンス変数の違い
- インスタンス変数は、オブジェクトの作成後にヒープメモリに割り当てられ、インスタンス変数は特定のオブジェクトに属します。オブジェクトが作成されると、インスタンス変数がヒープメモリに表示されます。オブジェクトがガベージコレクションされると、インスタンス変数はすぐにメモリを解放します。
例:2つのオブジェクトを作成します。
Cell c1 = new Cell(4,5);
Cell c2 = new Cell(5,6);
オブジェクトc1、c2を作成すると、インスタンス変数(4,5)、(5,6)がヒープメモリに表示されます。オブジェクトc1、c2がガベージコレクションされると、インスタンス変数はすぐにメモリを解放します。
- クラス変数は、すべてのオブジェクトで共有される「1つのコピーのみ」というメソッド領域に格納されます。クラスがロードされると、すぐにメソッド領域に格納されます。クラスがアンロードされると、クラス変数はすぐにメモリを解放します。
開発と応用:
- クラス変数にはクラス名で直接アクセスできます。開発時にはクラス名のフルネームを使用することをお勧めします。
例:エンティティクラスを定義します。
public class Student {
// 实例变量,在创建对象之后,被分配到堆内存中,实例变量属于某个具体的对象
// 当创建对象,实例变量出现在堆内存中,当对象被垃圾回收,实例变量立即释放内存
String name;
// 类变量,被存储在方法区中,"只有一份",被所有对象共享
static String jtName;
public void print() {
System.out.println(this.name);
System.out.println(jtName);
}
}
次回静的変数を使用するときはjtName
、Studentクラス名を使用して直接呼び出すことができます。同時に、次の2つのオブジェクトの属性値が同じであることがわかります。
public class Demo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu1 = new Student();
stu1.name = "张三";
stu1.jtName = "王老师";
Student stu2 = new Student();
// 一般直接取类名
// stu2.jtName = "卢老师";
Student.jtName = "卢老师";
System.out.println(stu1.name);// 张三
System.out.println(stu2.name);// null
System.out.println(stu1.jtName);// 卢老师
System.out.println(stu2.jtName);// 卢老师
}
}
2.静的修正メンバーメソッド(静的メソッド/クラスメソッド)
静的メソッド:静的に変更されたメソッドはクラスメソッドに属し、オブジェクトを作成せずに呼び出すことができます。thisやsuperなどのキーワードは静的メソッドでは使用できず、非静的メソッドを呼び出すことはできず、クラスの静的メンバー変数と静的メソッドにのみアクセスできます。静的メソッド(クラスメソッド)。クラスがロードされると、静的メソッドはすぐにメソッド領域にロードされ、クラスメソッドはクラス名で直接呼び出すことができます。
インスタンスメソッド:静的な変更のないメソッド、インスタンスメソッド、オブジェクトが作成されると、インスタンスメソッドはすぐにメソッド領域にロードされ、複数のインスタンスがインスタンスメソッドを共有します。
2.1、静的メソッドとインスタンスメソッドの違いと結論
- classメソッドでは、thisキーワードは使用できず、メソッドオブジェクトを呼び出すパラメーターはclassメソッドに暗黙的に含まれていません。
- インスタンスメソッドは静的メソッドを直接呼び出すことができますが、静的メソッドはインスタンスメンバーに直接アクセスできません。オブジェクトはオブジェクトによって作成およびアクセスされる必要があります。
結論:すべてのオブジェクトによって共有されるデータは静的変数として定義されます。それ以外の場合は、インスタンス変数メソッドとして定義されます。メソッド内のインスタンスメンバーへのアクセスはなく、静的メソッドとして定義できます。
開発と応用:
- プロジェクトでは、ツールクラスのメソッドは通常静的です。
3.静的静的コードセグメント
構文の説明:
- JVMは、静的変数を初期化するためによく使用されるクラスをロードするときに、静的静的コードセグメントを実行します。
- 静的コードは、クラスがロードされたときに1回だけ実行および実行されます。
- 静的はオブジェクトよりも優れています。
開発と応用:
- 開発中は、通常、静的リソースのロード、構成ファイルの読み取り、および静的コードセグメントで実装されるその他の操作に使用されます。
例:
ツールクラスを定義します。
public class SomeUtil {
// 默认的无参构造
public SomeUtil() {
System.out.println("创建对象!");
}
// 静态优于对象
// 静态代码段 当类被加载,立即被执行,一个类在同一个进程中,只加载一次
static {
System.out.println("加载静态资源!");
}
// 实例代码段
{
System.out.println("实例代码段!");
}
public static void do1() {
System.out.println("do1....");
}
public static void do2() {
System.out.println("do2....");
}
public static void do3() {
System.out.println("do3....");
}
public static void main(String[] args) {
SomeUtil.do1();
SomeUtil.do2();
SomeUtil.do3();
SomeUtil s1 = new SomeUtil();
SomeUtil s2 = new SomeUtil();
}
}
mainメソッドを実行すると、出力内容に応じた実行順序が明確にわかります。静的コードセグメントは1回だけ実行され、次に静的メソッドが実行され、最後に新しいオブジェクトがパラメータなしの構築とインスタンスコードセグメントを実行し、newが一度に1回実行されます。同時に、結論を導き出すことができます。静的はオブジェクトよりも優れています。
4.静的内部クラス
構文の説明:
- 静的内部クラスは、外部クラスのインスタンスオブジェクトに依存せずにインスタンス化できますが、内部クラスは、外部クラスがインスタンス化された後にインスタンス化する必要があります。
- 静的内部クラスは外部クラスの通常の変数にアクセスできませんが、外部クラスの静的メンバー変数と静的メソッドにのみアクセスできます。
7、最後の修飾子
構文の説明:
- 最終クラスは継承できません。
- 最後のメソッドはオーバーライドできません。
- 最終的に変更される変数は定数です。
開発と応用:
- 開発では、finalを使用してデータディクショナリを定義します。
次に例を示します。次のCardクラスでは、main関数の出力とクエリ用のデータディクショナリを定義します。
備考:データディクショナリとは、データ項目、データ構造、データフロー、データストレージ、処理ロジックなどの定義と説明を指します。その目的は、データフローチャートの各要素の詳細な説明を提供することです。データディクショナリを次のように使用します。シンプルなモデリングプロジェクト。つまり、データディクショナリは、システムで使用されるすべてのデータ要素のデータと定義のコレクションを説明する情報のコレクションです。
public class Card {
// 开发中,使用final定义数据字典。
public static final int SPADE = 1;
public static final int HEART = 2;
public static final int BLACK = 5;
public static final int FLOWER = 6;
public static final int THREE = 0;
public static final int EIGHT = 5;
public static final int JACK = 8;
public static final int QUEEN = 9;
public static final int KING = 10;
public static final int ACE = 11;
public static final int DUCE = 12;
public static final int JOKER = 13;
private int suit;
private int num;
public Card() {
}
public Card(int suit, int num) {
this.suit = suit;
this.num = num;
}
public int getSuit() {
return suit;
}
public void setSuit(int suit) {
this.suit = suit;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public static void main(String[] args) {
Card card = new Card(Card.HEART, Card.THREE);
System.out.println(card.getNum());
}
}
8つの抽象的な修飾子
構文の説明:
- 要約すると、クラスを変更したり、メソッドを変更したりできます。
抽象クラス:
- 抽象クラスの意味は継承されます。
- 抽象クラスはオブジェクトを作成できません。
- abstractはfinalでは使用できません。
抽象的方法:
- 抽象メソッド。定義のみが実装されていません。
- クラスに抽象メソッドがある場合、このクラスは抽象クラスである必要があります。
- 抽象クラスに抽象メソッドを含めることはできません。
- 抽象クラスのサブクラスは、親クラスのすべての抽象メソッドを実装する必要があります。
開発と応用:
- 抽象クラスは、デフォルトの実装メソッドと実装されていないメソッドの両方を持つことができます。
- インターフェイスアダプタ-サブクラスを使用して、インターフェイスにメソッドを実装します。
9、インターフェース(特別な抽象クラス)
構文の説明:
- 特別な抽象クラスインターフェイスのメソッドはすべて抽象メソッドであり、インターフェイスの変数はすべて静的定数です。
- interfaceキーワードを使用して、インターフェイスを定義します。
- インターフェースを実装するには、implementsキーワードを使用します。
- クラスはインターフェイスを実装し、インターフェイスのすべてのメソッドを実装する必要があります。
public interface MyInterface {
// 接口是高一级别的抽象。不能被实例化,所以只能定义常量
// 定义了变量需要实例化,赋值才能使用,跟接口违背
// 特殊的抽象类 接口中的方法都是抽象方法 接口中的变量都是静态常量
int I = 10;
// 如果类中所有的方法都是抽象方法,使用接口
void method1();
void method2();
}
import java.io.Serializable;
/**
* 其实适配器只是一个类,它实现了某种接口,提供了方法体。
* 这样,再用到这个接口时,可以直接继承适配器,这样就不需要把接口中的每一个方法再填充一遍了。
* 只需要在这个类中复写一下需要用的方法。这样简单,方便。
*
* @author bailu
*
*/
public class MyImpClass implements MyInterface, Serializable {
// Serializable序列化
private static final long serialVersionUID = 1L;
// 重写接口的方法——适配器,
@Override
public void method1() {
System.out.println(I);
}
@Override
public void method2() {
}
}
開発と応用:
- クラス内のすべてのメソッドが抽象メソッドである場合は、インターフェイスを使用します。
1.抽象クラスとインターフェースの違い
- 抽象クラスでは、抽象メソッドと非抽象メソッドを定義できます。インターフェイスでは、すべてのメソッドは抽象メソッドです。
- クラスは1つの抽象クラスのみを継承できます。クラスは複数のインターフェースを実装でき、複数のインターフェースはコンマで区切られます。
例:次のクラスは、インターフェイスMyInterfaceを実装するだけでなく、Serializableシリアル化も実装します。
import java.io.Serializable;
/**
- 其实适配器只是一个类,它实现了某种接口,提供了方法体。
- 这样,再用到这个接口时,可以直接继承适配器,这样就不需要把接口中的每一个方法再填充一遍了。
- 只需要在这个类中复写一下需要用的方法。这样简单,方便。
-
- @author bailu
- */
public class MyImpClass implements MyInterface, Serializable {
// Serializable序列化
private static final long serialVersionUID = 1L;
// 重写接口的方法——适配器,
@Override
public void method1() {
System.out.println(I);
}
@Override
public void method2() {
}
}
- 抽象クラスも継承できますが、サポートされるのは単一の継承のみです。インターフェイスも継承でき、1つのインターフェイスが複数のインターフェイスを継承できます。
開発と応用:
-
インターフェイスは、標準または仕様を策定するために使用されます。
-
コンポーネント間の結合を減らし、コンポーネントの機能を拡張できます。
-
これは、設計パターンの開始と終了の原則を具体化したものです。
2.アダプターとは何ですか?
アダプターは単なるクラスであり、インターフェースを実装し、メソッド本体を提供します。このインターフェイスを再度使用すると、アダプタを直接継承できるため、インターフェイスのすべてのメソッドを再度入力する必要はなく、このクラスで必要なメソッドをコピーするだけで済みます。インターフェースは、デザインパターンの開閉原理をよく反映しています。
たとえば、オンラインモールシステムを構築する場合、サードパーティの支払い(銀行またはAlipayの支払いインターフェイス)を呼び出す必要があります。抽象メソッドとインターフェイスアダプタを実装するメソッドを定義するインターフェイスを提供するサードパーティが必要です。アダプタでメソッドを呼び出して支払いを完了します。
ZsBankInter obj = 获取实现类对象;
obj.send();
京东、淘宝
银行接口ZsBankInter
send()
类
class DoSend implements ZsBankInter{
send()具体的方法
}
総括する
修飾子には、Java言語で、メンバー変数、メンバーメソッド、コードブロック、および内部クラスの4つの使用例があります。上記では、日常の開発プロセスで遭遇する11の一般的な修飾子を要約し、これらの一般的な修飾子の構文の説明と一般的な開発アプリケーションのケースを最も基本的な最下層と原則から理解してクリアしました。具体的な内容はまだまだたくさんありますので、当面は一つ一つ記載せず、今後の開発ニーズに応じて補足していきます。応援よろしくお願いします。たゆまぬ努力をするプログラマー、バイルです。この投稿がすべての人に役立つことを願っています。そして、すべての人のワンクリック3接続を歓迎します。質問、提案、補足がある場合は、投稿の下部にメッセージを残して、より多くの人を助けることができます!
詳細WeChat検索パブリックアカウント【WDeerCodeコードサークル】