質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1967閲覧

package private クラスを同じパッケージ内の別ファイルから利用したい

BqtJu2NTTt9iybv

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/06/05 20:34

前提・実現したいこと

入門書でJavaを勉強中の初心者です。

package private クラスの利用方法について質問します。

「package privateクラスの名前はソースファイル名と異なっていてもよく、1つのソースファイルにクラスを複数宣言してもよい」という旨の記述を読んだので、自分でコードを書いてみました。

具体的には、databaseパッケージの中にあるOthers.javaというファイルのHundredクラスとThousandクラス(共にpackage private クラス)を、同じくdatabaseパッケージ内のYokin.javaのクラス内のメソッドから利用するものです。
しかし、コンパイルすると「シンボルを見つけられません」というエラーが出てしまいます。

Yokin.javaからOthers.javaのHundredやThousandクラスを利用するにはどうすればよいのでしょうか?

よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ(コマンドプロンプト)

C:\Users\(ユーザー名)\Atom\sukkiri_java_introduction>javac -encoding UTF-8 Main.java .\database\Yokin.java:7: エラー: シンボルを見つけられません Hundred h = new Hundred(); ^ シンボル: クラス Hundred 場所: クラス Yokin .\database\Yokin.java:7: エラー: シンボルを見つけられません Hundred h = new Hundred(); ^ シンボル: クラス Hundred 場所: クラス Yokin .\database\Yokin.java:13: エラー: シンボルを見つけられません Thousand t = new Thousand(); ^ シンボル: クラス Thousand 場所: クラス Yokin .\database\Yokin.java:13: エラー: シンボルを見つけられません Thousand t = new Thousand(); ^ シンボル: クラス Thousand 場所: クラス Yokin エラー4個 ### 該当のソースコード ```ソースコード Main.java ```ここに言語を入力 import database.Yokin; public class Main { public static void main(String[] args) { Yokin y = new Yokin(); y.hundred(); y.thousand(); } }

Yokin.java

Java

1package database; 2 3public class Yokin { 4 private int yokin; 5 6 public void hundred() { 7 Hundred h = new Hundred(); 8 this.yokin = h.getNumber(); 9 System.out.println("現在の預金額は" + this.yokin + "です。"); 10 } 11 12 public void thousand() { 13 Thousand t = new Thousand(); 14 this.yokin = t.getNumber(); 15 System.out.println("現在の預金額は" + this.yokin + "です。"); 16 } 17}

Others.java

Java

1package database; 2 3class Hundred { 4 private int number = 100; 5 6 int getNumber() { 7 return this.number; 8 } 9} 10 11class Thousand { 12 private int number = 1000; 13 14 int getNumber() { 15 return this.number; 16 } 17}

補足情報

エディタ:Atom 1.47.0 x64
OS: Windows 10 Home 64bit
java 14.0.1

ディレクトリ

sukkiri_java_introduction | |---Main.java | | |---database | |---Yokin.java | |---Others.java

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/06/05 21:19 編集

>java 14.0.1 Java11だとどうでしょう。 たまたまプロジェクト作った時に11だった私の手元では実行できました。 14では確認してません。
m.ts10806

2020/06/05 21:22 編集

Java14でも実行できました。 Eclipse2020-03です。 そもそも今回のようにprivateクラスでない場合、実行できますか?
BqtJu2NTTt9iybv

2020/06/05 21:31

返信ありがとうございます。 OpenJDK11.0.2を入れてコマンドプロンプトからコンパイルしてみましたが、全く同じエラーが出てしまいました。 ただ、Eclipse2020-03(4.15.0)だとなぜか実行できました(Java14)。 Eclipseだとコンパイルできますが、コマンドプロンプトだとできないようです。
m.ts10806

2020/06/05 21:40

あとはeclipseでjarにして実行してみるとかでしょうか。 一応、先に書いたようにprivateクラスでないパターンも試してみてください。
BqtJu2NTTt9iybv

2020/06/05 22:10 編集

eclipseでjarにしてコマンドプロンプトからjavac→javaで実行したところ成功しました。 jarファイルの中身は以下のようになっていました。 META-INF/MANIFEST.MF Main.class database/ database/Yokin.class database/Hundred.class database/Thousand.class また、HundredクラスとThousandクラスをそれぞれHundred.javaとThousand.javaに分け、両者をpublicクラスにして実行してみたところ、これも成功しました(Others.javaはいったんdatabaseディレクトリから外に出しました)。
BqtJu2NTTt9iybv

2020/06/05 23:23

いただいたコメントのおかげで自己解決できました。本当にありがとうございます。
guest

回答1

0

自己解決

自分でもいろいろ試してみたのですが、どうやらmainメソッドが含まれているソースファイル(今回の場合はMain.java)「だけ」をjavacでコンパイルしようとしても、package privateクラス名の部分でエラーが出る仕様のようです。package publicクラスをpublicクラスに変えればコンパイルが通ったからです。

Eclipseだとプロジェクト内のソースファイルを勝手に「すべて」コンパイルしてくれるので、Others.javaも知らぬ間にコンパイルされていてエラーが出なかったようです。

コマンドプロンプトでも、
javac -encoding UTF-8 Main.java database\Yokin.java database\Others.java
とすべてのファイルを指定してコンパイルしたうえで実行すると、きちんと動きました。

コメントいただいた方、本当にありがとうございました。

投稿2020/06/05 23:26

BqtJu2NTTt9iybv

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問