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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

2回答

4813閲覧

指定したURLからHTMLを取得するプログラムに関する初歩的な質問(java)

Gatmaster

総合スコア13

Java

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

0グッド

0クリップ

投稿2016/06/23 16:59

編集2016/06/23 17:07

java学習初心者です。
下記のような指定したURLからHTMLを取得するプログラムのコードでわからないことがあります(このコードはネットから引用)。
http://d.hatena.ne.jp/n_euler666/20070919/1190189499

###該当のソースコード

import java.io.*; import java.net.*; import javax.swing.*; public class html_getter { public static void main(String[] args){ Object o1 = null; try { o1 = new Getter5(new URL("http://www.google.com/")); } catch (MalformedURLException e) { e.printStackTrace(); } ((Getter5)o1).Show(); } } class Getter5{ private String charset = "Shift_JIS"; private JTextArea htmlArea; public Getter5(URL url){ htmlArea = new JTextArea(); try { URLConnection uc = url.openConnection(); BufferedInputStream bis = new BufferedInputStream(uc.getInputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(bis, charset)); htmlArea.setText(""); String line; while ((line = br.readLine()) != null) { htmlArea.append(line + "\n"); } } catch (MalformedURLException ex) { htmlArea.setText("URLが不正です。"); ex.printStackTrace(); } catch (UnknownHostException ex) { htmlArea.setText("サイトが見つかりません。"); } catch (IOException ex) { ex.printStackTrace(); } } public void Show(){ System.out.println(htmlArea.getText()); } }

((Getter5)o1).Show();
↑これは何がどうなってるのでしょうか
o1.Show();
ではだめなのでしょうか(これだとシンボルが見つからないというエラーになります)
Getter5.Show()ではいけないのはわかります(インスタンスメソッドだから)
だからGetter5クラスのインスタンスであるo1を使って01.show()にすれば問題ないと思うのですが・・・

ちなみにこのソースコードについて勉強している理由は、ネット上の画像を自動的に保存するプログラムを作りたいと考えたからです。
URLを指定→HTMLを取得→HTMLから画像リンクのURLを何個か探して取得→そのURL先の画像を順次保存
というのができるかなと考えました

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

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

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

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

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

kei344

2016/06/23 17:01

引用はURLを提示ください。また、コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
Gatmaster

2016/06/23 17:08

ご指摘ありがとうございます。修正させていただきました。
guest

回答2

0

o1 = new Getter5(new URL("http://www.google.com/"));

この部分は、たしかにGetter5型のオブジェクトを生成しています。しかし、Object型の変数に代入しています。言い換えると、サブクラス型のオブジェクトを生成して、スーパークラス型の変数に代入していると言えます。

スーパークラスからは、サブクラスに固有のメソッドを呼ぶことはできません。アクセスできるのは、スーパークラスが持っているものだけです。なので、Objectクラスは、Showメソッドを呼ぶことができません。

もちろん、変数o1には、Getter5のデータが入っています。ただ、Showメソッドは呼べないだけです。呼べるようにするには、o1をGetter5として扱ってやる必要があります。そのために、(Getter5)と書き加えて、一時的に型をGetter5として扱うようにしています。これをキャストと言います。

しかしながら、この例では、o1をそもそもGetter5型で宣言していれば、キャストも必要ありませんし、問題も生じないと思います。

投稿2016/06/23 17:33

search_search

総合スコア187

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

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

Gatmaster

2016/06/23 17:39

回答ありがとうございます! >言い換えると、サブクラス型のオブジェクトを生成して、スーパークラス型の変数に代入していると言えます。 >スーパークラスからは、サブクラスに固有のメソッドを呼ぶことはできません。 すごくわかりやすいです。こんな質問に丁寧に答えてくださってありがとうございますm(_ _;m)三(m;_ _)m
guest

0

ベストアンサー

o1はObjectとして宣言してあるため、o1からメソッドを使おうとする場合、Objectクラスのメソッドしか使えません(equals,clone,hashcodeなど)。
(Getter5)o1によってGetter5という型にキャストすることで、Getter5クラスの持つメソッドなどが使えるようになるのです。

投稿2016/06/23 17:14

swordone

総合スコア20651

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

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

Gatmaster

2016/06/23 17:22

Object o1 = null; オブジェクトクラス型の変数o1を作成 o1 = new Getter5(new URL("http://www.google.com/")); 変数o1にGetter5クラスのオブジェクト(インスタンス)を代入 なのでo1はGetter5クラスのインスタンスなのかなと思っていましたが・・・違うようですね。 キャストという単語を初めて知りました。まだまだ勉強不足でした。 ありがとうございます!これらについて調べて理解を深めていきたいと思います。
swordone

2016/06/23 17:28

Getter5クラスのインスタンスであることに間違いはありません。しかしObject型の変数に入っている以上、Objectの持つ情報しか見えない状態になっているため、Object型のメソッドしか使えないのです。 Objectにはあらゆる参照型が入れられるため、その実態をいちいち気にしてコーディングはさせないのです。あくまで「その変数の型で扱えるメソッド」だけが使える仕組みなのです。そして、それはポリモーフィズムに通じています。
Gatmaster

2016/06/23 17:35

素早い回答ありがとうございます^^ >「その変数の型で扱えるメソッド」だけが使える仕組み すごくわかりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問