publicとimport アクセス修飾子 - 萌えJava超入門
第十五章 アクセス修飾子

publicとimport

アクセス修飾子を publicにしたときの動作を
サンプルコードで確認しましょう。

目次

1.アクセス修飾子 public


public修飾子は、
以前にも使ったな。
もう一度整理しておこう。
public(パブリック)は、アクセス制限をしないアクセス修飾子です。
異なるパッケージからのアクセスを許可する唯一のアクセス修飾子です。

public
 修飾子名 アクセス範囲適用対象
 public アクセス制限なし(公開) クラス メンバ

異なるパッケージからのアクセスを許可するには、
classとメンバの両方にpublic拡張子を付与します。
classに publicを付与しても、publicでないメンバにはアクセスできません。

classとメンバの両方をpublicにする
どちらが欠けてもアクセスできない。


2.import(インポート)


import(インポート)
パッケージの異なるクラスにアクセスするには
アクセス元になるクラスで、アクセスするクラスをimportをする必要があります。
importされる classは、publicである必要があります。

publicimportはセットだ。
どちらが欠けてもアクセスできない。
importの手順を踏むことで、
どのパッケージのクラスをインポートしたのかを明示しています。
同名のクラスがあったとしても、取り違えを回避する仕組みです。


よくできてるわね。

importの書式
import パッケージ名.クラス名;
    (packageの後、classの前で宣言します。)
「;」(セミコロン)を忘れないでください。

こんな感じになる。
importの宣言例
package pack_01;
import pk02.KlassPub;
class MainPub{
    //処理
}

importは、呼び出し元で
宣言するのね。


3.サンプルコード


MainPubクラスから、パッケージ外の KlassPubクラスにアクセスしてみましょう。

配置
   ws
    |---pk01
    |     └---MainPub.java  ← mainメソッド
    |
    └---pk02
          └---KlassPub.java  ← say()


//MainPub.java
package pk01;
import pk02.KlassPub;

class MainPub{
    public static void main(String[] args){
        System.out.println("main method.");
        KlassPub.say();
    }
}

//KlassPub.java
package pk02;

public class KlassPub{
    public static void say(){
        System.out.println("pk02.KlassPub");
    }
}

コマンドライン
ws>javac pk01/MainPub.java
ws>java pk01.MainPub
main method.
pk02.KlassPub

MainPubには import
KlassPub.java には
classと sayメソッドそれぞれに
publicが必要だ。


4.NG例 publicでないメソッドを参照


同じ配置で、KlassPubクラスを public、sayメソッドをデフォルトにしてみましょう。

MainPub.java (上と同じです。)
//MainPub.java
package pk01;
import pk02.KlassPub;

class MainPub{
    public static void main(String[] args){
        System.out.println("main method.");
        KlassPub.say();
    }
}

KlassPub.java NG
//KlassPub.java
package pk02;

public class KlassPub{
    static void say(){//アクセス修飾子がデフォルト
        System.out.println("pk02.KlassPub");
    }
}

コマンドライン
ws>javac pk01/MainPub.java
pk01\MainPub.java:9: エラー: KlassPubのsay()はpublicではありません。
  パッケージ外からはアクセスできません
        KlassPub.say();
                ^
エラー1個

KlassPub.java は見つかったが、
publicでないメソッドはダメだそうだ。

5.NG例2 publicでないクラスを参照


同じ配置で、KlassPubクラスをデフォルト、sayメソッドを publicにしてみましょう。

MainPub.java (上と同じです。)
//MainPub.java
package pk01;
import pk02.KlassPub;

class MainPub{
    public static void main(String[] args){
        System.out.println("main method.");
        KlassPub.say();
    }
}

KlassPub.java NG
//KlassPub.java
package pk02;

class KlassPub{//アクセス修飾子がデフォルト
    public static void say(){
        System.out.println("pk02.KlassPub");
    }
}

コマンドライン
ws>javac pk01/MainPub.java
pk01\MainPub.java:3: エラー: pk02のKlassPubはpublicではありません。
  パッケージ外からはアクセスできません
import pk02.KlassPub;
           ^
pk01\MainPub.java:9: エラー: シンボルを見つけられません
        KlassPub.say();
        ^
  シンボル:   変数 KlassPub
  場所: クラス MainPub
エラー2個

「KlassPubはpublicではありません。」
だそうだ。
「パッケージを超えての参照は
importと public×2個」だ。
覚えておいてくれ。
パッケージを超えてたら
importと public×2個!!


お疲れ様でした。


© 2019 awasekagami