Javaチュートリアル10(抽象クラスインターフェース匿名内部クラス分類)入門

抽象クラス(抽象)

詳細は実装するために、各サブクラスに与えられ、このクラスは何の具体例を持っていない、抽象的アイデアの数だけ、このクラスは抽象クラスと呼ばれるであろうように、クラスのみ、共有すべてのサブクラスの一般的な形式を定義します。

オブジェクト指向の分野では、主に抽象クラスタイプを隠すために使用されます。私たちは、グラフィック編集ソフトウェアを開発する場合たとえば、あなたは円形、三角形、この特定の概念の領域があることがわかります、彼らは異なっているが、それらのすべてが存在しないような概念の形状、問題の領域での形状の概念に属しそれは抽象的な概念です。インスタンス化特徴付け抽象化することはできないように、フィールド内の抽象無い特定の問題の概念は抽象クラスのため、に対応するためです。

abstract class class_name
{
    abstract type method_name(parameter);
}

CLASS_NAMEは、抽象クラスの名前を表し; METHOD_NAME名が抽象メソッドを表す前抽象メソッドを変更するために使用される場合、このメソッドが抽象メソッドであり、次いで、メソッド本体が存在しうる;パラメータ表現、または抽象的である抽象クラスを表しますパラメータリスト。

抽象的なキーワードは静的メソッドのみを使用またはコンストラクタすることはできません、通常の方法を使用することができます。少なくとも1つの抽象クラス抽象メソッドが含まれている必要があり、そしてすべての抽象メソッドを特定の実装を持つことはできませんが、そのサブクラスのすべての抽象メソッド(メソッド本体が持っている)を実装する必要があり、一つ以上の抽象クラスを含む方法そのクラスの宣言は、抽象クラスとして宣言する前に、あなたは抽象的なキーワードを追加する必要があります。抽象クラスは、完全な実装を定義していないので、そう何の抽象クラス独自のオブジェクトがありません。したがって、抽象クラスのオブジェクトを作成するための新たな試みの使用は、コンパイル時にエラーになります。

public abstract class Shape
{
    public int width;     //几何图形的长
    public int height;    //几何图形的宽
    public Shape(int width,int height)
    {
        this.width=width;
        this.height=height;
    }
    public abstract double area();    //定义抽象方法,计算面积
}
public class Square extends Shape
{
    public Square(int width,int height)
    {
        super(width,height);
    }
    @Override
    public double area()//重写父类中的抽象方法,实现计算正方形面积的功能
    {
        return width*height;
    }
}
public static void main(String[] args)
{
    Square square=new Square(5,4);
    System.out.println("面积为:"+square.area());//输出:面积为:20
}

インターフェース

クラスと同様のインタフェースが、インタフェースはそれだけで唯一のメソッド、プロパティ、イベント、およびインデクサの組み合わせだ、執行体のメンバーではありません。インタフェースは、インターフェイスコンフィギュレーションにはメソッド、ノーフィールドではありません、インスタンス化することはできません。アプリケーションでは、インタフェースは、パッケージは、クラス継承の複数の共通部分とすることができる仕様です。

異なるインタフェースの継承と実装の継承ルールは、クラスは、唯一の直接の親クラスを有しているが、複数のインターフェイスを実装することができます。Javaインタフェースは、任意の実装が唯一の公共の挙動を説明していない抽象以下のJavaインターフェースJavaの抽象クラスよりそう。Javaインタフェースのメソッドは、Javaインターフェースは、パブリック静的および最終的な特性を有することができ、Javaインタフェースがコンストラクタを持つことができない、抽象的で開くことができます。

インタフェースの機能と分離する方法を実施するための方法は、この分離は、多くの場合、操作とプロパティの役割に関連付けられたパッケージの役割を示しており、このインタフェースは、この役割を再生する俳優で達成するインターフェースに反映されています。共通超えた役割を果たしているに加えて、さまざまな主体による、異なる俳優の間で果たすべき役割は、共通して他を必要としません。

:変数およびメソッドのインターフェース宣言は以下のように要約されるようにインターフェイス機能の制限として、多くの制限を行っているため
、パケットへのアクセスを制限されない指定されたパブリックインターフェイスは、所属、パブリックアクセス制御のインタフェース識別子を、任意のタイプの使用を可能にします。
この方法は、暗黙的にパブリックドメイン(パブリック)と抽象(抽象)として宣言され、追加の文修飾子、インタフェースで宣言されたメソッドを、必要としません。
Javaインターフェイスで宣言された変数は、インタフェースで宣言された変数は、暗黙のうちにそれが一定である、公共の静的およびfinalとして宣言し、そのインタフェースで定義された変数が初期化されている必要があり、実際の定数です。何の工法をインスタンス化することはできませんインターフェイス。

定義

public interface interfaceName{
}
//例如
public interface Personlnterface{    
    String name;    //不合法,变量name必须初始化
    int age=20;     //合法,等同于 public static final int age=20;
    void getInfo(); //方法声明,等同于 public abstract void getInfo();
}

実現

実装クラスでは、すべてのメソッドは、パブリックアクセス修飾子を使用して宣言しました。インタフェースのすべてのメンバーが明示的にパブリックとして宣言されてからインタフェースで定義された方法によって実現が、それは、publicとして実装されなければならないときはいつでも

public class Person implements Personlnterface
{
    public void getInfo(){
        return "Hello World";
    }
}

使用

public static void main(String[] args){
    Personlnterface person = new Person();
    person.getInfo();//返回 HelloWorld
}

抽象クラスとインタフェースとの間の差

オブジェクト指向の設計では、すべてのオブジェクトは、クラスによって示されているが、逆に、すべてのクラスは、クラスは、特定のオブジェクトを記述しない場合は、オブジェクトを記述するために使用される、そのようなクラスは抽象クラス、抽象クラス、それの特定の性質の同じ抽象的な概念抽象的な概念は、特定の問題領域の概念に対応していないからこそ、異なって見えるので、インスタンス化できない抽象クラスです

異なる構文

インターフェースは、関数を定義することができ、抽象クラスの実装定義の機能及び特徴を含むことができます。インターフェイスでは、すべてのプロパティは、パブリック静的、最終でなければならない、すべてのメソッドは、それが上述の識別子を記述しないように抽象デフォルトできるされ、抽象クラスでは、抽象定義の両方を含む、また、具体的な方法を含むことができ

public interface Animal
{
    public void eat();
    public String fly();
}
public abstract class Animal
{
    public abstract void eat();
    public String fly(){
        return "我会飞";
    };
}

インタフェースの実装クラスを使用すると、キーワードを実装し、抽象クラスで実装クラス、extendsキーワードを使用します。インタフェースを実装するクラスは、複数のインターフェースを実装することができ、及び抽象クラスのクラスは、抽象クラスを実装することができます。

//接口
public class concreteAnimal implements Animal
{
    public void eat(){}
    public void fly(){}
}
//抽象类
public class concreteAnimal extends Animal
{
    public void eat(){}
    public void fly(){}
}

異なるデザインのアイデア

場合は、抽象クラスの方法の使用、親と子を排除することを意味し、継承され、抽象と具象実装クラスの間で、Javaで、実際には、抽象クラスの前に具体的な実装クラスの実装から分かるように、コンセプトでクラスが同じでなければなりません。インターフェースを経由して、親クラスとサブクラスは、同じ概念に必要とされない場合インターフェイスは、同じではありません。インターフェイスはクラスではなく、関係するクラス間の関係の間で、相互に関連していない唯一の共通の特徴を取って、それはクラス階層が同じ振る舞いを持つことはできません。したがって、我々が言うことができます:抽象クラスを論理的に同じプロパティとメソッドを持っており、インターフェースは同じプロパティとメソッド無関係なものAを持っている論理的集合であるの集合関係の抽象オブジェクトであります抽象化の種類。

用いたカラムは、強力な抽象クラスで使用するインターフェイスを備えています。以下のような:鳥は動物です。鳥は機能的なフライを持っています。猫は動物ですが、猫は飛ぶことができません。

//接口
public interface Fly
{
    public void flyUp();
}
//抽象类
public abstract class Animal
{
    public abstract void eat();
}
//猫是一种动物
public class Cat extends Animal{
}
//鸟是一种动物,同时会飞
public class Bird extends Animal implements Run {
}

抽象クラスは、論理的に同じプロパティとメソッドを持つのセットに関連するものの抽象的で、インターフェイスは論理的に同じプロパティと抽象クラスのメソッドを持っているのセットに関連していない何かを抽象化したものですので、関係インターフェース関係「が」表す「である」を表します。

内部クラス

我々は内部クラスを呼び出す内部クラス分類、中。内部クラスは、隠された、一般的な非内部クラスを実現することができますプライベートと保護された権利を持つことが許されますが、内部クラスされていません。内部クラスのすべての要素へのアクセスは、囲むクラスを持っています。

内部クラスを分けることができる:クラスの内部インスタンス、静的内部クラスと内部クラスのメンバーは、各クラスは、このセクションの機能のいくつかの内部の特定を有し、内部クラスは、詳細にいくつかの関連の知識で始まります。

以下のような特徴インナークラスがされている:
内部クラスはまだ別のクラスである、コンパイル後の内部クラスは、別の.classファイルにコンパイルが、外側のクラスのクラス名と$記号が先行されます。
内部クラスは、通常の方法でアクセスすることはできません。内部クラスのメンバ変数を自由にかかわらず、それがプライベートであるかどうかの、クラス外部からアクセスできるように内部クラスは、外部クラスのメンバーです。
staticとして宣言内部クラス、それは簡単に、まだあなたはクラスの外の静的メンバ変数にのみアクセスすることができ、外部クラスのメンバ変数にアクセスすることはできません。

public class Test
{
    public class InnerClass
    {
        public int getSum(int x,int y)
        {
            return x+y;
        }
    }
    public static void main(String[] args)
    {
        Test.InnerClass testInner =new Test().new InnerClass();
        int i = testInner.getSum(2/3);
        System.out.println(i); //输出5
    }
}

内部クラスの例

内部静的クラスで修飾されていない内部クラスの例

public class Outer
{
    class Inner
    {
        //实例内部类
    }
}

外部クラスの静的メソッドとクラスの外で他のクラスの外で、あなたはそこがネストされている場合は、内部クラスが外部クラスのすべてのメンバーにアクセスすることができ、外側のクラスの内部インスタンスによってクラスのインスタンスを作成する必要があります。

public class Outer
{
    class Inner{}
    Inner i=new Inner();    //类内部不需要创建外部类实例
    public void method0()
    {
        Inner j=new Inner();    //类内部不需要创建外部类实例
    }
    public static void method1()
    {
        Inner r=new Outer().new inner();    //静态方法需要创建外部类实例
    }
    class Inner1
    {
        Inner k=new Inner();    //不需要创建外部类实例
    }
}
class OtherClass
{
    Outer.Inner i=new Outer().new Inner();    //其他类使用时需要创建外部类实例
}

静的な内部クラス

静的内部クラスは、修飾静的内部クラスの使用を意味します

public class Outer
{
    static class Inner
    {
        //静态内部类
    }
}

静的な内部クラスのインスタンスを作成するときは、外部クラスのインスタンスを作成する必要はありません

public class Outer
{
    static class Inner{}
}
class OtherClass
{
    Outer.Inner oi=new Outer.Inner();
}

部分的な内部クラス

これは、方法で定義されたクラス内の内部ローカルインナークラスを指し

public class Test
{
    public void method()
    {
        class Inner
        {
            //局部内部类
        }
    }
}

部分的な内部クラスとローカル変数は、部分的内部カテゴリが現在の方法でのみ有効で、部分的な内部クラスが外部のクラスのすべてのメンバーにアクセスすることができ、アクセス修飾子(privateおよびprotectedパブリック)およびstatic修飾子の変更を制御するために使用することはできません

public class Test
{
    Inner i=new Inner();    //编译出错
    Test.Inner ti=new Test.Inner();    //编译出错
    Test.Inner ti2=new Test().new Inner();    //编译出错
    public void method()
    {
        class Inner{}
        Inner i=new Inner();
    }
}

匿名クラス

匿名内部クラスのカテゴリは新しいステートメントを作成するときにクラスを宣言するために使用されなければならいないクラス名を参照します

new<类或接口>()
{
    //类的主体
};

新しい匿名クラスを宣言するための新しい文のこの形式は、それが特定のクラスが拡張されます、または、指定されたインタフェースを実装します。匿名クラスを使用すると、コードのより簡潔な、コンパクト、モジュラーより高度にする
:二つの方法で実装匿名クラスは
、クラスを継承し、そのメソッドをオーバーライドします。
インタフェースを実装する方法を実施する、(複数でもよいです)。

public class Out
{
    void show()
    {
        System.out.println("调用 Out 类的 show() 方法");
    }
}
public class TestAnonymousInterClass
{
    //在这个方法中构造一个匿名内部类
    private void show()
    {
        Out anonyInter=new Out()
        {
            //获取匿名内部类的实例
            void show()
            {
                System.out.println("调用匿名类中的 show() 方法");
            }
        };
        anonyInter.show();
    }
    public static void main(String[] args)
    {
        TestAnonymousInterClass test=new TestAnonymousInterClass();
        test.show();
    }
}

おすすめ

転載: www.cnblogs.com/lilinfeng/p/10995743.html