学校の課題で電卓を作っています。
dentaku.BOはabstractではなく、java.awtevent.ActionListener内の abstractメソッド actionPerformed(java.awt.event.ActionEvent) をオーバーライドしません

というエラーと、


互換性のない型
検出値:java.lang.String
期待値:boolean
if(fugo="+")
^


と、


演算子 - はjava.lang.String,java.lang.String に適応出来ません

str= num1-num2;
^

この3種類のエラーはざくざく出てくるのですが、具体的にどう修正したらいいのか分かりません。どなたか教えてくださいm(_ _)m
ソース載せようとしたら文字数オーバーしてしまいましたorz

このQ&Aに関連する最新のQ&A

A 回答 (6件)

#1です。


> kekka= num1+num2;
> Integer.toString(kekka); //kekkaをStringに変換
> str = kekka;
> 検出値:int 期待値:~String で出てきてしまって

#1の補足について回答しようと思いましたが
#3の方が回答していましたね。
str = kekka;
ここで指定しているkekkaはint型だからString型にはいれられません。
えい、おまけだぁ。
str = Integer.toString(kekka); //kekkaをStringに変換
    • good
    • 0

専門家に突っ込むのもちょっとアレかと思いつつ:


C/C++ ならともかく, Java では「条件式が必要なところで比較と間違えて代入を書く」とほとんどの場合にエラーになります. だから, あんまり
1==a のように書く
必要性はありません. ただし間違っていてしかもエラーにならないときは盛大なバグのもとになるのでそれはそれで要注意です.
とはいえ, この比較って「不自然」だよなぁ.
む, 「演算子 - はjava.lang.String,java.lang.String に適応出来ません」ってメッセージも (本当なら) おそらく誤訳. 意味としては adopt じゃなくて apply なので, 「適応」ではなく「適用」のはずだ.
    • good
    • 0

> if(fugo="+")


の部分についてです。

他の方からのアドバイスで if(fugo.equals("+")) に修正されたようなので良いですが・・・。

if(fugo="+") というのは比較ではなく、「変数fugoに"+"を代入する」という代入演算子です。
2つのものが同じかどうか比較するための演算子は == です。

仮に変数aがint値だったとすると if(a==1) と記述しなければなりません。
些細な記述の違いですが、仕事でJavaのコーディングをしている人間でもたまに記述ミスをして、これがなかなか厄介なバグになることもあるので今後は注意して下さいね。

もし比較演算子を使うことがあれば、

if(1==a)

と書くのも1つの予防策になります。
[(1=a)と書き間違えても、数値に変数は代入できないのでコンパイルエラーが発生します。]
    • good
    • 0

> 修正前はvoid actionPerformed(ActionEvent e)ってなってたんですが、略(?)したのがいけなかったのか・・・?



パッケージ名を略してActionEventとだけ書くなら、前のほうに
import java.awt.event.ActionEvent;
とか
import java.awt.event.*;
と予め書いておく必要があります。
修正前は「ActionEventというクラスが見つからない」という意味のエラーが出ていませんでしたか?

> Integer.toString(kekka); //kekkaをStringに変換
> str = kekka;

上のコードでは、toString()の返り値(= String型への変換結果)を使わずに捨ててしまっています。返り値を捨てずに変数strに代入してください。
toString()を実行しても、kekkaという変数の型がStringに変わるわけではありません。
    • good
    • 0

> dentaku.BOはabstractではなく、java.awtevent.ActionListener内の abstractメソッド actionPerformed(java.awt.event.ActionEvent) をオーバーライドしません



dentaku.BOクラスの定義に implements ActionListener と書いてあるのだろうと思われます。
- もし必要がないのであれば、dentaku.BOクラスの定義から implements ActionListener を消してしまってください。
- ActionListenerをimplementsする必要があるのであれば、dentaku.BOクラスの中で、void actionPerformed(java.awt.event.ActionEvent)という型のメソッドを自分で定義しましょう。
    • good
    • 0
この回答へのお礼

エラーがなくなりました。丁寧な指示、ありがとうございます!
implements ActionListener は残したまま、void actionPerformed(java.awt.event.ActionEvent)を追加しました。修正前はvoid actionPerformed(ActionEvent e)ってなってたんですが、略(?)したのがいけなかったのか・・・?

