面接問題整理_04


13.abstract classとinterfaceの違いは何ですか?
回答:
abstract修飾子を含むclassは抽象クラスであり、abstractクラスでは作成できないインスタンスオブジェクトです.abstractメソッドを含むクラスはabstract classとして定義する必要があります.abstract classクラスのメソッドは抽象的である必要はありません.abstract classクラスで抽象メソッドを定義するには、特定の(Concrete)サブクラスで実装する必要があるため、抽象構造メソッドや抽象静的メソッドは使用できません.サブクラスが抽象親クラスのすべての抽象メソッドを実装していない場合、サブクラスもabstractタイプとして定義する必要があります.
インタフェース(interface)は抽象クラスの特例と言えるが,インタフェース内のすべての方法は抽象的でなければならない.インタフェースのメソッド定義はデフォルトでpublic abstractタイプ、インタフェースのメンバー変数タイプはデフォルトでpublic static finalです.
両者の文法の違いを比較してみましょう.
      
1)抽象クラスには構築方法があり,インタフェースには構築方法がない.
2)抽象クラスには通常メンバー変数があり、インタフェースには通常メンバー変数がない
3)抽象クラスには非抽象的な一般メソッドを含めることができ,インタフェース内のすべてのメソッドは抽象的でなければならず,非抽象的な一般メソッドは存在しない.
4)抽象クラスにおける抽象メソッドへのアクセスタイプはpublic,protected,および(デフォルトタイプであるが
eclipseではエラーは報告されませんが、できません)が、インタフェースの抽象的な方法はpublicタイプであり、デフォルトはpublic abstractタイプです.
5)抽象クラスに静的メソッドを含めることができ,インタフェースに静的メソッドを含めることができない.
     6.)抽象クラスとインタフェースには静的メンバー変数が含まれます.抽象クラスの静的メンバー変数のアクセスタイプは任意ですが、インタフェースで定義された変数はpublic static finalタイプのみで、デフォルトはpublic static finalタイプです.
7)1つのクラスは複数のインタフェースを実装できるが,1つの抽象クラスしか継承できない.
次に、両者の応用上の違いについて説明します.
インタフェースは、主にモジュール間の通信契約を定義するために使用されるシステムアーキテクチャ設計方法で機能することが多い.抽象クラスはコード実装において機能し、コードの再利用を実現することができる.例えば、テンプレートメソッド設計モードは抽象クラスの典型的な応用であり、あるプロジェクトのすべてのサーブレットクラスが同じ方法で権限判断、アクセスログの記録、処理異常を行うと仮定すると、抽象的なベースクラスを定義し、すべてのサーブレットがこの抽象ベースクラスを継承することができる.抽象ベースクラスのサービスメソッドでは権限判断、アクセスログの記録、異常を処理するコードを完了し、各サブクラスではそれぞれのビジネスロジックコードを完了するだけで、偽コードは以下の通りである.
 
 
public abstract class BaseServlet extendsHttpServlet{
publicfinal void service(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException {
// 
// 
if( ){
try{
doService(request,response);
}
catch(Excetpion e) {
// 
}
}
}
protectedabstract void doService(HttpServletRequest request, HttpServletResponseresponse) throws IOExcetion,ServletException;
// protected, , , 
}
public class MyServlet1 extendsBaseServlet
{
protected void doService(HttpServletRequestrequest, HttpServletResponse response) throws IOExcetion,ServletException
{
 Servlet 
}
}

 
親メソッドの中間のコードが不確定で、子メソッドに残しておくと、テンプレートメソッドでモードが設計されます.
備考:この問題の構想はまず抽象類とインタフェースの基本概念を全体的に解釈してから、両者の文法の細部を比較して、最後に両者の応用の違いを話します.両者の文法の細部の違いを比較する条理は,まず1つのクラスの構造方法,一般メンバー変数と方法(抽象的な方法を含む),静的変数と方法,継承性の6つの面から回答を逐一比較し,次に第三者から継承する観点からの回答であり,特に最後に典型的な例を用いて自分の深い技術的基礎を示す.
14.abstractのmethodは同時にstaticであってもよいか、nativeであってもよいか、synchronizedであってもよいか.
答え:abstractのmethodはstaticではありません.抽象的な方法は布団類で実現されるので、staticは子類と関係がありません.
native法は,この方法が別のプラットフォームに依存するプログラミング言語で実現されることを示し,布団類実現の問題は存在しないため,抽象的ではなくabstractと混用できない.たとえば、FileOutputSteamクラスはハードウェアで扱われ、最下位の実装はオペレーティングシステム関連のapi実装、例えばwindowsではc言語で実装されるので、jdkのソースコードを見ると、FileOutputStreamのopenメソッドの定義は以下の通りであることがわかります.
 
private native void open(String name)throws FileNotFoundException;

もし私たちがjavaで他の人が書いたc言語関数を呼び出すならば、私たちは直接呼び出すことができません.私たちはjavaの要求に従ってc言語の関数を書く必要があります.また、私たちのこのc言語関数は他の人のc言語関数を呼び出す必要があります.私たちのc言語関数はjavaの要求によって書かれているので、私たちのこのc言語関数はjavaとドッキングすることができます.javaの向こうのドッキング方式は私たちのこのc関数に対応する方法を定義することです.javaの中で対応する方法は具体的なコードを書く必要はありませんが、前にnativeを宣言する必要があります.
synchronizedとabstractの併用については、私もだめだと思います.私の数年の学習と開発では、このような状況を見たことがありません.そして、synchronizedは具体的な方法に作用してこそ意味があると思います.また,メソッド上のsynchronized同期で使用される同期ロックオブジェクトはthisであり,抽象メソッドではthisが何であるかは特定できない.