Java のオブジェクト指向プログラミングにおけるオブジェクト、参照、内部クラスについての理解

高洛峰
リリース: 2017-01-20 17:36:15
オリジナル
1558 人が閲覧しました

最近、仕事が休みのときに「think in java」を観ましたが、最初に観た時とはかなり違った印象を受けました。次に、Java におけるオブジェクトと参照の関係と内部クラスの概念について話します。
1. Java のすべてはオブジェクトです
Java でオブジェクトを制御するものは何ですか?答えは参照です。これは C または C++ のポインタに似ています。
参照がある場合は、この時点でそれをオブジェクトに関連付ける必要があります。そうでないと、参照は想像どおりに制御できなくなります。たとえば、文字列参照を作成する場合:

String s ;
ログイン後にコピー

関連付けられていません。この時点で String のメソッドを呼び出すなど、何らかの操作を実行すると、間違いなく問題が発生します (一部の基本型を除く、それらの型を定義するときに初期値が割り当てられるため)。したがって、お金を使用するときは、オブジェクトにお金を関連付ける必要があります:

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());
  }
}
ログイン後にコピー




その中で、Content と Gdestination は、外部から呼び出された場合には、よく隠蔽されます。どの特定のクラスがこのクラスに多重継承の特性を持たせるのかまったくわかりません。

apple is ruit!! 
Beijing 
Shanghai 
Tianjin
ログイン後にコピー

Java のオブジェクト指向プログラミングにおけるオブジェクト、参照、内部クラスの理解に関するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート