最近、仕事が休みのときに「think in java」を観ましたが、最初に観た時とはかなり違った印象を受けました。次に、Java におけるオブジェクトと参照の関係と内部クラスの概念について話します。
1. Java のすべてはオブジェクトです
Java でオブジェクトを制御するものは何ですか?答えは参照です。これは C または C++ のポインタに似ています。
参照がある場合は、この時点でそれをオブジェクトに関連付ける必要があります。そうでないと、参照は想像どおりに制御できなくなります。たとえば、文字列参照を作成する場合:
String s ;
String s = new String();
String s = “my name is ajun”;
2. オブジェクトと関連付ける方法
Java では、通常、次のように、 new を通じてオブジェクトが作成されます。
String s = new String("my name is ajun")
3. 格納場所
(1) スタック: 一般的に、スタックは主にスタック ポインタを上下に移動することでメモリの割り当てと解放を行います。
基本型変数は占有メモリ量が少ないため、new での作成には適していません。
(2) ヒープ: Java オブジェクトを保存するために使用されます。プログラムが新しく実行されると、ヒープによるメモリの割り当てと解放は、オブジェクトによるメモリの割り当てと解放よりも多くのスペースを消費することに注意してください。スタック時間、これは基本型変数が最も頻繁に使用されるため、メモリの格納と解放が頻繁に行われるため、それ以上のパフォーマンスが想像されます。
4. 内部クラス
(1) 内部クラスの基礎知識:
一般に、Java クラス内で定義されたクラスは内部クラスになります
内部クラスは、メソッド本体の外で定義されたクラス、メソッド内で定義されたクラス、および静的内部クラスに分類できますクラス (メソッドの外でのみ定義可能)、匿名内部クラス
説明:
メソッドの外で定義されたクラス:
クラスのメンバー変数 (静的、非静的) に確実にアクセスできるようにするため。クラスを正しく参照できるため、内部クラスのオブジェクトをインスタンス化する前に、まず外部クラスのオブジェクトをインスタンス化する必要があります。アクセス許可はクラスのメンバー変数と考えることができます。理解しやすくなります。
メソッド本体で定義されたクラス;
クラスのメンバー変数(静的、非静的)にアクセスできるようにするには、クラスのメンバー変数を確実に参照できるようにするために、外部クラスのオブジェクトをインスタンス化する必要があります。内部クラスがインスタンス化される前に、オブジェクト
へのアクセス権を持つことはできません。オブジェクトをメソッドのローカル変数として扱うだけです。
静的内部クラス:
クラスの静的メンバー変数のみにアクセスできます
任意のアクセス権
匿名内部クラス:
クラスのメンバー変数 (静的、非静的) にアクセスできます。クラスは正しく参照できるため、内部クラスのオブジェクトをインスタンス化する前に、外部クラスのオブジェクトをインスタンス化する必要があります。 (2) 内部クラスの役割は隠蔽できます。一般クラスには、デフォルトのプライベート保護アクセス許可が許可されていません。
内部クラスは、Java が多重継承できないという事実を補う多重継承を実現できます
(3)、例
package com.ajun.test.innerclass.example; /** * 水果内容 * @author Administrator * */ public interface Contents { String value(); } package com.ajun.test.innerclass.example; /** * 水果目的地 * @author Administrator * */ public interface Destination { //目的地 String readLabel(); } package com.ajun.test.innerclass.example; public class Goods { private String des="is ruit!!"; //方法外部 private class Content implements Contents{ private String name = "apple "+des; @Override public String value() { return name; } } //方法外部 private class GDestination implements Destination{ private String label ; private GDestination(String label){ this.label= label; } @Override public String readLabel() { return label; } } //匿名内部类 public Destination getdestination(final String label){ return new Destination(){ @Override public String readLabel() { return label; } }; } public Destination dest(String s){ return new GDestination(s); } public Contents content(){ return new Content(); } public Destination dest2(String s){ class GDestination implements Destination{ private String label; private GDestination(String label){ this.label= label; } @Override public String readLabel() { return label; } } return new GDestination(s); } } package com.ajun.test.innerclass.example; public class Test { public static void main(String [] a){ Goods gs = new Goods(); Contents c = gs.content(); Destination d = gs.dest("Beijing"); System.out.println(c.value()); System.out.println(d.readLabel()); Destination d1 = gs.getdestination("Shanghai"); System.out.println(d1.readLabel()); System.out.println(gs.dest2("Tianjin").readLabel()); } }
apple is ruit!! Beijing Shanghai Tianjin