お礼日時:2009/05/17 22:13

回答じゃなくてヒントのみ。


> 検出値:java.lang.String
> 期待値:boolean
> if(fugo="+")
『if()の中はboolean値を期待しているのに、String値がはいってるよ。』
fugoはString型でしょうか?
Stringの比較はequals()メソッドを使えばいいよ。

> str= num1-num2;
『演算子 - の結果はStringにいれられないよ。』
strはString型でしょうか?
strをnum1、num2と同じ型にするか、
結果をString型に変換してからstrにいれればいいよ。

この回答への補足

equalメソッドを使って、

if(fugo.equals("+")){
//fugoが+だった時num1とnum2を足す
kekka= num1+num2;
Integer.toString(kekka); //kekkaをStringに変換
str = kekka;}

こんな感じにしたらfugo=+の問題は解決しました。ありがとうございますm(_ _)m
ですが、その後も互換性のない型のエラーが
検出値:int 期待値:~String で出てきてしまって、toString()を使ってみたんですが、うまくいかず…。どの辺が間違っているのでしょうか? 

補足日時:2009/05/17 21:37
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエラー(互換性の無い型)

はじめましてsunoftaiyoと申します。このカテゴリでは初めての質問です。
これからどうぞよろしく御願いします。
早速なのですが
tokuten.txtという30個の数字が羅列されたテキストを読み込み、合計点と平均点を表示するプログラムについてなのですが

import java.io.*;
public class yomikomi03 {
public static void main(String[] args) throws IOException {
try{
BufferedReader br = new BufferedReader(new FileReader("tokuten.txt"));

String tokuten[] = new String[29];
String t[] = new String[29];

int a=0;

for(int i=0;i<29;i++) {
tokuten[i] = br.readLine();
t[i] = Integer.parseInt(tokuten[i]);
}

for(int j=1;j<29;j++) {
a = a + tokuten[j];
}

int b = a/30;

System.out.println("合計点は" + a);
System.out.println("平均点は" + b);

}
catch(FileNotFoundException e) {
System.out.println("ファイルが見つかりません。");
}
}
}


というソースでコンパイルすると

yomikomi03.java:14: 互換性のない型
検出値 : int
期待値 : java.lang.String
t[i] = Integer.parseInt(tokuten[i]);
^
yomikomi03.java:18: 互換性のない型
検出値 : java.lang.String
期待値 : int
a = a + tokuten[j];
^

とでます。どのように対処すればよいでしょう?

はじめましてsunoftaiyoと申します。このカテゴリでは初めての質問です。
これからどうぞよろしく御願いします。
早速なのですが
tokuten.txtという30個の数字が羅列されたテキストを読み込み、合計点と平均点を表示するプログラムについてなのですが

