1. 程式人生 > >java_Object、抽象類、介面、多型、類與類之間的轉換

java_Object、抽象類、介面、多型、類與類之間的轉換

package com.tz.obj;
/**
 * 父類:人類
 *          
 * @author Administrator
 *
 */
public class Person {
    String name;
    int age;
    char gender;
}
package com.tz.obj;
/**
 * 子類:學生
 * 
 * 屬性:name,age,gender,
 * 
 * @author Administrator
 *
 */
public class Student extends Person{
        int idNum;

        public
Student(){ } public Student(String name,int age,char gender,int idNum){ this.name = name; this.age = age; this.gender = gender; this.idNum = idNum; } @Override public String toString() { return "姓名:"
+name+"年齡"+age+"性別:"+gender+"學號:"+idNum; } //重寫equals方法 @Override public boolean equals(Object obj) { if(this == obj){ return true; } if(obj instanceof Student){ //instanceof(用來判斷物件): == < > Student s = (Student)obj; if
(s.name.equals(name)&&s.age==this.age&&s.idNum==this.idNum){//用==比較數值,用equals比較引用資料型別。 return true; } } return false; } }
package com.tz.obj;
/**
 * java中所以類的超類(基類):
 *          Object:      java.lang  -->  系統預設匯入
 *              toString():   輸出的是物件的地址
 *              equals()  :  比較的是內容,(重寫了equals方法的作用是設定你想要比較的內容,不重寫的話比較的是記憶體地址)
 * 
 *              String已經幫我們重寫了toString方法
 *                      
 * @author Administrator
 *
 */
public class ObjectTest {
        public static void main(String[] args) {
            String name1 = "HB";
            String name2 = "HB";

            //建立物件
            Student s1 = new Student("影子", 12, '男', 1111);
            Student s2 = new Student("影子", 12, '男', 1111);

            System.out.println(s1);   //
            System.out.println(s2.toString());    
            System.out.println("===========================");
            System.out.println(s1==s2);   //==:比較的是記憶體地址
            System.out.println(s1.equals(s2));  //

            System.out.println(name1.equals(name2));
        }
}

package com.tz.abs;
/**
 * 抽象類:(本質上是一個類)
 *      1、如果一個類中含有抽象方法,那麼這個類就一定是個抽象類
 *      2、抽象類可以沒有抽象方法。
 *      3、抽象類不可以被例項化。
 *      4、抽象類中有構造方法的,該構造方法是給子類建立物件用的
 *      5、非抽象可以繼承一個抽象類。但是必須要重寫類中的抽象方法
 *      6、final 是不能修飾抽象類和抽象方法的
 * 
 * 
 * 
 * 如何定義一個抽象類?
 *          class關鍵字前加abstract
 * 
 * 
 * 抽象方法:
 *      [修飾符] abstract 返回值型別 方法名();
 *      
 *      1、被abstract修飾
 *      2、沒有方法體
 *      3、以分號結尾
 *
 */
public abstract class AbstractTest {
    public void m1(){   //普通方法
        //方法體
    }

    public abstract void m2();   //抽象方法.


    public static void main(String[] args) {
        //AbstractTest ab = new AbstractTest();



    }
}
package com.tz.abs;

 public interface Interface1 extends Interface2,Interface3,Interface4 {

     //常量
     public static final String NAME ="LEJIAN"; 


     public abstract void eat();

     String m3();   //public abstract 可以省略


}
interface Interface2{

}
interface Interface3{

}
interface Interface4{

}
package com.tz.abs;
/**
 * 介面:
 * 語法:
 *      修飾符 interface 介面名{
 *  
 *      }
 * 
 * 介面也是引用資料型別,可以等同看作是一個類
 *      1、介面中只能有常量,抽象方法
 *      2、介面其實是一個特殊的抽象類,特殊在介面是完全抽象
 *      3、介面中沒有構造方法,不能被例項化
 *      4、類是單繼承,但是介面與介面之間多繼承
 *      5、介面與類之間多實現,一個類可以實現多個介面
 *      6、實現的關鍵字:implements
 *      7、一個非抽象的類實現一個介面時,必須實現介面中所有的方法
 * 
 * 
 * @author Administrator
 *
 */
public class InterfaceTest implements Interface1{

    public static void main(String[] args) {
         System.out.println(InterfaceTest.NAME);

    }



    @Override
    public String m3() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void eat() {
        // TODO Auto-generated method stub

    }


}
package com.tz.abs;
/**
 * 多型:
 *      生活中:同一個事物,由於條件不一樣,產生的結果也不同
 *      程式中:同一個引用型別,使用不同的例項而執行不同的操作
 * 
 *          1、父類的引用指向子類的物件
 *          2、建立子類物件時,呼叫的方法為子類重寫或繼承的方法
 * @author Administrator
 *
 */
public class PolyTest {
    public static void main(String[] args) {
        //建立物件 
        Animal animal = new Dog();    //父類   new 子類    ---》多型
                    animal = new Fish();
                    //animal = new bird();

        Master master = new Master();
        Dog dog = new Dog();
        dog.name="旺財";
        //master.feed(dog);

        Fish fish = new Fish();
        fish.name="小魚兒~";
    //  master.feed(fish);     //實際引數
    }

}

package com.tz.abs;
/**
 * 主人
 * @author Administrator
 *
 */
public class Master {
        public void feed(Dog dog){
            dog.move();
            System.out.println("我在喂汪汪汪......");
        }
        public void feed(Fish fish){   //形式引數
            fish.move();
            System.out.println("我得餵魚了.....");
        }


        public void feed(Animal animal){
            animal.move();
            System.out.println("餵養"+animal.name);
        }


}

package com.tz.abs;
/**
 * 類與類之間的轉換
 *          向上轉型------    子類--》父類       自動
 *          向下轉型------      父類--》子類     強制
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {

        Animal dog = new Dog();    //父類的引用指向子類的物件

        //父類--》子類
        //Dog animl = (Dog) new Animal();   //強制型別轉換

        Animal a = new Dog();

        if(a instanceof Dog){
            Dog d = (Dog)a;     //向下轉型存在風險    
            System.out.println(d);
        }else{
            System.out.println("不是狗");
        }

        //System.out.println(animl);
    }
}