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と連用できません