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();
    }