10.内部クラス、ソース・ファイル・ルールおよびパッケージ

6359 ワード


1.内部クラス
Java内部クラスとJavaで内部クラスを使用する理由を参照してください.
内部クラスの2つの役割:
  • 一般クラスは、別のクラスのprivate権限にアクセスできませんが、内部クラスは可能です.
  • は多重継承を実現することができる.
                 new B.C();
              ,     
    B b = new B();  
    B.C c = b.new C();
    
  • 2.ソース・ファイル・ルール
  • ソースファイルにはpublicクラス
  • しかありません.
  • ソースファイルには、複数の非publicクラス
  • があり得る
  • ソースファイルの名前はpublicクラスのクラス名と一致する必要があります.たとえば、ソースファイルのpublicクラスのクラス名がEmployeeである場合、ソースファイルの名前はEmployee.javaとします.
  • クラスがパッケージに定義されている場合、package文はソースファイルの最初の行にある必要があります.
  • ソースファイルにimport文が含まれている場合は、package文とクラス定義の間に配置する必要があります.
  • package文がない場合、import文はソースファイルの一番前にあるはずです.
  • import文とpackage文は、ソースファイルで定義されているすべてのクラスに有効です.
  • 同じソースファイルでは、異なるクラスの異なるパッケージに宣言できません.
  • クラスにはいくつかのアクセスレベルがあり、クラスには抽象クラスやfinalクラスなど、異なるタイプがあります.これらは、アクセス制御の章で説明します.
  • 上記のいくつかのタイプに加えて、Javaには内部クラス、匿名クラスなどの特殊なクラスがあります.
  • 3.パッケージパッケージ
    クラスをよりよく組織するために、Javaはクラス名のネーミングスペースを区別するためのパッケージメカニズムを提供します.
    3.1パッケージの役割
  • 機能が類似または関連するクラスまたはインタフェースを同じパッケージに整理し、クラスの検索と使用を容易にする.
  • はフォルダのように、パッケージもツリーディレクトリの格納方式を採用しています.同じパッケージのクラス名は異なり、異なるパッケージのクラス名は同じでもよく、2つの異なるパッケージの同じクラス名のクラスを同時に呼び出す場合は、パッケージ名を付けて区別する必要があります.したがって、パッケージは名前の競合を回避できます.
  • パケットは、パケットのアクセス権を持つクラスがパケット内のクラスにアクセスできるようにアクセス権を制限します.
  • Javaがパッケージ(package)を使用するメカニズムは、ネーミング競合、アクセス制御を防止するために、クラス(class)、インタフェース、列挙(enumerations)、注釈(annotation)などを検索および位置決めするために提供される.
    パッケージ文の構文形式は次のとおりです.
    package pkg1[.pkg2[.pkg3…]];
    
    たとえば、Something.javaファイルの内容
    package net.java.util
    public class Something{
       ...
    }
    
    では、そのパスはnet/java/util/Something.javaのように保存されているはずです.パッケージ(パッケージ)の役割は、異なるjavaプログラムを分類して保存し、他のjavaプログラムに呼び出されやすくすることです.
    パッケージ(package)は、クラス、インタフェース、列挙、注釈のグループとして定義され、これらのタイプにアクセス保護とネーミングスペース管理の機能を提供します.
    以下はJavaのパッケージです.
    java.lang-      
    java.io-           
    
    開発者は,クラスやインタフェースのセットなどを自分でパッケージ化し,自分のパッケージを定義することができる.また、実際の開発では、クラスの実装を自分で完了した後、関連するクラスをグループ化することで、他のプログラマがどのクラス、インタフェース、列挙、注釈などが関連しているかを容易に特定することができます.
    パケットは新しいネーミングスペース(namespace)を作成するため、他のパケットの名前と名前の競合は発生しません.パッケージというメカニズムを使用すると、アクセス制御が容易になり、関連クラスの位置決めが簡単になります.
    3.2パッケージの作成
    パッケージを作成するときは、このパッケージに適切な名前を付ける必要があります.その後、他のソースファイルにこのパッケージが提供するクラス、インタフェース、列挙、またはコメントタイプが含まれている場合は、このパッケージの宣言をソースファイルの先頭に置く必要があります.
    パッケージ宣言はソースファイルの最初の行にある必要があります.各ソースファイルにはパッケージ宣言が1つしかありません.このファイルの各タイプが適用されます.
    ソースファイルにパケット宣言が使用されていない場合、クラス、関数、列挙、注釈などは無名のパケットに格納されます.
    3.3 importキーワード
    パッケージのメンバーを使用できるようにするには、Javaプログラムにパッケージを明確にインポートする必要があります.この機能を完了するには、import文を使用します.
    Javaソースファイルのimport文はpackage文の後にある必要があります.すべてのクラスの定義の前に、なくてもよいし、複数あってもよいし、構文フォーマットは次のとおりです.
    import package1[.package2…].(classname|*);
    
    1つのパッケージで、1つのクラスが本パッケージの別のクラスを使用する場合は、パッケージ名を省略できます.
    例:次のpayrollパッケージにはすでにEmployeeクラスが含まれており、次にpayrollパッケージにBossクラスを追加します.BossクラスがEmployeeクラスを参照する場合はpayroll接頭辞を使用しなくてもよいが、Bossクラスの例は以下の通りである.
    package payroll;
    
    public class Boss
    {
       public void payEmployee(Employee e)
       {
          e.mailCheck();
       }
    }
    
    もしボスクラスがpayrollパッケージに含まれていなかったらどうなりますか?Bossクラスは、次の方法のいずれかを使用して、他のパッケージのクラスを参照する必要があります.
  • クラスフルネーム記述を使用する、例えば、payroll.Employee
  • .
  • はimportキーワードで導入され、ワイルドカード「*」を使用します.たとえば、import payroll.*;
  • です.
  • importキーワードを使用してEmployeeクラスを導入:import payroll.Employee;
  • 注意:クラスファイルには任意の数のimport宣言が含まれます.import宣言は、パッケージ宣言の後、クラス宣言の前にする必要があります.
    3.4パッケージのディレクトリ構造
    クラスをパッケージに配置すると、2つの主要な結果が得られます.
  • パッケージ名は、前述したようにクラス名の一部となります.
  • パケット名は、対応するバイトコードが存在するディレクトリ構造と一致する必要があります.
  • 次は、自分のjava内のファイルを管理する簡単な方法です.
  • クラス、インタフェースなどのソースコードをテキストに配置します.このファイルの名前はこのタイプの名前で、.javaを拡張子とします.例:
    //     :  Car.java
    
    package vehicle;
    
    public class Car {
       //      
    }
    
  • 次に、クラスが存在するパッケージの名前に対応するソースファイルを1つのディレクトリに配置します.
    ....\vehicle\Car.java
    
  • 現在、正しいクラス名とパスは、
       -> vehicle.Car
        -> vehicle\Car.java (  windows    )
    
  • のようになります.
    通常、ある会社はインターネットドメイン名の逆形式をパッケージ名として使用します.例えば、インターネットドメイン名はrimi.comで、すべてのパッケージ名はcom.rimiで始まります.パッケージ名の各セクションは、サブディレクトリに対応します.
    たとえば、JavaBasic.javaというソースファイルを含むcom.rimi.testのパッケージがあります.それに対応して、次のサブディレクトリの一連があります.
    ....\com\rimi\test\JavaBasic.java
    
    コンパイルするとき、コンパイラはパッケージで定義されたクラス、インタフェースなどのタイプごとに異なる出力ファイルを作成し、出力ファイルの名前はこのタイプの名前であり、拡張接尾辞として.classを付けます.例:
    //    : JavaBasic.java
    
    package com.rimi.test;
    public class JavaBasic {
    
    }
    class Google {
    
    }
    
    次に、-dオプションを使用してこのファイルをコンパイルします.
    $javac -d . JavaBasic.java
    
    コンパイルされたファイルは、次のように配置されます.
    .\com\rimi\test\JavaBasic.class
    .\com\rimi\test\Google.class
    
    以下のように、すべてのcomrimitestで定義されているクラス、インタフェースなどをインポートできます.
    import com.rimi.test.*;
    
    コンパイル後の.classファイルは.javaソースファイルと同様に、それらが配置されたディレクトリはパッケージの名前に対応する必要があります.ただし、.classファイルのパスは、対応する.javaのパスと同じである必要はありません.ソースコードとクラスのディレクトリを別々に手配することができます.
    \sources\com\rimi\test\JavaBasic.java
    \classes\com\rimi\test\Google.class
    
    これにより、自分のソースコードを明らかにすることなく、クラスディレクトリを他のプログラマーに共有することができます.この方法でソースコードとクラスファイルを管理すると、コンパイラとjava仮想マシン(JVM)がプログラムで使用しているすべてのタイプを見つけることができます.
    クラスディレクトリの絶対パスをclass pathと言います.システム変数CLASSSPATHに設定します.コンパイラとjava仮想マシンは、package名をclass pathに追加することによって.classファイルのパスを構築します.
    classesはclass path、packageの名前はcom.rimi.test、コンパイラとJVMはclassescomrimitestで.classファイルを探します.
    1つのclass pathにはいくつかのパスが含まれている可能性があります.マルチパスはセパレータで区切らなければなりません.デフォルトでは、コンパイラとJVMは現在のディレクトリを検索します.JARファイルはJavaプラットフォームに関連するクラスが含まれているため、ディレクトリはclass pathにデフォルト設定されています.
    3.5 CLASSSPATHシステム変数の設定
    現在のCLASSSPATH変数を次のコマンドで表示します.
  • Windowsプラットフォーム(DOSコマンドライン下):C:>set CLASSPTH
  • UNIXプラットフォーム(Bourne shell下):echo$CLASSPATH
  • 現在のCLASSSPATH変数の内容を削除します.
  • Windowsプラットフォーム(DOSコマンドライン下):C:>set CLASSSPATH=
  • UNIXプラットフォーム(Bourne shell下):unset CLASSSPATH;export CLASSPATH
  • CLASSSPATH変数の設定:
  • Windowsプラットフォーム(DOSコマンドライン下):C:>set CLASSPATH=C:usersjackjavaclasses
  • UNIXプラットフォーム(Bourne shell下):CLASSSPATH=/home/jack/java/classes;export CLASSPATH