Javaのabstractメソッドとabstractクラスの問題

8125 ワード

,           ,     。
           :              ,             。
               。           ,                ,  ,       。 
abstract             
1: abstract         ,            ,         。
2: abstract           ,         。                ,         。 
abstract   :
1:           ,                 ,             ,               ,            ,          。
2:         ,         。             
3:         ,            ,        ,                 
4:   final      
 
Q:java       ?         ?
A:java     ,    abstract  。
            。
  ,     ,       ,  java      。      ,           。
java        。             
                     (       ),              (       )。
       。              public abstract ,      public static final 。(            ,  ,        ;   ,     ,      )
  ,     ,         ,                ,        (          )。
  ,    ,         ,            (     OSI       )
                   ,        。            (is a,has a)
 
Q:     abstract   abstract     ?          ?      ?
A:      abstract,           ,       
            ,    ,              ,            
               ,          
        !
      ,              ,             ,           abstract     
( final      ,             ,           final  )
        ,  ,       ,         ,         。
            ,            。(     C++ virtual   ,  abstract    )
 
           ?              。(          )
          
abstract class Shape{ 
    public abstract void draw(); 
    public abstract void reDraw(); 
} 
class Triangle extends Shape{ 
    public void draw(){...} 
    public void reDraw(){...} 
} 
class Circle extends Shape{ 
    public void draw(){...} 
    public void reDraw(){...} 
} 
         
class Shape{ 
    public void draw(){} 
    public void reDraw(){} 
}
     2     :
1.     。Shape         (Triangle,Circle)     。               
2.            ,   Shape      ,  Shape        。               ,                 。          。(            )
  ,   Shape   Interface ?
    
Interface Shape{ 
    void draw(); 
    void reDraw(); 
} 
class Triangle implements Shape{ 
    public void draw(){...} 
    public void reDraw(){...} 
} 
class Circle implements Shape{ 
    public void draw(){...} 
    public void reDraw(){...} 
}
       Triangle,Circle Shape           。
           ,         ,Triangle Circle        Shape
                 (void draw(),void reDraw())
         ?    Triangle Circle  erase  ?
   class Shape     ,   ,  
abstract class Shape{ 
    public abstract void draw(); 
    public abstract void reDraw(); 
    public void erase(){ 
        Window window=WindowContainer.getCurrentWindow(); 
        window.clean(); 
    } 
}
Triangle Circle         !
     ,     erase()    abstract 。      erase()   abstract ,            ,         。
  ,     ,             。  ,erase               ,   ?
    ,         。
   Interface Shape   ,         
Interface Shape{ 
    void draw(); 
    void reDraw(); 
    void erase(); 
} 
class Triangle implements Shape{ 
    public void draw(){...} 
    public void reDraw(){...} 
    public void erase(){  
        Window window=WindowContainer.getCurrentWindow(); 
        window.clean(); 
    } 
} 
class Circle implements Shape{ 
    public void draw(){...} 
    public void reDraw(){...} 
    public void erase(){ 
        Window window=WindowContainer.getCurrentWindow(); 
        window.clean(); 
    } 
}
       ,     !           !
           !
         ,               ,         ,         !
          :          ,              
 
   java         ,Thread
           ,    ?
    :
//    Thread     
class MyThread extends Thread{ 
    public void run(){}//  Thread run   
} 
//    Runnable      
class MyThread implements Runnable{ 
    public void run(){}//  Runnable run  ,MyThread YourThread        
} 
(  Thread    ,     ,  Thread   Runnable)
  ,         ,      Thread       Runnable 
 
                 C++        。       
 
package com.pamigo.shp; 
abstract class Shape{ 
    public abstract void draw(); 
    public abstract void reDraw(); 
    public void erase(){ 
        doErase(); 
        Window window=WindowContainer.getCurrentWindow(); 
        window.clean(); 
    } 
    protected abstract void doErase(); 
} 
class Triangle extends Shape{ 
    public void draw(){...} 
    public void reDraw(){...} 
    protected void doErase(){ 
        MusicBox.sing("Amazing Grace"); 
    } 
} 
class Circle extends Shape{ 
    public void draw(){...} 
    public void reDraw(){...} 
    protected void doErase(){ 
        WindowBox.popUp("I'll go!"); 
    } 
} 
package com.pamigo.clnt; 
class User{ 
    public static void main(String[] args){ 
        Shape shp=new Triangle(); 
        shp.draw(); 
        shp.erase(); 
    } 
}
//         
         ,     ,User    Shape erase  。
erase      Window     ,                  ,     
protected abstract void doErase();
   protected  ,  User     。
   Circle  Triangle,      doErase  。           shp.erase();       
      Window       !
             ,       。
==========================================================================
abstract     ,        。

1>.抽象クラス:オブジェクトを手動で作成することはできない(JVMは抽象クラスのオブジェクトを作成することができる)が、抽象タイプの参照を宣言することができる.     public class TestAbstract1{            public static void main(String[] args){               //Animal a=new Animal();       //error                             Animal a=null;               a=new Dog();          }       }         abstract class Animal{      }      class Dog extends Animal{       }    
 
2>.抽象的な方法:メソッド名の定義があり、実現していない、(何ができるかだけを定義し、どのようにするかを定義していない)                        抽象メソッドの利点は,メソッドの定義と実装の分離を許容することである.       abstract class Animal{        public abstract void eat();      }           抽象類と抽象方法の関係:抽象方法を含む類は必ず抽象類であり、抽象類には必ずしも抽象方法が含まれていない.          抽象クラスの存在の意味は継承されるために使用されます.1つのクラスは抽象クラスを継承し、抽象クラス内のすべての抽象方法を実現しなければなりません.そうしないと、このようなものも抽象クラスです.     abstract class Animal{         public void run(){}         public abstract void sleep();        public abstract void eat();      }        class Dog extends Animal{         public void sleep(){           System.out.println("Dog sleep.");         }         public void eat(){           System.out.println("Dog eat.");         }       }          abstract class Cat extends Animal{         public void eat(){           System.out.println("Cat eat.");         }       }      
     親タイプのサブクラスオブジェクトを宣言し、抽象メソッドをマルチステートで呼び出すことができます.       public class TestAbstract1{         public static void main(String[] args){            Animal a=null;             a=new Dog();            a.sleep();             a.eat();       }      }        
     抽象類には構造方法があり,親類があり,単継承の法則にも従う.         class E{}      abstract class Animal extends E{         public Animal(){           super();         }      }    3>.複数の修飾子の連用問題:public  protected  default  private  static final  abstract      連用可能:public static                      private static                       public final                       public static final      連用不可:abstract final void eat();                         private abstract void eat();                       static abstract void eat();      abstractはfinal,private,staticと連用できません