C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: publicをprivateにしても動作する


(過去ログ 10 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■2091 / inTopicNo.1)  publicをprivateにしても動作する
  
□投稿者/ M.Mano (1回)-(2007/03/17(Sat) 23:52:59)

分類:[Java] 

はじめて投稿しますM.Manoと申します。

 あるクラスのパブリックなコンストラクタを
プライベートに変更しても、そのクラスを利用
するクラスから呼べるというものです。

JavaとPCの環境は以下の通りです。
・Java
J2SE 1.4.1_01

・PC
TOSHIBA Satellite Pro
Windows98
166Mhz 64MB

以下にサンプルを示します。

------------------------------------------------Sample.java
1: public class Sample {
2:   public Sample() {
3:     System.out.println("パブリックなコンストラクタです。");
4:   }
5: }

--------------------------------------------TestSample.java
1: public class TestSample {
2:   public static void main(String[] args) {
3:     Sample obj = new Sample();
4:   }
5: }

-----------------------------------------------------------

以上の2つファイルをコンパイルします。
>javac Sample.java
>javac TestSample.java

実行すると以下のメッセージが出力されます。
>java TestSample
パブリックなコンストラクタです。

うまく動作するのを確認して以下を修正します。
・Sample.javaの2行目
2:   private Sample() {

・Sample.javaの3行目
3:     System.out.println("プライベートなコンストラクタです。");

修正したSample.javaをコンパイルします。
>javac Sample.java

実行すると以下のメッセージが出力されます。
>java TestSample
プライベートなコンストラクタです。

ここでTestSample.javaをコンパイルすると、
以下のエラーメッセージが表示されます。
>javac TestSample.java
TestSamle.java:3: Sample() は Sample で private アクセスされます。
    Sample obj = new Sample();
                 ^
エラー 1 個

これは一体何が起きているのでしょうか?
ご教授お願いします。

引用返信 編集キー/
■2092 / inTopicNo.2)  Re[1]: publicをprivateにしても動作する
□投稿者/ επιστημη (442回)-(2007/03/18(Sun) 00:23:40)
επιστημη さんの Web サイト
> >javac TestSample.java
> TestSamle.java:3: Sample() は Sample で private アクセスされます。
> Sample obj = new Sample();
> ^
> エラー 1 個
>
> これは一体何が起きているのでしょうか?

至極当然の挙動ではないかしら。
コンストラクタが private なので new できない。

TestSampleがre-compile前には実行できるのは何故か? ってことでしょうか。
private/publicなどのアクセス指定はcompile時にその可否が判断されるからです。

Sampleのコンストラクタがprivateだろうがpublicだろうが、生成されるバイトコード
上はすべてpublic、privateだとそれが呼べなくなるのが"呼ぶ側"のコンパイル時に
アクセス可否を判断するから。

なのでSample()がpublicだった時点でコンパイルされたTestSampleは依然publicだと思っています。
re-compile時にprivateであることに気づいてエラーという次第。


引用返信 編集キー/
■2093 / inTopicNo.3)  Re[2]: publicをprivateにしても動作する
□投稿者/ M.Mano (2回)-(2007/03/18(Sun) 08:35:24)
ご返答有り難うございます。

> TestSampleがre-compile前には実行できるのは何故か? ってことでしょうか。
そうです。もっと簡潔に書くべきでした。

> private/publicなどのアクセス指定はcompile時にその可否が判断されるからです。
実行時には判断しないのですね。
解決済み
引用返信 編集キー/
■2094 / inTopicNo.4)  Re[3]: publicをprivateにしても動作する
□投稿者/ επιστημη (443回)-(2007/03/18(Sun) 12:03:15)
επιστημη さんの Web サイト
>>private/publicなどのアクセス指定はcompile時にその可否が判断されるからです。
> 実行時には判断しないのですね。

実行時にprivateであるとわかったとしても、対処のしようがありませんし。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -