protectedフィールド
| 日本語 | 保護フィールド |
| 英語 | protected field |
| ふりがな | ぷろてくてっどふぃーるど |
| フリガナ | プロテクテッドフィールド |
protectedで修飾されたフィールド。
「protected 型 フィールド名;」のように、フィールドの宣言の先頭にprotectedが付けられたフィールド。
protectedフィールドは「パッケージの異なるクラスからアクセスすることができない」という制限が設けられている。ただし、パッケージが異なっていても「サブクラスからのアクセス」は許可されている。それ以外は、publicフィールドと同様。
「サブクラスからアクセスできる」というメリットがあるため、「同クラスのメソッドからアクセスするのと同じように、サブクラスからもアクセスしたい」場合にフィールドをprotectedにする。
だが、これは単なる「見た目の利便性」だけである。「同パッケージからアクセスできる」「サブクラスからアクセスできる」点を考えると、publicフィールド並にセキュリティが甘いと考えるべきであり、protectedフィールドを作ることは推奨しない。フィールドは全てprivateフィールドとし、模試必要ならprotectedフィールドの代わりとしてprotectedメソッドのgetter/setterを用意すればよい。
「protected 型 フィールド名;」のように、フィールドの宣言の先頭にprotectedが付けられたフィールド。
protectedフィールドは「パッケージの異なるクラスからアクセスすることができない」という制限が設けられている。ただし、パッケージが異なっていても「サブクラスからのアクセス」は許可されている。それ以外は、publicフィールドと同様。
「サブクラスからアクセスできる」というメリットがあるため、「同クラスのメソッドからアクセスするのと同じように、サブクラスからもアクセスしたい」場合にフィールドをprotectedにする。
だが、これは単なる「見た目の利便性」だけである。「同パッケージからアクセスできる」「サブクラスからアクセスできる」点を考えると、publicフィールド並にセキュリティが甘いと考えるべきであり、protectedフィールドを作ることは推奨しない。フィールドは全てprivateフィールドとし、模試必要ならprotectedフィールドの代わりとしてprotectedメソッドのgetter/setterを用意すればよい。
参考サイト
- (参考サイトはありません)
// Sample.java
// testパッケージのOtherPackageClassクラスを使用します。
import test.OtherPackageClass;
public class Sample
{
public static void main( String[] args )
{
// 同パッケージのクラスの場合。
NormalClass normalClass = new NormalClass();
// protectedフィールドを別クラスからアクセスします。
normalClass.data = 100;
System.out.println( normalClass.data );
// 100
// このように、普通にアクセスできます。
// 他のパッケージのクラスの場合。
OtherPackageClass otherPackageClass = new OtherPackageClass();
// otherPackageClass.data = 100;
// コンパイルエラー:
// フィールド otherPackageClass.data は不可視です。
// サブクラスを使用します。
ExtendedOtherPackageClass extendedOtherPackageClass = new ExtendedOtherPackageClass();
extendedOtherPackageClass.setData( 200 );
System.out.println( extendedOtherPackageClass.getData() );
// 200
// このように、サブクラスのメソッドからはアクセスできます。
}
}
/**
* フツーのクラス。
*/
class NormalClass
{
/**
* protectedフィールド。
*/
protected int data;
}
/**
* OtherPackageClassのサブクラス。
*/
class ExtendedOtherPackageClass extends OtherPackageClass
{
/**
* setter
*/
protected void setData( int i )
{
// スーパークラスOtherPackageClassの
// dataフィールドに値をセットします。
data = i;
}
/**
* getter
*/
protected int getData()
{
// スーパークラスOtherPackageClassの
// dataフィールドから値を取得します。
return data;
}
}
// test/OtherPackageClass.java
package test;
/**
* フツーのクラス。
*/
public class OtherPackageClass
{
/**
* protectedフィールド。
*/
protected int data;
}
// testパッケージのOtherPackageClassクラスを使用します。
import test.OtherPackageClass;
public class Sample
{
public static void main( String[] args )
{
// 同パッケージのクラスの場合。
NormalClass normalClass = new NormalClass();
// protectedフィールドを別クラスからアクセスします。
normalClass.data = 100;
System.out.println( normalClass.data );
// 100
// このように、普通にアクセスできます。
// 他のパッケージのクラスの場合。
OtherPackageClass otherPackageClass = new OtherPackageClass();
// otherPackageClass.data = 100;
// コンパイルエラー:
// フィールド otherPackageClass.data は不可視です。
// サブクラスを使用します。
ExtendedOtherPackageClass extendedOtherPackageClass = new ExtendedOtherPackageClass();
extendedOtherPackageClass.setData( 200 );
System.out.println( extendedOtherPackageClass.getData() );
// 200
// このように、サブクラスのメソッドからはアクセスできます。
}
}
/**
* フツーのクラス。
*/
class NormalClass
{
/**
* protectedフィールド。
*/
protected int data;
}
/**
* OtherPackageClassのサブクラス。
*/
class ExtendedOtherPackageClass extends OtherPackageClass
{
/**
* setter
*/
protected void setData( int i )
{
// スーパークラスOtherPackageClassの
// dataフィールドに値をセットします。
data = i;
}
/**
* getter
*/
protected int getData()
{
// スーパークラスOtherPackageClassの
// dataフィールドから値を取得します。
return data;
}
}
// test/OtherPackageClass.java
package test;
/**
* フツーのクラス。
*/
public class OtherPackageClass
{
/**
* protectedフィールド。
*/
protected int data;
}
// Sample.java
// testパッケージのOtherPackageClassクラスを使用します。
import test.OtherPackageClass;
public class Sample
{
public static void main( String[] args )
{
// 同パッケージのクラスの場合。
NormalClass normalClass = new NormalClass();
// protectedフィールドを別クラスからアクセスします。
normalClass.data = 100;
System.out.println( normalClass.data );
// 100
// このように、普通にアクセスできます。
// 他のパッケージのクラスの場合。
OtherPackageClass otherPackageClass = new OtherPackageClass();
// otherPackageClass.data = 100;
// コンパイルエラー:
// フィールド otherPackageClass.data は不可視です。
// サブクラスを使用します。
ExtendedOtherPackageClass extendedOtherPackageClass = new ExtendedOtherPackageClass();
extendedOtherPackageClass.setData( 200 );
System.out.println( extendedOtherPackageClass.getData() );
// 200
// このように、サブクラスのメソッドからはアクセスできます。
}
}
/**
* フツーのクラス。
*/
class NormalClass
{
/**
* protectedフィールド。
*/
protected int data;
}
/**
* OtherPackageClassのサブクラス。
*/
class ExtendedOtherPackageClass extends OtherPackageClass
{
/**
* setter
*/
protected void setData( int i )
{
// スーパークラスOtherPackageClassの
// dataフィールドに値をセットします。
data = i;
}
/**
* getter
*/
protected int getData()
{
// スーパークラスOtherPackageClassの
// dataフィールドから値を取得します。
return data;
}
}
// test/OtherPackageClass.java
package test;
/**
* フツーのクラス。
*/
public class OtherPackageClass
{
/**
* protectedフィールド。
*/
protected int data;
}




