javaとc嚖の違いは、両者の違いは何ですか?

6500 ワード

Javaの設計者はC++の複雑さが嫌いなので、Javaは非常に簡潔で、GCもメモリ管理に非常に便利です。C儏はJavaのGCを気に入ったので、仮想マシン技術とマイクロソフトのいくつかの言語を統合したいです。そのためC〓〓は言語の上から言って簡単ではありませんて、甚だしきに至っては計算することができる上に複雑です。
二つの言語のデザインの考え方も違っています。Javaは言語を解釈するためにコンパイルされています。Javaは委託していません。C〓は委託があります。JavaはInterfaceで依頼の機能を実現する傾向があるが、C〓ではAbstract ClassはInterfaceよりも大きな機能を発揮している。
Javaはcamelの命名規則に従って、C〓〓〓はPascalの命名規則に従います。しかし、今はますます多くのJava人がC〓を使うようになりました。同時にcamelの命名規則をC〓〓に持ってきました。これはC〓〓〓コードがますます読みにくくなるかもしれません。なぜ当初C铉はcamelに従わなかったのですか?camelの命名規則がよくないです。
一.類名.thisと内部類
javaでは、よく似たような名前が見られます。thisは現在のオブジェクトの例です。なぜ前にクラス名が現れますか?これに対してC〓プログラマはとても不思議です。
Javaでは、内部クラスにも多く使われています。内部クラスで外部クラスのメンバーにもアクセスできます。この時、内部クラスでthisを使うと、いったい誰の問題が発生しますか?
Javaでは、thisの前に外部クラスの類名を加えることにより、内部クラスで外部クラスを使用する現在のオブジェクトの例を表している。
私たちは次の例を見ます。

package core.sisheng;

//
public class OuterClass {

    //
    private class InnerClass
    {
        // id ,
        public int getId(){    return OuterClass.this.id;    }
        public void setId(int id) { OuterClass.this.id = id;}

        // name , , this
        private String name;
        public String getName() { return this.name;}
        // this
        public void setName(String name) { InnerClass.this.name = name;}

        // ,
        public String getOuterName() { return OuterClass.this.name;}
        public void setOuterName(String name) { OuterClass.this.name = name;}

        @Override
        public String toString()
        {
            return "Id: " + this.getId() + ", Inner Name: " + this.getName() + ", Outer Name: " + this.getOuterName();
        }
    }

    // id name
    private int id;
    private String name;

    private InnerClass innerInstance;
    public OuterClass()
    {
        this.innerInstance = new InnerClass();
        this.innerInstance.setId(20);
        this.innerInstance.setName("Tom");
        this.innerInstance.setOuterName("Alice");
    }

    public String toString()
    {
        return this.innerInstance.toString();
    }   
}

Cピラーでは、クラスは入れ子類と非入れ子類に区分され、前者は他のデータタイプの内部に宣言されたクラスである。後者はある名前空間に直接定義されたクラスです。C葃にはネスト類の定義が少ない。
インサート類ではなく、publicとinternalのアクセス制御を使用することができますが、内蔵クラスはすべての5種類のアクセス制御子、prvate、protected、internal protected、publicとinternalを使用することができます。内部クラスは、instance方法とprvate方法を含む外部クラスのすべての方法にもアクセスできるが、外部クラスの実例を明示的に伝達する必要がある。
Cピラー内の内部クラスは外部クラス定義のタイプと静的方法を使用することができますが、外部クラスの実例的な方法を直接使用することはできませんので、上記の問題はありません。
C菗では、外部クラスは内部クラスに対する作用がより名前空間のようであり、アクセス制御が許可されている限り、以下の方法を用いて内部クラスのオブジェクト例を作成することができる。
OuterClass.Inneralクラス  Obj=new OuterClass.Inneraclass()この例は、外部クラスのいずれかの例と直接的な関係がない。Javaの静的な内部クラスと似ています。
クラス名.クラスとタイプ
javaではよくクラス名を見ます。クラスの使い方はこれに相当します。  タイプのオブジェクトのインスタンス参照を取得するために、C((zhi)のtypeof(クラス名)が使用されます。
javaでは、各クラスに対応するクラスのオブジェクトがあります。良いクラスを作成し、コンパイルが完了した後、作成されたクラスファイルには、クラスのオブジェクトが発生します。このクラスのタイプ情報を表します。クラスのインスタンスを獲得する3つの方法:
オブジェクトのインスタンスを呼び出すgetクラス()方法により、オブジェクトのクラス例を取得する。
クラスの静的な方法forName()を使ってクラスの名前でクラスのインスタンスを取得します。Class.forName(xx.xx.xx)は、JVMに指定されたクラスを検索してロードするように要求するクラスです。つまり、JVMはこのクラスの静的なコードセグメントを実行します。
クラス名.cass方式は、Classのインスタンスを取得し、基本データタイプのパッケージクラスに対して、対応する基本データタイプのクラス例を取得するためにTYPEを採用することもできる。
Cタイプのオブジェクトのインスタンスを取得する方法は、より簡単に明確になります。
データのインスタンスを呼び出すGetType()方法で取得すると、この方法はObjectから継承されるので、CピラーのいずれのオブジェクトもGetType()方法を有し、x.GetType()は変数名である。
typeof(x)のxは、具体的な類名、タイプ名などでなければなりません。変数名ではありません。
System.Typeによる静的方法System.Type.GetType()です。
 三、匿名類
javaでは、匿名クラスの使用も多いです。例えば、Androidでは、ボタンのモニターを実現するために、よくこのようなコードが見られます。

this.listener0 = new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        Intent intent = new Intent( MainActivity.this, ActivityFrameLayout.class);
        setTitle("FrameLayout");
        startActivity( intent );
    }
};

ここでは、OnClickListenterは実際にインターフェースであり、インターフェースはオブジェクトインスタンスを作成するために使用できますか?もちろんできません。
したがって、Javaはここで自動的に実現インターフェースの匿名クラスを作成し、実際にはこの匿名クラスのオブジェクトインスタンスを作成します。
このようにするメリットは、私たちはもう一回だけ使うクラスを定義しなくてはいけません。そして、このクラスを通じてオブジェクトインスタンスを作成して、プログラムの開発を簡単にしました。
例えば、次のインターフェースがあります。

public interface myInterface {
    void onClick();
}
は、インタフェースを介して、インタフェースを実装する匿名クラスのオブジェクトインスタンスを作成し、このオブジェクトインスタンスを使用することができる。

myInterface instance = new myInterface(){
    @Override
    public void onClick()
    {
        System.out.println("Clicked!");
    }
};
instance.onClick()C〓〓の中で、私達は根本的にこのような形式を使うことはできなくて、委託を通じて(通って)、とても簡単に同じ機能を実現することができます。
 javaには依頼がありません。
このインスタンスのタイプを出力すると、この匿名タイプの実際のタイプが見られます。

System.out.println( instance.getClass());
// class core.sisheng.Study1$1 、 (Property)
属性の概念は皆さんにとってよく知っているはずです。クラスメンバー関数はこのクラスの任意の属性メンバーに自由にアクセスできます。でも、一つのクラスの中から他のクラスの属性にアクセスするには面倒くさいです。だから、GetxxxとSetxxxの方法を使うことが多いです。このように不自然に見えます。例えば、JavaまたはC+、コードはこうです。

foo.setSize (getSize () + 1);
label.getFont().setBold (true);
しかし、C〓の中で、このような方法は“属性化”されました。同じコードです。C菗では、次のようになります。   foo.size++;   label.font.bold=true;      C〓〓〓は明らかに更に読みやすくて理解することができます。この「属性方法」のサブルーチンコードからも同様の状況が見られます。
Java/C++:  

public int getSize()  
{  
return size;  
}  
public void setSize (int value)  
{  
size = value;  

Cシシシ:  

public int Size  
{  
 get{return size;}  
 set{size = value;}  

このような属性化の方法とクラスの属性メンバーを区別するために、C((xi)では属性メンバーを「ドメイン(field)」と呼びますが、「属性」はこのような「属性化の方法」専用名詞となります。ちなみに、このような属性化方法はVBとDELPHIの中でよく出会うもので、VBの中では属性とも呼ばれています。また、Cの菗の中でGetとSetはペアで出現しなければなりません。一つの属性はGetだけではなく、Setを持たないといけません。Cの獡の中でこのようにする利点はメンテナンスに便利です。もしある属性を修正するなら、GetとSet方法に注意します。同時に修正して、これを忘れないようにします。
五、オブジェクトインデックス機構(Indexer)
Cピラーにはオブジェクトインデックス機構が導入されている。白点といっても、オブジェクトインデックスはオブジェクト配列です。ここで前のセクションの属性に関連して説明すると、プロパティはGetとSetの方法を隠す必要がありますが、インデックス構造においては、各オブジェクトのGetまたはSet方法が露出されます。例えば、次の例はこの点をはっきり説明します。以上はC〓〓とJavaの違いを紹介します。C〓〓とJAVAの違いを紹介します。C〓とJAVAを理解するのに役に立つと思います。