import java.io.*;
public class yomikomi03 {
public static void main(String[] args) throws IOException {
try{
BufferedReader br = new BufferedReader(new FileReader("tokuten.txt"));

String tokuten[] = new String[29];
String t[] = ne...続きを読む

Aベストアンサー

まず、エラーメッセージで「互換性がない」と言ってますので、
何かと何かの間の話(代入、変換など)と想像できます。
で、それは
yomikomi03.java の14行目だということがわかります。

さらに、
検出値 : int
期待値 : java.lang.String
とあるので、int型とString型で互換性がないと言っているのだとわかります。

14行目は
t[i] = Integer.parseInt(tokuten[i]);
ですが、t[i]の宣言を見てみると、

String t[] = new String[29];

となっていてString型です。

また、Integer.parseIntは、ドキュメントを見るとint型を返すことがわかります。
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/Integer.html#parseInt(java.lang.String)

つまり、intをStringに代入しようとしたために出たエラーなわけです。


もう一つの、
yomikomi03.java:18: 互換性のない型
に関しても、tokutenがString型で、
「intとStringを足した結果をintに代入」
しようとしたために発生しています。

以上のことを考えてプログラムを見直せば、自力で修正出来ると思います。

まず、エラーメッセージで「互換性がない」と言ってますので、
何かと何かの間の話(代入、変換など)と想像できます。
で、それは
yomikomi03.java の14行目だということがわかります。

さらに、
検出値 : int
期待値 : java.lang.String
とあるので、int型とString型で互換性がないと言っているのだとわかります。

14行目は
t[i] = Integer.parseInt(tokuten[i]);
ですが、t[i]の宣言を見てみると、

String t[] = new String[29];

となっていてString型です。

また、Integer.parseIntは...続きを読む

Qforループの評価(条件)式について

以下のようなソースを書きました。
するとEclipseが「演算子<は引数の型int,Stringで未定義です」というエラーを出します。
エラーになる箇所は、下の方のループのroadInfoPo[5]を条件式にしている部分と、roadInfoPo[pointer+1]を条件指定としている部分です。
ループの評価をする条件式に、配列が指定できないとは考えにくいのですが。
私はまだまだJava初心者PGです。
おまえけに一人で作業をしており、周囲にJavaが分かる人もいません。
どうしたら解消できるのか、どなたか教えてくださいませm(__)m
よろしくお願い致しますm(__)m

roadInfoCountはint型です。
roadInfoValuesは長い文字列のString型です。

for (int j=1; j<=roadInfoCount; j++) {
String[] roadInfoPo = roadInfoValues[j].split(",");

//<re>
Element re = document.createElement("re");
re.setAttribute("tp", roadInfoPo[0]);
re.setAttribute("dv", roadInfoPo[1]);
re.setAttribute("tt", roadInfoPo[2]);
re.setAttribute("ds", roadInfoPo[3]);
re.setAttribute("co", roadInfoPo[4]);
rt.appendChild(re);

//<sn>
Element sn=document.createElement("sn");
sn.appendChild(document.createTextNode(roadInfoPo[5]));
re.appendChild(sn);

int pointer = 6;

for (int k=0; k<roadInfoPo[5]; k++) {
String tp = roadInfoPo[pointer];
String pn = roadInfoPo[pointer+1];
for (int n=0; n<roadInfoPo[pointer+1]; n++) {

}

}

以下のようなソースを書きました。
するとEclipseが「演算子<は引数の型int,Stringで未定義です」というエラーを出します。
エラーになる箇所は、下の方のループのroadInfoPo[5]を条件式にしている部分と、roadInfoPo[pointer+1]を条件指定としている部分です。
ループの評価をする条件式に、配列が指定できないとは考えにくいのですが。
私はまだまだJava初心者PGです。
おまえけに一人で作業をしており、周囲にJavaが分かる人もいません。
どうしたら解消できるのか、どなたか教えてくださいませm(__)m
...続きを読む

Aベストアンサー

エラーになっている、for文内の比較で、int と String を比較しているのでエラーになっています。
演算子 "<" で比較するには、int と int のように数値で比較しないとコンパイルエラーになります。
roadInfoPo[5] の中身が、たとえ "3" のような数字であったとしても、Java から見ると文字列なので、k の値と"<"で比較することは出来ません。
数値同士で比較するには、Integer.parseInt() といったメソッドを使って、文字列から数値(この場合はint型)へ変換してください。
この場合は、for文を
for (int k=0; k<Integer.parseInt(roadInfoPo[5]); k++)
のように書き換えます。
なお、もしroadInfoPo[5]の中身に数字以外のものがあり、数値へ変換できない場合は、NumberFormatException が発生します。

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

QJava初心者です、エラーの意味が理解できません

今晩は。Java初心者です、宜しくお願いします。
下のようなコードを書きましたが、
「コンストラクタ'sub(int)'は未定義です」、
「/型subのメソッド'disp(int)'は引数()に適用出来ません」というエラーが出ます。
エラーの意味が理解できません。
1.メソッドのみを持ったクラスSubに値をこのような渡し方は不可なのでしょうか。
2.Subには自動的にコンストラクタが生成されないのでしょうか。
  されないとすれば、どの部分の書き方が悪いのでしょうか。
3.「型subのメソッド'disp(int)'への引数の渡し方」は、文法的にまずいということでしょうか。
それとも全てコンストラクタの生成が原因なのでしょうか。

=========================================================================

class Sub
{
void disp(int a)
{
System.out.println("a = " + a );
}
}

public class クラス
{
public static void main(String[] args)
{
Sub s = new Sub(10);//コンストラクタ'sub(int)'は未定義です
s.disp();    //型subのメソッド'disp(int)'は引数()に適用出来ません 
}
}

今晩は。Java初心者です、宜しくお願いします。
下のようなコードを書きましたが、
「コンストラクタ'sub(int)'は未定義です」、
「/型subのメソッド'disp(int)'は引数()に適用出来ません」というエラーが出ます。
エラーの意味が理解できません。
1.メソッドのみを持ったクラスSubに値をこのような渡し方は不可なのでしょうか。
2.Subには自動的にコンストラクタが生成されないのでしょうか。
  されないとすれば、どの部分の書き方が悪いのでしょうか。
3.「型subのメソッド'disp(int)'への引...続きを読む

Aベストアンサー

1.メソッドのみを持ったクラスSubに値をこのような渡し方は不可なのでしょうか。
→問題ないです
 ただし、実現の方法がちょっと違います

2.Subには自動的にコンストラクタが生成されないのでしょうか。
→されます。自動的に生成されるコンストラクタは、”デフォルトコンストラクタ”と呼ばれます。この場合の”デフォルトコンストラクタ”は、”public Sub()”となり、引数がないコンストラクタです(引数がないコンストラクタをデフォルトコンストラクタと呼び出ます)。

  されないとすれば、どの部分の書き方が悪いのでしょうか。

→mainの、Sub s = new sub(10)に対応するコンストラクタを書く必要があります。
 class sub
{
public Sub(int a){
}
}

と書くことで、エラーは解消されます。

3.「型subのメソッド'disp(int)'への引数の渡し方」は、文法的にまずいということでしょうか。
→はい。文法エラーですね。

void disp(int a)
{
System.out.println("a = " + a );
}

というメソッドを定義しているため、必ず、”s.disp(intの値);”で呼び出さないといけません。

”s.disp()”で、呼び出したい場合は、
void disp(){
・・・
}
の形式で書く必要があります。

1.メソッドのみを持ったクラスSubに値をこのような渡し方は不可なのでしょうか。
→問題ないです
 ただし、実現の方法がちょっと違います

2.Subには自動的にコンストラクタが生成されないのでしょうか。
→されます。自動的に生成されるコンストラクタは、”デフォルトコンストラクタ”と呼ばれます。この場合の”デフォルトコンストラクタ”は、”public Sub()”となり、引数がないコンストラクタです(引数がないコンストラクタをデフォルトコンストラクタと呼び出ます)。

  されないとすれば、どの部...続きを読む

Q「httpステータス404」というエラーが出ます。

「httpステータス404」というエラーが出ます。

java初心者です、宜しくお願い致します。
EclipseでServletを書いてやりましたが、以下のようなエラーが出ます、
原因はなんでしょうか、宜しくお願い致します。
「httpステータス404-/Servlet%E7%B7%B4%E7%BF%92/ ServOutput」

Aベストアンサー

Not Found
という意味です。
そのファイルが無い。あるいはリンクが間違っています。
詳しくは参考URLをみてください。

参考URL:http://ja.wikipedia.org/wiki/HTTP_404

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Q一定のスペースを空けて端を揃えて表示

一定のスペースを空けて端を揃えて表示

お世話になります。
一定のスペースを空けて文字を表示したとき、縦に綺麗に揃えて表示したいのですがやり方がわかりません。
例えば、

apple ここに15個分のスペース (2,8) (3,6)
orange ここに15個分のスペース (3,7) (9,8) (2,10)
dog ここに15個分のスペース (3,0)
fortunately ここに15個分のスペース (6,6)

このように、各行の左側には英単語1つ、そして15個分のスペースを空けて、右側にその単語の座標を表示します。
この時に、座標を縦にきれいに揃えて表示したいのですが、英単語の長さによってバラバラになってしまいます。
どのようにスペースをあけて表示すればよいのでしょうか?宜しくお願いします。

Aベストアンサー

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-" + (width - word[i].getBytes(charset).length + word[i].length()) + "s%s%n";
System.out.printf(format, word[i], coord[i]);
}
}

前提として、
与えられた文字がシフトJISで表せるようなもので、
シフトJISで1バイトコードになるものがいわゆる半角(1桁幅)、
2バイトコードになるものがいわゆる全角(2桁幅)となるのなら、
上のようにすることで対処できる。

要点は文字数でなく文字を構成するコードが何バイトかを数えて、
2バイトなら2桁分のスペースを用意する。
これには、getBytesでStringからバイト配列を得てlengthでバイト数を得る。

今度は書式文字列は各行ごとに変わる可能性がある。
widthはword[0]の文字列幅に15スペース分を加えたもの。
"apple"でなく"りんご"なので21になる。
つまり座標の表示は22桁目からということになる。

各行の書式文字列での、
(width - word[i].getBytes(charset).length + word[i].length())
で、バイト数と文字数との差を求めて表示幅から引くことで、
1文字が2桁になる場合に対処している。

書式は使いどころによって便利なもので、
printfで書式出力するところを、
StringクラスのformatメソッドでStringインスタンスにすることもできたりする。

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-...続きを読む

Q非staticフィールドを参照できない理由とは

 java勉強中です、宜しくお願いします。

 下のようなプログラムを書き「Test1」をコメントアウトしたら、
「非staticフィールドをstatic参照できません。」というエラーが
出ました。
 「Test1 t」をグローバル変数で定義したのですが、やはりを
「static」からは見れないということでしょうか。

 「main」は特別な関数というのは分るのですが、staticフィールドとか
クラスオブジェクトしか、main()からは覗けないという設計思想(?)
とかはどのようなものなのでしょうか。

 逆に覗けるのが可能ならばどのような不都合が生じるのでしょうか。

 何かしら非常に不便を感じて使い勝手が悪いという気がして仕方ない
のですが、特別にこうしなけらばならないとか、今までの他の言語であ
った不具合(ex 隠蔽機能)を更に強化したためとかと言う理由があるの
でしょうか。 

==========================================================

public class Test1
{
Test1 t;

void calc()
{
int a = 2;
int b = 3;

System.out.println(a+b);
}

public static void main(String args[])
{
/*Test1*/ t = new Test1();
t.calc();
}
}

 java勉強中です、宜しくお願いします。

 下のようなプログラムを書き「Test1」をコメントアウトしたら、
「非staticフィールドをstatic参照できません。」というエラーが
出ました。
 「Test1 t」をグローバル変数で定義したのですが、やはりを
「static」からは見れないということでしょうか。

 「main」は特別な関数というのは分るのですが、staticフィールドとか
クラスオブジェクトしか、main()からは覗けないという設計思想(?)
とかはどのようなものなのでしょうか。

 逆に覗けるのが可能ならば...続きを読む

Aベストアンサー

> 私が更に疑問を持ったのは、何故javaに「static」という定義(考え方)があるのか、また
> 「main」をstaticにしてやる必要があるのか、という内容についてです。

本当にそういうことを知りたいというよりは、staticなmain()メソッドからインスタンス変数に直接アクセスできないことが不満であるだけのように読めます。

しかし、staticメソッドからでもインスタンス変数にアクセスすることはできるんです。「どのインスタンスが持っているインスタンス変数」にアクセスしたいのかを指定する必要があるだけです。

public static void main(String args[])
{
Test1 x = new Test1();
/* 変数xに代入されているインスタンスのtにアクセスする */
x.t = ~;
}

もっとも、質問文にある内容ならば変数tはmain()メソッドのローカル変数のままにするか、Test1クラスのクラス変数にしてしまえばそれで良さそうです。インスタンス変数にしたい理由がありますか?

public class Test1
{
static Test1 t; /* クラス変数 */

public static void main(String args[])
{
t = new Test1();
t.calc();
}

/* calc()メソッドの定義は省略*/
}

> 私が更に疑問を持ったのは、何故javaに「static」という定義(考え方)があるのか、また
> 「main」をstaticにしてやる必要があるのか、という内容についてです。

本当にそういうことを知りたいというよりは、staticなmain()メソッドからインスタンス変数に直接アクセスできないことが不満であるだけのように読めます。

しかし、staticメソッドからでもインスタンス変数にアクセスすることはできるんです。「どのインスタンスが持っているインスタンス変数」にアクセスしたいのかを指定する必要があるだけです...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報