最近、友人は彼が最近Javaを学んでいると言いたかったと言った。彼はまだオブジェクト指向のプログラミング言語を理解していませんでした。彼がより速く「変身」するのを助けるために、私はこの記事を書きました。なぜなら、上部構造レベルから。すべてのオブジェクト指向プログラミング言語のアイデアは似ており、これらの3つの特性は思考の柱です。次に、Javaの3つの主要な特徴を説明することに焦点を当てます。
オブジェクト指向のプログラミング言語には、「カプセル化」、「継承」、「多型」の3つの主要な機能があります。
パッケージ
オブジェクト指向プログラミングでは、カプセル化(カプセル化)は文字通りパッケージの意味です。これは、抽象データ型を使用してデータとデータベースの操作を一緒にカプセル化することを意味し、それらを分離不可能な独立したエンティティにします。実際、プログラムでオブジェクトを実行してインターフェイスを公開するために必要なメソッドとデータをカプセル化することです。データは抽象データ型内で保護されており、内部の詳細を可能な限り隠し、外部インターフェイスのみを保持して外部に接触させます。言い換えれば、ユーザーはオブジェクト内の詳細を知る必要はありません(もちろん、それを知る方法はありません)が、オブジェクトはオブジェクトから外部に提供されるインターフェイスを介してアクセスできます。素人の用語では、これらのインターフェイスに接続されている他のオブジェクトは、このオブジェクトを使用するオブジェクトの実装を気にする必要はありません。コンセプトは「あなたがそれをどのようにしたか教えてはいけません、ただそれをする」です。
したがって、カプセル化はオブジェクトのプロパティを民営化し、外の世界でアクセスできる属性の方法をいくつか提供します。外の世界からアクセスしたくない場合は、外の世界からアクセスする方法を提供する必要はありません。しかし、クラスがアクセスするために外の世界に方法を提供しない場合、このクラスには意味がありません。
たとえば、私たちはオブジェクトを家と見なし、ソファ、テレビ、エアコンなどの美しい壁紙はすべて家のプライベート属性ですが、壁に覆われていない場合、プライバシーはまったくありません!ブロッキングウォールのために、私たちは自分のプライバシーを持つだけでなく、他の人に影響を与えることなく、インテリアの装飾を自由に変えることができます。しかし、ドアや窓がない場合、しっかりと包まれたブラックボックスの意味は何ですか?したがって、他の人はまた、ドアや窓から内部の景色を見ることができます。したがって、ドアと窓は、外の世界がアクセスできるように、家のオブジェクトによって残されたインターフェイスです。
一般に、クラスの属性の前にプライベート修飾子を追加する必要があります。次に、ゲッターとセッターのメソッドを定義します。次に、メイン関数のオブジェクトは、プロパティを直接呼び出すことができなくなり、ゲッターメソッドとセッターメソッドを介してのみ呼び出すことができます。
パッケージの3つの利点
1.優れたパッケージは結合を減らすことができます。
2。クラス内の構造は自由に変更できます。
3.メンバーのより正確な制御を与えることができます。
4.情報を非表示にし、詳細を実装します。
修飾子
まず、修飾子とは何かを理解する必要があります。アクセス修飾子を使用して、属性とメソッドのアクセス範囲を変更できます。
オブジェクト指向のプロセスでは、許可制御を使用して、カプセル化されたクラスにアクセス許可を追加して、クラスのデータとメソッドのセキュリティを確保するために、クラスの部外者の操作を制限します。クラスは、関連属性と方法をカプセル化する論理的エンティティであると言えます。オブジェクト内の特定のプロパティまたはメソッドについて、それらはプライベートであり、外の世界からアクセスすることはできません。また、共有することもでき、あらゆる部外者がアクセスできます。このようにして、オブジェクトは、プログラムの無関係な部分が誤って変更またはオブジェクトの私的部分を誤って変更しないようにするために、内部データのさまざまなレベルの保護を提供し、プログラムで不必要なエラーが発生します。
Javaの修飾子は、公開され、保護され、デフォルトで、プライベートです。これは、オブジェクト指向のカプセル化を示しており、セキュリティを改善するために、アクセス許可を最小限に抑えるために最善を尽くさなければなりません。
図に示すように、このクラスでのみアクセスまたは使用できるプライベートによって変更されたプロパティやメソッドなど、さまざまなアクセス修飾子のアクセススコープを表します。修飾子が追加されていない場合、デフォルトはデフォルトであり、現在のクラスと同じパッケージでデフォルトでアクセスして使用できます。
アクセス許可クラスBUNサブクラスその他のパッケージ
パブリック∨∨∨
∨××を保護します
デフォルト∨×××
プライベート××××
属性の前に修飾子が追加されていない場合、デフォルトの許可はデフォルトです。オブジェクトを作成することにより、属性値を直接変更できますが、カプセル化特性は反映されません。これはプログラミングで安全ではないため、コードを改善するためにカプセル化を使用する必要があります。
修飾子の例
まず、4つのクラスの人、親、教師、生徒を定義し、他のパッケージ、サブクラス、パッケージ、およびこのクラスの違いを比較します。各クラスの位置図が表示されます。
パッケージcom.java.test; public class person {public string name = "Zhang San"; public void introducemyself(){system.out.println(name); }}名前は公開されています。コンピレーションにエラーがない場合、パブリック変数がこのクラスにアクセスできることを意味します。
パッケージcom.java.test; public class Student {person P = new Person(); public void test(){system.out.println(p.uname); }}学生と人は同じパッケージにいます。コンピレーションにエラーがない場合、変数に同じパッケージにアクセス権があることを意味します。
パッケージcom.java.test1; Import com.java.test.person; public class teacher extends person {public int age;人p = new person(); public void test1(){system.out.println(p.uname); }}生徒と人は同じパッケージに入っていませんが、教師は人のクラスを継承します。コンパイルにエラーがない場合、変数にサブパッケージにアクセス権があることを意味します。
パッケージcom.java.test1;インポートcom.java.test.person; public class parent {public string uname = "haha";人p = new person(); public void test2(){system.out.println(p.uname); }}親と人は同じパッケージに含まれていません。コンパイルにエラーがない場合、変数にアクセス権限がないことを意味します。
上記のテストの後、それらのすべてをコンパイルして合格できる場合、公開されたクラスがこのクラス、同じパッケージ、サブクラス、その他のパッケージで互いにアクセスできることを意味します。
また、保護された許可問題のテストを開始しました。人、教師、生徒がコンパイルして合格できる場合、保護されたクラスがこのクラス、同じパッケージ、およびサブクラスで互いにアクセスできることを意味します。親がコンパイルせず、合格しない場合、保護されていることは、パッケージ外の継承関係なしにクラスで互いにアクセスできないことを意味します。
また、デフォルトの許可問題のテストを開始します。個人と学生がコンパイルして合格できる場合、デフォルトで変更されたクラスがこのクラス、同じパッケージ、およびサブクラスで互いにアクセスできることを意味します。親と教師のクラスを合格せずにコンパイルし、教師のクラスは相続関係があるかどうかに関係なく互いにアクセスできません。
また、プライベート許可の問題のテストを開始しました。人を編集して合格できる場合、プライベートで変更されたクラスがこのクラス、同じパッケージ、およびサブクラスで互いにアクセスできることを意味します。親、教師、生徒は、プライベートで修正されたクラスにこのクラスでのみアクセスできることを示すためにプライベートを通過せずにコンパイルすることはできません。
一般に、クラスの属性の前にプライベート修飾子を追加する必要があります。次に、ゲッターとセッターのメソッドを定義します。次に、メイン関数のオブジェクトは、プロパティを直接呼び出すことができなくなり、ゲッターメソッドとセッターメソッドを介してのみ呼び出すことができます。
バッグ
バッグの機能を教えてください
プログラムのクラス名が複製される場合がある場合、パッケージの概念を使用して問題を解決できる場合があります。パッケージの目的は、Javaファイルを管理し、同じ名前のファイルの競合を解決することです。これはワードローブに似ています。ワードローブにはさまざまなパーティションと引き出しがありますか?衣服を別々にさまざまなカテゴリに配置します。これは、管理をより助長します。
パッケージを定義するには、パッケージキーワードとパッケージ名を使用します。
パッケージcom.java.test; //注:ソースプログラムの最初の行に配置する必要があり、パッケージ名は「。」で区切ることができます。サイン。パッケージの命名仕様は、すべての小文字で綴られています。
Javaシステムで一般的に使用されるパッケージ
Java。(function)。(class)java.lang。(class)java言語Java.util。(class)の基本が含まれています。
別のパッケージ内の別のファイルでクラスを使用するには、インポートキーワードを使用する必要があります。たとえば、com.java.test1.test.javaをインポートします。同時に、com.java.test1*をインポートする場合、パッケージの下にすべてのファイルをインポートします。
このキーワード
1.このキーワードには3つの主要なアプリケーションがあります。
(1)これは、このクラスの属性、つまりクラスのメンバー変数を呼び出します。
(2)これは、このクラスの他の方法を呼び出します。
(3)これは、このクラスの他のコンストラクターを呼び出し、呼び出し時にコンストラクターの最初の行に配置する必要があります。
Public Class Student {Public Student(String name){//正式なパラメーターでコンストラクターを定義する} public Student(){//メソッドを定義します。名前はクラスと同じです。 }文字列名; //メンバー変数を定義するprivate void setname(string name){// parameter(local variable)name this.name = name; //ローカル変数の値をメンバー変数に渡す}}上記のコードと同様に、メンバー変数名があり、メソッドに正式なパラメーターがあり、名前も名前です。次に、正式なパラメーター名の値がメソッドのメンバー変数名に渡されます。
キーワードこれは、オブジェクト内のメンバー変数またはメソッドを表します。つまり、このキーワードで変数が追加された場合、メンバーメソッドの正式なパラメーターまたはローカル変数ではなく、オブジェクトのメンバー変数またはメソッドを指します。このため、上記のコードでは、this.nameはオブジェクトのメンバー変数を表します。これはオブジェクトのプロパティとも呼ばれ、次の名前はメソッドの正式なパラメーターです。コードthis.name = nameは、正式なパラメーターの値をメンバー変数に渡すことです。
クラスに複数のコンストラクターがある場合、その名前がクラス名と同じで同じであるため、これはどのコンストラクターと呼ばれますか?実際、これは他の方法を使用してコンストラクターを参照するのと同じであり、正式なパラメーターを介して呼び出されます。上記の例のように、このキーワードの後にパラメーターが追加された場合、それはパラメーターを持つコンストラクターを指すことを意味します。現在、3つの構造方法がある場合、つまり、パラメーター、1つのパラメーター、2つのパラメーターがありません。次に、Javaコンパイラは、合格したパラメーターの数に基づいて呼び出すコンストラクターを決定します。上記の例からわかるように、このキーワードは、メンバー変数だけでなく、参照コンストラクターにも使用できます。
内部クラス
内側のクラスは、外部から非常に簡単に理解できます。内部クラスは、あるクラスの定義を別のクラスの定義内に配置することです。もちろん、これに対応して、内側のクラスを含むクラスは外部クラスと呼ばれます。
多くの初心者は、なぜあるクラスを別のクラスで定義する必要があるのか間違いなく尋ねるでしょうか?
プログラミングには、インターフェイスを使用して解決するのが難しい問題がある場合があります。現時点では、内部クラスが提供する機能を使用して、複数のコンクリートまたは抽象クラスを継承して、これらのプログラミングの問題を解決できます。インターフェイスはいくつかの問題を解決するだけであり、内部クラスにより複数の継承の解決策がより完全になると言えます。
「Think in Java」には文があります。内部クラスを使用する最も魅力的な理由は、各内部クラスが独立して実装(インターフェイス)を独立して継承できることです。したがって、周辺クラスが特定の実装(インターフェイス)を継承したかどうかは、内部クラスに影響を与えません。
パブリックインターフェイスファーザー{}パブリックインターフェイスマザー{}パブリッククラスの息子は父親、母、マザー{}公共クラスの娘を実装します{class mother_ emplesient mother {}}内部クラスの機能
1.内部クラスは複数のインスタンスを使用できます。各インスタンスには独自の状態情報があり、他の周辺オブジェクト情報から独立しています。
2。単一の周辺クラスでは、複数の内部クラスが異なる方法で同じインターフェイスを実装するか、同じクラスを継承できます。
3.内部クラスオブジェクトを作成する瞬間は、末梢クラスオブジェクトの作成に依存しません。
4.内部クラスには混乱する「is-a」関係はありません。それは独立したエンティティです。
5.インナークラスはより良いカプセル化を提供し、周辺クラスを除いて他のクラスにアクセスできません。
パッケージcom.java.test; public class outerclass {private string name;プライベートインクエイジ; public string getName(){return name; } public void setName(string name){this.name = name; } public int getage(){return age; } public void Setage(int age){this.age = age; } public void display(){system.out.println( "outourclassのディスプレイは呼び出されます"); } public class innerclass {public innerclass(){name = "Chenssy";年齢= 23; } public outerclass getouterclass(){return outourclass.this; } public void display(){system.out.println( "name:" + getname() + "; age:" + getage()); }} public static void main(string [] args){outerclass outourclass = new outourclass(); outerclass.innerclass innerclass = outerclass.new innerclass(); innerclass.display(); innerclass.getouterclass()。display(); }} name:chenssy; age:23アウタークラスのディスプレイが呼び出されます
内部クラスがコンパイル時間の概念であることを明確にする必要があります。正常にコンパイルされると、それらは周辺クラスとはまったく異なる2つのクラスに属します(もちろん、それらはまだ関連しています)。
また、内側のクラスを参照する方法を確認します。インナークラスを参照すると、このオブジェクトのタイプを指定する必要があります:outerclasname.innerclassname。同時に、内部クラスオブジェクトを作成する必要がある場合は、外部クラスオブジェクトを使用して.new:outerclass.innerclass innerclass = outerclass.new innerclass();を介して内部クラスを作成する必要があります。
同時に、外部クラスオブジェクトへの参照を生成する必要がある場合は、外部クラスへの参照を正しく生成できるように、外部クラス名を使用できます。
Javaでは、内部クラスは主にメンバー内部クラス、ローカル内部クラス、匿名の内部クラス、および静的な内部クラスに分割されます。
メンバー内部クラス
メンバー内部クラスも最も一般的な内部クラスです。これは周辺クラスのメンバーであるため、限定されなくても、周辺クラスのすべてのメンバー属性と方法にアクセスできます。プライベートですが、周辺クラスが内部クラスのメンバー属性と方法にアクセスしたい場合、内部クラスインスタンスを介してアクセスする必要があります。
メンバーの内部クラスでは、2つのポイントに注意を払う必要があります。
メンバーの内部クラスに静的変数と方法はありません。
メンバーの内部クラスは周辺クラスに添付されるため、周辺クラスが最初に作成された場合にのみ、内部クラスを作成できます。
パブリッククラスのアウタークラス{プライベートストリングSTR; public void outourdisplay(){system.out.println( "outourclass ..."); } public class innerclass {public void innerdisplay(){//周辺str = "chenssy ..."で属性strを使用します。 System.out.println(str); //メソッドを使用しますoutourdisplay(); }} /*getxxx()を使用してメンバー内部クラスを取得することをお勧めします。特に内部クラスのコンストラクターにパラメーターがない場合* / public Innerclass getinnerclass(){return new innerclass(); } public static void main(string [] args){outerclass outer = new outourclass(); outerclass.innerclass inner = outer.getinnerclass(); inner.innerdisplay(); }}特にこの内部クラスのコンストラクターにパラメーターがない場合、メンバー内部クラスを取得するためにgetXxx()を使用することを個人的にお勧めします。
文章内部クラスを文
ローカル内部クラスは、方法とスコープ内にネストされています。このクラスの使用は、主に比較的複雑な問題を適用して解決することです。ソリューションを支援するためにクラスを作成したいと思います。当時、私はこのクラスを公開したくないので、ローカル内部クラスを作成できます。
ローカルインナークラスは、メンバーインナークラスのように編集されています。この方法と属性でのみ使用できます。それらがこの方法と属性にない場合、それらは無効になります。
メソッドで定義されています:
Public Class Parcel5 {public Destionation destination(string str){class pdestionationはDestion {private string label; private pdestion(string whereto){label = whereto; } public string readlabel(){return label; }} new pdestion(str)を返します。 } public static void main(string [] args){parcel5 parcel5 = new Parcel5(); Destion D = Parcel5.destionation( "Chenssy"); }}範囲内で定義されています:
public class parcel6 {private void internal Tracking(boolean b){if(b){class trackingslip {private string id; TrackingSlip(string s){id = s; } string getSlip(){return id; }} TrackingSlip ts = new TrackingSlip( "Chenssy"); string string = ts.getslip(); }} public void track(){internalTracking(true); } public static void main(string [] args){parcel6 parcel6 = new Parcel6(); parcel6.track(); }}匿名の内部クラス
Public Class OuterClass {public InnerClass getInnerClass(final int num、string str2){return new innerclass(){int number = num + 3; public int getNumber(){return number; }}; / *注:semicolonsは保存できません */} public static void main(string [] args){outourclass out = new outourclass(); InnerClass Inner = Out.getInnerClass(2、 "Chenssy"); System.out.println(inner.getNumber()); }} interface innerclass {int getNumber();}1.匿名の内部クラスには、アクセス修飾子がありません。
2。新しい匿名の内部クラス、このクラスは最初に存在する必要があります。 InnerClassインターフェイスをコメントすると、コンパイルエラーが発生します。
3。getInnerClass()メソッドの正式なパラメーターに注意してください。最初の正式なパラメーターは最終的に変更されますが、2番目のパラメーターは最終パラメーターでは変更されません。同時に、2番目の正式なパラメーターは匿名の内部クラスで使用されていないため、メソッドの正式なパラメーターを匿名のインナークラスで使用する必要がある場合、この正式なパラメーターは最終的でなければなりません。
4.匿名の内部クラスのコンストラクターはありません。それを構築する名前さえ持っていないからです。
静的インナークラス
静的は、メンバー変数、メソッド、コードブロック、およびその他の内部クラスを変更できます。静的として修正された内部クラスをstaticとして呼び出しますが、ネストされた内部クラスを呼び出すことを好みます。静的な内部クラスと非静的な内部クラスの最大の違いは、コンパイルが完了した後、参照が隠され、使用が周辺を指していることです。しかし、静的な内部クラスはそうではありません。つまり、静的な内部クラスの作成は周辺クラスに依存する必要はなく、周辺クラスの非静的なメンバー変数と方法を使用することはできません。
パブリッククラスのアウタークラス{プライベートストリングセックス; public static string name = "Chenssy"; / ***Static Inner Class*/ Static Class InnerClass1 {/*静的インナークラスに存在することができます*/ public Static String _name1 = "Chenssy_static"; public void display(){ /**静的インナークラスは、静的メンバー変数と周辺クラスの方法のみにアクセスできます*非静的メンバー変数と周辺クラスのメソッドにアクセスできません* / system.out.println( "outclass name:" + name); }} / ***非スタティックインナークラス* / class innerclass2 { /*静的メンバーは、非静的な内部クラスに存在できません* / public string _name2 = "chenssy_inner"; / *周辺クラスのメンバーは、静的または非静的なvoid display(){system.out.println( "outourclass name:" + name); }} /** * @desc周辺クラスメソッド * @author chenssy * @data 2013-10-25 * @return void * /public void display(){ / *周辺クラスは静的な内部クラス:内側クラスにアクセスします。 */ system.out.println(innerclass1._name1); /*周辺クラスに依存せずに静的インナークラスを直接作成できます*/ new InnerClass1()。display(); /*非静的な内部創造物は周辺クラスに依存する必要があります*/ outerclass.innerclass2 inner2 = new outourclass()。新しいInnerClass2(); /*非静的な内部クラスのメンバーは、非静的な内部クラスのインスタンスを使用する必要があります*/ system.out.println(inner2._name2); inner2.display(); } public static void main(string [] args){outerclass outer = new outourclass(); outer.display(); }}要約します
上記は、3つの主要なJava機能の概要です。編集者が紹介したカプセル化された知識です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!