これまではフィールドを直接扱ってきましたが、実は「フィールドを外から守る」のが正しい作法です。
publicとprivate
フィールドとメソッドには「外から使えない」ようにする設定があります。
/**
* フィールド2つを持つクラス。
*/
class PublicOrPrivateField
{
// int型変数のフィールドです。publicです。
public int dataPublic;
// int型変数のフィールドです。privateです。
private int dataPrivate;
/**
* dataフィールドを出力するメソッドです。
*/
public void printData()
{
// dataPublicフィールドを使用します。
System.out.println( dataPublic );
// dataPrivateフィールドを使用します。
System.out.println( dataPrivate );
// 自クラスのメソッドからならprivateフィールドも
// 使うことができます。
}
}
/**
* 実行用クラス。このクラスを実行してください。
*/
class PublicOrPrivateFieldRunner
{
public static void main( String[] args )
{
// PublicOrPrivateFieldクラスの参照型変数とインスタンスを作ります。
PublicOrPrivateField ref = new PublicOrPrivateField();
// dataPublicフィールドに数値を入れます。
// publicフィールドなので外から使えます。
ref.dataPublic = 100;
// dataPrivateフィールドに数値を入れます。
// ref.dataPrivate = 100;
// コンパイルエラー:
// PublicOrPrivateFieldRunner.java:40:
// dataPrivate は PublicOrPrivateField で private アクセスされます。
// printData()メソッドを呼び出します。
ref.printData();
// 出力結果:
// 100
// 0
// 注:
// フィールドは自動的に0が入れられるので0が出力されます。
}
}
// PublicOrPrivateFieldRunner.java /** * フィールド2つを持つクラス。 */ class PublicOrPrivateField { // int型変数のフィールドです。publicです。 public int dataPublic; // int型変数のフィールドです。privateです。 private int dataPrivate; /** * dataフィールドを出力するメソッドです。 */ public void printData() { // dataPublicフィールドを使用します。 System.out.println( dataPublic ); // dataPrivateフィールドを使用します。 System.out.println( dataPrivate ); // 自クラスのメソッドからならprivateフィールドも // 使うことができます。 } } /** * 実行用クラス。このクラスを実行してください。 */ class PublicOrPrivateFieldRunner { public static void main( String[] args ) { // PublicOrPrivateFieldクラスの参照型変数とインスタンスを作ります。 PublicOrPrivateField ref = new PublicOrPrivateField(); // dataPublicフィールドに数値を入れます。 // publicフィールドなので外から使えます。 ref.dataPublic = 100; // dataPrivateフィールドに数値を入れます。 // ref.dataPrivate = 100; // コンパイルエラー: // PublicOrPrivateFieldRunner.java:40: // dataPrivate は PublicOrPrivateField で private アクセスされます。 // printData()メソッドを呼び出します。 ref.printData(); // 出力結果: // 100 // 0 // 注: // フィールドは自動的に0が入れられるので0が出力されます。 } }
このプログラムのPublicOrPrivateFieldクラスは、前ページのHasMethodAndFieldクラスとほとんど同じです。
HasMethodAndFieldクラスとの違いは、フィールドが2つあって、それぞれにpublicとprivateが付いているという点です。
public int dataPublic;
// int型変数のフィールドです。privateです。
private int dataPrivate;
// int型変数のフィールドです。publicです。 public int dataPublic; // int型変数のフィールドです。privateです。 private int dataPrivate;
dataPublicフィールドの前にはpublic(パブリック)が付いています。
dataPrivateフィールドの前にはprivate(プライベート)が付いています。
フィールドとメソッドには「どこから使えるのか」ということを指定する「アクセス修飾子」というものがあります。
ここで使用しているpublicとprivateがそのアクセス修飾子です。
まず、dataPublicフィールドに付いているpublicから説明しましょう。
publicを付けたフィールドやメソッドは、どこからでも使うことができます。
// publicフィールドなので外から使えます。
ref.dataPublic = 100;
// dataPublicフィールドに数値を入れます。 // publicフィールドなので外から使えます。 ref.dataPublic = 100;
dataPublicフィールドはpublicが付いているので、このようにこれまでと同じように使えます。
次に、dataPrivateフィールドに付いているprivateについて説明しましょう。
privateを付けたフィールドやメソッドは、外から使うことができません。
ref.dataPrivate = 100;
// コンパイルエラー:
// PublicOrPrivateFieldRunner.java:40:
// dataPrivate は PublicOrPrivateField で private アクセスされます。
// dataPrivateフィールドに数値を入れます。 ref.dataPrivate = 100; // コンパイルエラー: // PublicOrPrivateFieldRunner.java:40: // dataPrivate は PublicOrPrivateField で private アクセスされます。
これまでは「参照型変数.フィールド」という形でフィールドを使うことができました。
ところが、privateなフィールドはこの形で使用することができません。
逆に言えば、勝手に触れさせないようにすることができるということです。
じゃあどこからなら使えるのか、というと「自クラスのメソッド」からなら使うことができます。
* dataフィールドを出力するメソッドです。
*/
public void printData()
{
// dataPublicフィールドを使用します。
System.out.println( dataPublic );
// dataPrivateフィールドを使用します。
System.out.println( dataPrivate );
// 自クラスのメソッドからならprivateフィールドも
// 使うことができます。
}
/** * dataフィールドを出力するメソッドです。 */ public void printData() { // dataPublicフィールドを使用します。 System.out.println( dataPublic ); // dataPrivateフィールドを使用します。 System.out.println( dataPrivate ); // 自クラスのメソッドからならprivateフィールドも // 使うことができます。 }
printData()メソッドは、同じクラスのメソッドです。
このメソッドからなら、privateなフィールドを使うことができます。なので、printData()メソッドからdataPrivateフィールドを使うことができます。
また、当然publicなフィールドの、dataPublicフィールドも使えます。
ようするに、privateにすれば「外から守れる」ということです。
これが実は便利な機能だったりします。
「省略」とpublicは同じ?
前ページまでは、publicやprivateといったアクセス修飾子を省略していました。
アクセス修飾子を省略すると、使える範囲がpublicやprivateとも違う特殊な範囲となります。
ここまでの例では特に問題がないため省略してきましたが、ここからの説明ではpublicやprivateを使用します。アクセス修飾子の省略は慣習的に勧められていないので、これからはpublicやprivateを必ず付けるようにしましょう。