オブジェクト指向プログラミング(OOP)
JAVAを勉強しているので備忘録。
オブジェクト指向をなかなか理解できないので自分なりにまとめてみました。
javaのSwingを使ってGUIを作成しました。
テキストボックスに文字を入れてボタンを押すと、>>>の場所にHello,+「入力値」を表示する処理。
・ベタ書きで書いた場合
//Java
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class JframeHello extends JFrame implements ActionListener{
JLabel askLabel;
JLabel ansLabel;
JTextField text;
public static void main(String[] args) {
JframeHellow frame = new JframeHellow("myTitle");
frame.setVisible(true);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public JframeHello(String title){
this.setSize(1208, 748);
JPanel panel = new JPanel();
this.askLabel = new JLabel("あなたの名前を入力して下さい");
this.ansLabel = new JLabel(">>>");
this.text = new JTextField(20);
JButton btn = new JButton("Push Here!");
btn.addActionListener(this);
panel.add(askLabel);
panel.add(text);
panel.add(btn);
panel.add(ansLabel);
this.add(panel,BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent e){
ansLabel.setText(">>>Hello,"+text.getText());
}
}
・オブジェクト指向を意識した場合(上記のコードを元にchatGPTで作成)
JFrameを継承したJframeHello
import java.awt.BorderLayout;
import javax.swing.JFrame;
public class JframeHello extends JFrame {
public static void main(String[] args) {
JframeHellow frame = new JframeHello("myTitle2");
frame.setVisible(true);
}
public JframeHello(String title) {
super(title);
this.setSize(1208, 748);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
initialize();
}
private void initialize() {
add(new GreetingPanel(), BorderLayout.CENTER);
}
}
<解説>
JframeHellow frame = new JframeHello("myTitle2");
JframeHello クラスの中で new JframeHello("myTitle2") として自身のインスタンスを生成していることに関して
→JframeHelloクラス自体が自分自身のインスタンスを生成しているわけではなく、mainメソッドから生成されたJframeHelloオブジェクトが、コンストラクタの中で他の処理を実行している
super(title);
superを使用する理由
→クラスが継承しているときに、インスタンスを生成するとスーパークラスのコンストラクタも呼び出される。呼び出されるのは引数なしのコンストラクタ。JFrameクラスの引数ありコンストラクタを呼び出したいためsuperを使用してる。
this.setSize(1208, 748);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
thisはJFrameHelloのインスタンスを指している。
このクラスはJFrameを継承しているため、thisはJFrameのインスタンスとして機能する
initialize();
}
private void initialize() {
add(new GreetingPanel(), BorderLayout.CENTER);
}
initialize();メソッド
this.add(new GreetingPanel(), BorderLayout.CENTER);でもよい。
・利点
可読性の向上・・・読みやすい
再利用性・・・必要に応じて他の場所からも呼び出せる
保守性の向上・・・将来変更になった場合、initialize()だけ修正すればよい
・thisを省略できる理由
メソッドやフィールドの呼び出しを行う際、同じクラスの中では this を明示的に指定しなくても、コンパイラが自動的に this を前提として解釈する。
GreetingPanel(パネル関連の処理)
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
class GreetingPanel extends JPanel implements ActionListener {
private JLabel askLabel;
private JLabel ansLabel;
private JTextField text;
public GreetingPanel() {
askLabel = new JLabel("あなたの名前を入力して下さい");
ansLabel = new JLabel(">>>");
text = new JTextField(20);
JButton btn = new JButton("Push Here!");
btn.addActionListener(this);
setLayout(new FlowLayout());
add(askLabel);
add(text);
add(btn);
add(ansLabel);
}
@Override
public void actionPerformed(ActionEvent e) {
String input = text.getText().trim();
if (input.isEmpty()) {
ansLabel.setText(">>>名前を入力してください。");
} else {
ansLabel.setText(">>>Hello, " + input);
}
}
}
<解説>
class GreetingPanel extends JPanel implements ActionListener
GreetingPanelはJPanelを継承し、ActonListenerインターフェースしている。
ActionListenerのメソッドのactionPerformedを必ず実装しないといけない。(インターフェースの成約)
btn.addActionListener(this);
addActionListenerはJButtonクラスのインスタンス
ボタンがクリックされたときのイベントリスナーを登録するために使用される。
ActionListnerを実装したオブジェクトをこのメソッドに渡すと、ボタンがクリックされた際にそのオブジェクトのactionPerformedメソッドが自動的に呼び出される。
this= GreetingPanel
add(askLabel);
add(text);
add(btn);
add(ansLabel);
addの対象はGreetingPanel
this.add(askLabel);と書いても◯
@Override
public void actionPerformed(ActionEvent e) {
String input = text.getText().trim();
if (input.isEmpty()) {
ansLabel.setText(">>>名前を入力してください。");
} else {
ansLabel.setText(">>>Hello, " + input);
}
ActionListenerをインターフェースしているので必ず実装しないといけない。
・btnがクリックされた際に実行される処理
この記事が気に入ったらサポートをしてみませんか?