JavaのOOPについて
クラス継承
単一のオブジェクトの共通部分を収集して親を作成します.
'
ここで,人間は「メソッドリポジトリ」と見なすこともできる.
Childクラスはparent-type、(反対ではない)とParentのすべての関数性を継承し、Parentクラスの
specialization
である.したがって、親メソッドは、特別な処理を必要とせずに使用できます.
また、
오버라이딩
で多形性を実現することができる. Integer intObj = new Integer(53);
Class c = intObj.getClass(); // call Object method
継承と非継承
*ジェネレータ、初期化ブロック、静的フィールド、および静的メソッドは継承されません.
public class Math {
public static final double PI = 3.14159;
//클래스(static) 상수(final)는 상속 불가능
}
private/defaultは継承されますがアクセスできません
保護された継承とアクセス性(他のパッケージでも可能)
finalキーワードを持つクラスは継承できません.
public final class String() { … }
タイプ変換
親クラスが子クラスにアクセスできるようにするには(上書きの方法ではありません)、ロールを選択する必要があります.(
타입 변환
)Javaは実行時にタイプチェックを行います.だから注意が必要です.
Object obj = new Integer(38);
System.out.println(obj.intValue()); // Compile Error
ObjはIntegerを参照するが、Integerメソッドに書き込めない.参照タイプには、[参照オブジェクト](Reference Objects)タイプに関係なく、
class-type
があります.オブジェクトにアクセスできるフィールドとメソッドを定義します.ここでobj
はオブジェクトタイプであるため、オブジェクトのフィールドとメソッドにのみアクセスできます.サブクラスメソッドを記述するには、次のように
캐스팅
が必要です.Object obj = new Integer(453);
int i = ((Integer) obj).intValue(); // Cast obj
Parent p = new Child();
Child c = (Child) p; //Cast p(Parent) to Child
ただし、クラスのメソッドが参照されるサブクラスでない場合、鋳造も参照できません.Object obj = new Integer(455);
int i = ((Float) obj).floatValue(); // Runtime error
マルチフォームとダイナミックバインド
public class Parent {
public void method() { … }
}
public class Child() extends Parent {
public void method() { … }
public static void main(String[] args) {
Parent p = new Child();
p.method(); // Child 클래스의 method가 호출된다.
//method를 오버라이딩한 Child2 클래스를 가정
p = new Child2();
p.method(); // Child2 클래스의 method가 호출된다.
Child c = new Child();
c.method(); // Child 클래스의 method가 호출된다.
}
pはparent type
であるが、Childを呼び出す方法は実装される.実はpが指す(actual type
)はChild!また,pがnew Child 2()を指す場合,今回はChild 2クラスのメソッドを呼び出す.
dynamic binding
プロパティで、다형성
の特徴が表示されます.では、実際の親を呼び出すにはどうすればいいのでしょうか.
super
を使えばいいです. public class Activity {
void onCreate() {
System.out.println("기본적인 실행 내용");
}
}
-------------------------------
public class MainActivity extends Activity {
@Override
void onCreate() {
super.onCreate(); // 부모 클래스의 onCreate 메서드 호출
System.out.println("추가적인 실행 내용");
}
}
では、親の変数に触れたい場合は、どうすればいいのでしょうか.次のコードがあります.
public class Task{
private String name;
private boolean done;
public Task(String taskName){
name = taskName;
done = false;
}
public void doTask(){
done = true;
}
public boolean isDone(){
return done;
}
}
public class FileUploadTask extends Task{
public FileUploadTask(){
// call parent-class constructor
// 부모 클래스의 생성자는 상속이 안 되기 때문에
// super를 사용한다.
super("upload file");
}
@Override
public void doTask(){
//
}
}
//main이라고 가정
Task t = new FileUploadTask();
t.doTask();
ここで、Tasktのdoneをどのようにtrueに変換しますか?doneはプライベートなのでアクセスできません.したがってprivateにアクセスできる親メソッドを呼び出すことができます.
@Override
public void doTask(){
super.doTask();
}
もっといい方法はありませんか.done
の保護を宣言してもいいです.しかしよく考えてみると、Task自体がDoTaskの方法を持っているのはおかしいかもしれません.
Taskを抽象化したらどうですか?
抽象クラス
public abastract class Task{
private String name;
private boolean done;
public Task(String taskName){
name = taskName;
done = false;
}
public abstract void doTask();
}
public class FileUploadTask implements Task{
public FileUploadTask(){
}
/**Implement doTask() */
public void doTask(){
//
}
}
doneを交換しましょう最も簡単な方法は、さっきのようにdoneをprotectedに設定することです.
あるいはTaskに保護方法を与えることができます.
これにより、タスクが完了したことを報告できるのはサブクラスのみです.
public abastract class Task{
private String name;
private boolean done;
public Task(String taskName){
name = taskName;
done = false;
}
protected void reportTaskDone(){
if(done){
//,,,
}
done = true;
}
public abstract void doTask();
}
Reference
この問題について(JavaのOOPについて), 我々は、より多くの情報をここで見つけました https://velog.io/@pithesun/자바의-oop에-대하여テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol