黑馬程序員_Java基礎[17]_Object、內部類

---------- android培訓 java培訓、期待與您交流! ----------

【【Object】】類

/*

 *是所有類直接或者間接的父類       (超類    (最上層的類。
 *該類中定義的肯定是所有對象都具備的功能
 *        (所有對象都具備比較功能。
 *
 *Object類中已經提供了對對象是否相同的比較方法
 *
 *如果自定義類中也有比較相同功能,沒有必要自己再定義
 *只要沿襲父類中的功能,建立自己特有的比較內容即可,這就是覆蓋/複寫。
 *
 *【應用技能】
 *1、向下轉型,
 *2、instanceof 類型比較關鍵字
 *3、方法的複寫/覆蓋
 *4、多態
 *5、equals
 *6、toString()hashCode() 哈希值
 */
class Demo_a {   //extend Object {
    public int num;
    Demo_a(int num){
        this.num=num;
    }

    public boolean equals(Object obj){//Object obj=new Dem();  //複寫    方法一模一樣
        /*針對傳入不同類型比較時,必然是false
         */
        if(!(obj instanceof Demo)){//類型比較 ,instanceof關鍵字。
            return false;    //不是同一個類型直接返回:
        }
        Demo_a  de=(Demo_a )obj;
        return this.num==de.num;
        /*
         *個人總結在多態中,可以通過向下轉換/強制轉換的方式,使父類擁有子類的成員變量和方法。
         *就比較而言,想比較其他的,而這些功能父類已經定義了,子類只需要覆蓋就可以,
         *        在這裏只需要對傳入的類型進行判斷,然後進行向下轉換即可完成功能。

         */
    }
    //public boolean equals(Demo d ){ //重載 參數列表不同
    //}
}
class Person_a{
    //建立一個人的類,也可以傳入複寫的比較方法中比較,只不過不同類型,必然是false;
}


public class Demo_Object {

    public static void main(String []args){
        //1 【equals】 任何對象都具備比較的功能。
        /*
        Demo d1=new Demo();
        Demo d2=new Demo();
        Demo d3=d1;
        System.out.println(d1.equals(d3));
        System.out.println(d1==d2);
        System.out.println(d1==d3);
        */
        /*
         * d1d2d3都指向一個地址,進行比較的時候,equals比較的是對象的值
         * 而==是比較的是地址
         */
        Demo_a d1=new Demo_a(4);
        Demo_a d2=new Demo_a(6);
        System.out.println(d1.equals(d2));
        //[toString]
        System.out.println(d1.toString());//打印的是該對象的哈希值。
        
    }
}
/*API裏面:
 * boolean  |||||||         equals(Object obj)
 */

-----------------------------------------------------------------------------------------------------------------

【內部類】

 * 【內部類】
 *1、將一個類定義在另外一個類裏面,對立面那個類就稱爲內部類(內置類,嵌套類)
 *2、訪問特點:
 *    2.1、內部類可以直接訪問外部類中的成員、私有成員
 *        之所以可以直接訪問外部類中的成員,是因爲內部類中持有一個外部類的引用,格式:   外部類名.this    具體看【a】
 *    2.2、外部類要訪問內部類中的成員必須要建立內部類對象。
 *內部類是屬於外部類的成員變量,是可以私有化的
 *
 *【1,內部類在main方法中格式,2內部類爲什麼可以直接訪問外部類】
 *訪問格式:
 *1、當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中直接建立內部類對象。
 *    格式:外部名.內部類名   變量名=new 外部類對象().new 內部類對象();
 *          Outer.Inner in=new Outer().new Inner();
 *
 *2、當內部類在成員位置上,就可以被成員修飾符所修飾。
 *    比如,private 將內部類在外部類中進行封裝
 *         static :內部類就具備了static的特性;
 *          當內部類被static修飾後,只能訪問外部類中的static成員,出現了局限性。
 *
 *          在外部類中,如何直接訪問內部類的非靜態成員呢?
 *         new Outer.Inner().Function();
 *
 *          在外部類中,如何直接訪問內部類的靜態成員呢?
 *         new Outer.Inner.Function2();
 *注意:當內部類中定義了靜態成員,該內部類必須是static的。
 *        當外部類中的靜態方法訪問內部類時,內部類也必須是靜態的。
【b】
 *【b】
 *在定義一個內部類:
 *
 *當描述事物時,事物的內部還有事物,該事物用內部類來描述,
 *因爲內部事物在使用外部事物的內容。
 *
 *包含關係的時候就使用內部類。
 *【c】
 *內部類可以寫在外部類的任意位置;【成員】或者【局部】。
 *【c】中屬於局部內部類,但是訪問規則沒有改變,
 *        該類不能在被static修飾,因爲static只修飾成員變量不能修飾局部成員
 *內部類定義在局部時
 *1,不可以被成員修飾符修飾
 *2,可以直接訪問外部類中的成員變量,因爲還持有外部類中的引用
 *    但是不可以訪問它所在的局部中的變量,只能訪問被final修飾的局部變量。
 *靜態內部類出現的並不多
 */
class Outer{
    int x=3;
    //class Inner{  //內部類
    static class Inner{  //靜態內部類
        int x=4;
        void Funtion(){
            int x=5;
            //內部類使用外部類成員和方法,可以直接調用
            System.out.println("內部類成員變量:"+this.x);
            System.out.println("內部類局部變量:"+x);
            //當內部類定義爲靜態內部類的時候,非靜態的變量就不能訪問了
            //System.out.println("外部類成員變量:"+Outer.this.x);
            //注意看上面的結果,有3個x成員的值得【a】
        }
        static void funtion2(){
             System.out.println("funtion2");
         }
    }
    void method(){
        System.out.println("show   "+x);
        //外部類使用內部類成員和功能 必須創建內部類對象
        Inner in=new Inner();
        in.Funtion();
    }

    
//【b】又一個內部類:
    class Inner2{
        void show(){
             System.out.println("inner222");
            }
        }
    public static void method2(){
        Inner.funtion2();
        //new Inner2().show();
        /*發現,該靜態方法調用靜態內部類可以編譯
         * 而調用非靜態內部類編譯出錯。

         *
         */
    }
    //【c】
    //void method3(int a){  【mm】對應下列【mm】
    void method3(final int a){
        int x=3;
        final int y=4;
        class Inner3{
            void function3(){
                //System.out.println(x);  //不能訪問該類所在的局部的變量
                System.out.println(y);    //而只能訪問局部中final修飾的變量
                System.out.println(a);    //傳入int a是編譯錯誤,傳入final 修飾的纔可以通過【mm】
                System.out.println("該內部類屬於局部內部類,但是訪問規則沒有改變。" +
                        "該類不能在被static修飾因爲static只修飾成員變量不能修飾局部成員");

            }
        }
        new Inner3().function3();
    }

}




public class Demo_Neibulei {

    
    public static void main(String[] args) {
        
        //Outer ou=new Outer();
        //ou.method();
        //面試時候用:內部類想要在main方法中創建對象格式:
        //Outer.Inner in=new Outer().new Inner();
        //in.Funtion();

        
        //使用很少,面試可能出現。
         // 在外部類中,如何直接訪問靜態內部類非靜態成員呢?
        new Outer.Inner().Funtion();
         // 在外部類中,如何直接訪問靜態內部類靜態成員呢?
        Outer.Inner.funtion2();
    }

}







---------- android培訓、 java培訓、期待與您交流!----------
黑馬官網: http://edu.csdn.net/heima
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章