データ融合JAVAアプリケーション開発者企業招聘連絡研修7日目課程総括
36449 ワード
09抽象クラス
09-1抽象クラス
抽象クラスとは?
抽象クラスはabstract class
と呼ばれ、これまでに創造されたクラスはconcrete class
である.
抽象クラスの場合、抽象メソッドは常に抽象メソッドを含み、抽象メソッドには実装コードがありません.abstract int add(int x, int y);
抽象方法は抽象定語を用い、関数実現部はない.で終了します.
メソッド宣言の意味
int add(int num1, int num2);
上記のコードは、2つの整数を受け入れて1つの値を返すことを意味することがわかります.
定義함수 반환값
,함수 이름
,매개변수
は関数に対する役割と実装解の定義であるため,実装関数体は宣言子を記述するよりも重要であることがわかる.
抽象クラスの実装
2つの抽象的な方法があります.display()
、typing()
メソッドを実装するturnOn()
クラス、およびそれを継承するturnOff()
クラス.
そのうちComputer
万の抽象クラスDesktop
とdisplay()
クラスを継承していますLaptop
を実現.
Computer.javapackage abstractex;
public abstract class Computer {
public abstract void display();
public abstract void typing();
public void turnOn() {
System.out.println("전원을 켠다.");
}
public void turnOff() {
System.out.println("전원을 끈다.");
}
}
Desktop.javapackage abstractex;
public class Desktop extends Computer {
@Override
public void display() {
System.out.println("desktop display()");
}
@Override
public void typing() {
System.out.println("desktop typing()");
}
}
Laptop.javapackage abstractex;
public abstract class Laptop extends Computer {
@Override
public void display() {
System.out.println("laptop display()");
}
}
MyLaptop.javapackage abstractex;
public class MyLaptop extends Laptop {
@Override
public void typing() {
System.out.println("mylaptop typing");
}
}
Laptop
およびMyLaptop
はすべてのクラスで共通であるが、turnOn()
およびturnOff()
の実装はサブクラスに依存する.
このように、各サブクラスの異なる実装方法は抽象的な方法として宣言される.display()
クラスは、すべての方法を実施する.typing()
クラスでは、すべてのメソッドが実装されていないため、抽象クラスであるべきである.Computer
クラスはすべての抽象メソッドを実現しているので、抽象クラスではありません.
自分でコードします
概念をさらに理解するために、試してみましょう.
Car.javapackage vehicle;
public abstract class Car {
public abstract void refuel();
public abstract void run();
public void stop() {
System.out.println("차가 멈춥니다.");
}
}
Bus.javapackage vehicle;
public class Bus extends Car {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
@Override
public void refuel() {
System.out.println("천연 가스를 충전합니다.");
}
public void takePassenger() {
System.out.println("승객을 버스에 태웁니다.");
}
}
AutoCar.javapackage vehicle;
public class AutoCar extends Car{
@Override
public void refuel() {
System.out.println("휘발유를 주유합니다.");
}
@Override
public void run() {
System.out.println("차가 달립니다.");
}
public void load() {
System.out.println("짐을 싣습니다.");
}
}
CarTest.javapackage vehicle;
public class CarTest {
public static void main(String[] args) {
Bus bus = new Bus();
AutoCar autoCar = new AutoCar();
bus.run();
autoCar.run();
bus.refuel();
autoCar.refuel();
bus.takePassenger();
autoCar.load();
bus.stop();
autoCar.stop();
}
}
Laptop
とMyLaptop
はそれぞれ抽象クラスとして継承されるクラスを残して再定義し、refuel()
は汎用メソッドとして宣言する.run()
クラスにおいて、stop()
と呼ばれる方法がある.Bus
クラスには、takePassenger()
という方法があります.
抽象クラスを作成する理由
抽象クラスをどこで使用するかを理解するために、さっき作成したAutoCar
クラスとテストサブクラスのload()
クラスを作成し、実践します.
ComputerTest.javapackage abstractex;
public class ComputerTest {
public static void main(String[] args) {
Computer c1 = new Computer();
Computer c2 = new Desktop();
Computer c3 = new Laptop();
Computer c4 = new MyLaptop();
}
}
試してみると、c 1、c 3は生成できません.Computer
クラスとComputerTest
クラスは抽象クラスだからです.
各クラスには実装されていないコードがあるため、インスタンスを作成できません.
抽象クラスで実装する方法
抽象クラスで実装/非実装の方法をどのように区別しますか?Computer
またはLaptop
であればサブクラスで共有できるが、turnOn()
またはturnOff()
などは因子クラスによって異なる可能性があるため、実施しない(LaptopかDesktopか).
09-2テンプレートメソッド
抽象クラスとテンプレートメソッド
抽象クラスを使用する例にはテンプレートメソッドがあります.
テンプレートメソッドは抽象クラスを使用して実装できます.package template;
public abstract class Car {
public abstract void drive();
public abstract void stop();
public void startCar() {
System.out.println("시동을 겁니다.");
}
public void turnOff() {
System.out.println("시동을 끕니다.");
}
final public void run() {
startCar();
drive();
stop();
turnOff();
}
}
上記のdisplay()
メソッドはテンプレートメソッドであり、typing()
クラスを継承するすべてのサブクラスがこの順序で動作します.
継承するクラスrun()
とCar
の2つをそれぞれ実装しましょう.
AICar.javapackage template;
public class AICar extends Car{
@Override
public void drive() {
System.out.println("자율 주행을 한다.");
System.out.println("자동차가 스스로 방향 전환을 한다.");
}
@Override
public void stop() {
System.out.println("스스로 멈춘다.");
}
}
ManualCar.javapackage template;
public class ManualCar extends Car {
@Override
public void drive() {
System.out.println("사람이 운전한다.");
System.out.println("사람이 핸들을 조작한다.");
}
@Override
public void stop() {
System.out.println("브레이크로 정지한다.");
}
}
CarTest.javapackage template;
public class CarTest {
public static void main(String[] args) {
System.out.println("===자율주행 자동차===");
Car myCar = new AICar();
myCar.run();
System.out.println("===사람이 운전하는 자동차===");
Car hisCar = new ManualCar();
hisCar.run();
}
}
出力:
===自主走行車==
起動します.
自主走行を行う.
車は自分で転向する.
自動停止
起動を閉じます.
===人が運転する車==
起動します.
誰かが運転しています.
人がハンドルを操作する.
ブレーキが止まる.
起動を閉じます.
テンプレートメソッドの役割
したがって、テンプレート方法の役割は、AICar
を定義することである.
ここでは少し紛らわしいので、同じ概念の他の実装を探して、final予約語を使う場合もあれば、final予約語を使う場合もあります.まず本の中の記述によると,シナリオの定義であるためfinal予約語を用いて再定義することはできない.
09-3テンプレートメソッドの適用
テンプレートの方法を理解するための例を作成します.ManualCar
というクラスが生成され、메서드의 실행 순서와 시나리오
が有するレベルに従って実現可能な3つのPlayer
、Player
、およびrun()
の機能を有する.jump()
のすべてのレベルで利用可能なturn()
の方法が提供される.
この方法は、1回のPlayer
、go(int count)
と同様に、run
、1回のcount
である.
このレベルでは不可能な動作であれば、出力は不可能です.
クラス機能と関係
UMLを使用してクラス図を描き、プログラミングを行うことが望ましい.jump
は、クラス内の場合、turn
に従って異なる機能を提供する.if (level == beginner) {
...
} else if (level == advanced) {
...
} else if (...) {
...
}
このように実装される場合、機能を追加したり、レベルを追加したりする場合は、コードを増やし続ける必要があります.
デザインクラス
Player
クラスと레벨
クラスは、(HAS−A)関係を含む.
すべてのPlayer
には独自のレベルがあり、異なるレベルの機能が異なるため、PlayerLevel
クラスを抽象クラスとして作成し、すべてのレベルで可能な汎用機能と各レベルで異なる機能を抽象クラスとして実現します.
コードが長くなってgistに分離
https://gist.github.com/crisine/517d1cfcfb8d09a5d856fba318317d02 Player
ランクのPlayerLevel
の方法はちょっとわかりませんが、元のゲームならEXPか特定の条件を満たしてからアップグレードするのですが、ここでは代入としてランクを「変更」する方法です.正しいようです.Player
は、最初はupgradeLevel(PlayerLevel level)
と定められた.ジェネレータではplayer
レベルで開始します.
次に、Beginner
Beginner
クラスのインスタンスをそれぞれ宣言し、AdvancedLevel
インスタンスのSuperLevel
メソッドを呼び出し、作成したばかりのインスタンスをパラメータとしてアップグレード(置換)します.
抽象クラスと多形性
player
が所有できる各種upgradeLevel
は、単独の資料型宣言はなく、ここではPlayer
と宣言されている.クラス変更方法のパラメータもPlayerLevel
であり、複数のクラスが存在してもPlayerLevel
クラスに代入することができる.
09-4最終予約語
PlayerLevel
予約語は、PlayerLevel
、final
、변수
等に用いることができる.
変数の使用へんすうのしよう:定数
使用方法:サブクラスで再定義できません
≪クラスに使用|Use Class|ldap≫:≪継承不可|Inheritable|ldap≫
複数のファイル共有定数(例)
public class Define {
public static final int MIN = 1;
public static final int MAX = 100;
public static final double PI = 3.141592;
}
...
main method() {
sysout(Define.PI);
}
変数を静的に宣言した後に定量化するため、インスタンスを作成する必要はありません.
Reference
この問題について(データ融合JAVAアプリケーション開発者企業招聘連絡研修7日目課程総括), 我々は、より多くの情報をここで見つけました
https://velog.io/@crisine/데이터융합-JAVA응용-SW개발자-기업-채용연계-연수과정-7일차-강의-정리
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
abstract int add(int x, int y);
int add(int num1, int num2);
package abstractex;
public abstract class Computer {
public abstract void display();
public abstract void typing();
public void turnOn() {
System.out.println("전원을 켠다.");
}
public void turnOff() {
System.out.println("전원을 끈다.");
}
}
package abstractex;
public class Desktop extends Computer {
@Override
public void display() {
System.out.println("desktop display()");
}
@Override
public void typing() {
System.out.println("desktop typing()");
}
}
package abstractex;
public abstract class Laptop extends Computer {
@Override
public void display() {
System.out.println("laptop display()");
}
}
package abstractex;
public class MyLaptop extends Laptop {
@Override
public void typing() {
System.out.println("mylaptop typing");
}
}
package vehicle;
public abstract class Car {
public abstract void refuel();
public abstract void run();
public void stop() {
System.out.println("차가 멈춥니다.");
}
}
package vehicle;
public class Bus extends Car {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
@Override
public void refuel() {
System.out.println("천연 가스를 충전합니다.");
}
public void takePassenger() {
System.out.println("승객을 버스에 태웁니다.");
}
}
package vehicle;
public class AutoCar extends Car{
@Override
public void refuel() {
System.out.println("휘발유를 주유합니다.");
}
@Override
public void run() {
System.out.println("차가 달립니다.");
}
public void load() {
System.out.println("짐을 싣습니다.");
}
}
package vehicle;
public class CarTest {
public static void main(String[] args) {
Bus bus = new Bus();
AutoCar autoCar = new AutoCar();
bus.run();
autoCar.run();
bus.refuel();
autoCar.refuel();
bus.takePassenger();
autoCar.load();
bus.stop();
autoCar.stop();
}
}
package abstractex;
public class ComputerTest {
public static void main(String[] args) {
Computer c1 = new Computer();
Computer c2 = new Desktop();
Computer c3 = new Laptop();
Computer c4 = new MyLaptop();
}
}
package template;
public abstract class Car {
public abstract void drive();
public abstract void stop();
public void startCar() {
System.out.println("시동을 겁니다.");
}
public void turnOff() {
System.out.println("시동을 끕니다.");
}
final public void run() {
startCar();
drive();
stop();
turnOff();
}
}
package template;
public class AICar extends Car{
@Override
public void drive() {
System.out.println("자율 주행을 한다.");
System.out.println("자동차가 스스로 방향 전환을 한다.");
}
@Override
public void stop() {
System.out.println("스스로 멈춘다.");
}
}
package template;
public class ManualCar extends Car {
@Override
public void drive() {
System.out.println("사람이 운전한다.");
System.out.println("사람이 핸들을 조작한다.");
}
@Override
public void stop() {
System.out.println("브레이크로 정지한다.");
}
}
package template;
public class CarTest {
public static void main(String[] args) {
System.out.println("===자율주행 자동차===");
Car myCar = new AICar();
myCar.run();
System.out.println("===사람이 운전하는 자동차===");
Car hisCar = new ManualCar();
hisCar.run();
}
}
if (level == beginner) {
...
} else if (level == advanced) {
...
} else if (...) {
...
}
public class Define {
public static final int MIN = 1;
public static final int MAX = 100;
public static final double PI = 3.141592;
}
...
main method() {
sysout(Define.PI);
}
Reference
この問題について(データ融合JAVAアプリケーション開発者企業招聘連絡研修7日目課程総括), 我々は、より多くの情報をここで見つけました https://velog.io/@crisine/데이터융합-JAVA응용-SW개발자-기업-채용연계-연수과정-7일차-강의-정리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol