1. 程式人生 > >接口,Comparable和Comparator

接口,Comparable和Comparator

desc 繼承 one 屬性 face his 接口實現 參數 怎麽

1.抽象類和接口的區別

  抽象類

    含有abstract修飾符的class 即為抽象類,abstract類不能創建實例對象,含有abstract的方法的類必須定義為abstract class ,abstract class 裏的方法不必是抽象的,抽

   象類定義抽象方法必須放在具體子類中實現,所以,不能有抽象的構造方法或抽象的靜態方法,如果子類沒有實現抽象父類中的所有方法,那麽,子類也必須定義為抽象類。

接口(interface):

    可以說成是抽象類的特例。接口中的所有方法都必須是抽象的,接口中的方法定義默認為public abstract 。接口中的變量是全局常量,即public static final修飾的。

在語法上的區別:

a. 抽象類裏可以有構造方法,而接口內不能有構造方法。

b. 抽象類中可以有普通成員變量,而接口中不能有普通成員變量。

c. 抽象類中可以包含非抽象的普通方法,而接口中所有的方法必須是抽象的,不能有非抽象的普通方法。

d. 抽象類中的抽象方法的訪問類型可以是public ,protected和默認類型,但接口中的抽象方法只能是public類型的,並且默認即為public abstract類型。

e. 抽象類中可以包含靜態方法,接口內不能包含靜態方法。

f. 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static類型,並且默認為public static類型。

g. 一個類可以實現多個接口,但只能繼承一個抽象類。

設計思想上的區別:

    抽象類:找到類和類之間的共性,慢慢向上提取,一種自底而上抽象出來的
      對象-->類-->父類-->抽象類
    接口:考慮不同類之間的通用功能的擴展,一種自頂向下的設計思想

      創建一個飛的接口,超人飛,小鳥飛,飛機飛,都要實現這個接口

再補充點兩者在應用上的區別:

a. 接口更多的是在系統框架設計方法發揮作用,主要定義模塊之間的通信,而抽象類在代碼實現方面發揮作用,可以實現代碼的重用。

b. 在JDK1.8之後可以添加有實現的方法。

2.什麽是接口

  Java接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。

  接口是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合。一旦類實現了接口,類就可以支持接口所指定的所有屬性和成員。

3.使用接口的好處

  a.彌補了java不能多繼承的缺點

  b.

4.接口的使用步驟:

  1.實現接口 implements
  2.重寫方法
  3.傳遞接口實現類 使用instantsOf

5.理解(轉)

  這個問題這困擾了我很久,後來我才想明白,大家都說接口就是實現擴展功能用的,這句話其實是最誤導人的,因為接口本身並沒有實現方法,它只是一條路,是一個工具,千萬別想復雜,真正實現功能擴展的是實現方法的對象和調用接口的方法。下面舉個栗子。
  狗這個類繼承了走獸類,它有跑,跳,啃,等方法。但是它不會飛,它的父類也沒有這個方法。但是你想讓狗有飛這個功能,怎麽辦呢?當然你可以直接在狗的類中給它添加一個飛的方法就行了。有可能你並不會寫這個方法,或者是這個方法需要幾千幾萬行代碼,硬寫嗎?那以後你還想要豬,牛,羊等等都可以飛呢?那又怎麽辦呢?這時候你發現你有一個類,這個類就叫飛行獸吧。它有一個方法就是飛行,這下好了,你決定讓狗繼承它,結果發現不能多繼承,你又想讓狗的父類繼承它,結果發現還有其他的走獸不能讓他們飛。這時候就需要接口出來了,這個接口我們叫它插翅膀吧,這個接口有一個方法就是插翅膀,但沒有實現,因為接口不管你怎麽給狗插翅膀。同時你還發現在飛行獸裏有一個帶參數的構造方法,而參數類型就是這個接口類型。但是狗的類型是狗而不是接口類型,沒法作為參數傳進去,這時你就可以讓狗實現這個接口,這個狗對象就成了插了翅膀的狗,接著通過多態的原理把插了翅膀的狗這個對象傳給飛行獸,這狗這就成了飛行獸,可以飛了。
  ChiBang chibangdog=new Dog()
  FlyShou flydog =new FlyShou(chibangdog)

可以飛的狗就出來了,以後要豬飛就讓豬實現插翅膀,要羊飛就讓羊實現插翅膀,要牛飛就......直接吹吧。不知道這樣說明白沒有。

  1 //實現Comparable類
  2 public class Student implements Comparable<Student> {
  3     private String name;
  4     private int age;
  5     private int iD;
  6 
  7     public Student(String name, int age, int iD) {
  8         super();
  9         this.name = name;
 10         this.age = age;
 11         this.iD = iD;
 12     }
 13 
 14     @Override
 15     public String toString() {
 16         return "Student [name=" + name + ", age=" + age + ", iD=" + iD + "]";
 17     }
 18 
 19     public String getName() {
 20         return name;
 21     }
 22 
 23     public void setName(String name) {
 24         this.name = name;
 25     }
 26 
 27     public int getAge() {
 28         return age;
 29     }
 30 
 31     public void setAge(int age) {
 32         this.age = age;
 33     }
 34 
 35     public int getiD() {
 36         return iD;
 37     }
 38 
 39     public void setiD(int iD) {
 40         this.iD = iD;
 41     }
 42 
 43     @Override
 44     public int compareTo(Student o) {
 45 
 46         return this.age - o.age;
 47     }
 48 
 49 }
 50 
 51 public class School {
 52     private Student[] students;
 53 
 54     public Student[] getStudents() {
 55         return students;
 56     }
 57 
 58     public void setStudents(Student[] students) {
 59         this.students = students;
 60     }
 61 
 62     @Override
 63     public String toString() {
 64         return "School [students=" + Arrays.toString(students) + "]";
 65     }
 66 
 67 }
 68 
 69 public class SchoolTest {
 70     public static void main(String[] args) {
 71         School sc = new School();
 72         Student[] students = new Student[3];
 73 //        Student stu = null;
 74 
 75         students[0] = new Student("林青霞", 18, 1);
 76         students[1] = new Student("楊坤", 12, 2);
 77         students[2] = new Student("周傑倫", 20, 3);
 78         sc.setStudents(students);
 79 //Student沒有排序的方法,這個方法的底層是靠Comparable接口的CompareTo方法實現排序的,
 80 //        如果要讓學生有比較功能,那就要實現這個比較接口,然後通過多態的方式把學生這個類的對象傳遞Object,這樣就可以比較了
 81         Arrays.sort(students);
 82         System.out.println(sc.toString());
 83 
 84     }
 85 
 86 }
 87 
 88 //sort內部使用學生類調用了compareTo
 89   // Find end of run, and reverse range if descending
 90         if (((Comparable) a[runHi++]).compareTo(a[lo]) < 0) { // Descending
 91             while (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) < 0)
 92                 runHi++;
 93             reverseRange(a, lo, runHi);
 94         } else {                              // Ascending
 95             while (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) >= 0)
 96                 runHi++;
 97         }
 98 
 99         return runHi - lo;
100     }
101 School [students=[Student [name=楊坤, age=12, iD=2], Student [name=林青霞, age=18, iD=1], Student [name=周傑倫, age=20, iD=3]]]

//自定義比較器,調用的是sort(T[] a, Comparator<? super T> c) 
 //         根據指定比較器產生的順序對指定對象數組進行排序。
public class Student {
    private String name;
    private int age;
    private int iD;

    public Student(String name, int age, int iD) {
        super();
        this.name = name;
        this.age = age;
        this.iD = iD;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", iD=" + iD + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getiD() {
        return iD;
    }

    public void setiD(int iD) {
        this.iD = iD;
    }
}
//比較器
public class StudentTest {

    public static void main(String[] args) {
        Student st1 = new Student("zs", 12, 1);
        Student st2 = new Student("ls", 10, 2);
        Student st3 = new Student("ww", 19, 3);
        Student[] students = { st1, st2, st3 };
        Arrays.sort(students, new MynameascComparator());
        System.out.println(Arrays.toString(students));

    }
}
//測試類
public class MynameascComparator implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        if (o1 instanceof Student && o2 instanceof Student) {
            Student one = (Student) o1;
            Student another = (Student) o2;
            return one.getName().compareTo(another.getName());
        }
        return 0;
    }

}
執行結果:
[Student [name=ls, age=10, iD=2], Student [name=ww, age=19, iD=3], Student [name=zs, age=12, iD=1]]

//使用匿名內部類改寫Comparator
public class Student {
    private String name;
    private int age;
    private int iD;

    public Student(String name, int age, int iD) {
        super();
        this.name = name;
        this.age = age;
        this.iD = iD;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", iD=" + iD + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getiD() {
        return iD;
    }

    public void setiD(int iD) {
        this.iD = iD;
    }
}

import java.util.Arrays;
import java.util.Comparator;

public class StudentTest {

    public static void main(String[] args) {
        Student st1 = new Student("zs", 12, 1);
        Student st2 = new Student("ls", 10, 2);
        Student st3 = new Student("ww", 19, 3);
        Student[] students = { st1, st2, st3 };
        Arrays.sort(students, new Comparator() {

            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Student && o2 instanceof Student) {
                    Student one = (Student) o1;
                    Student another = (Student) o2;
                    return one.getName().compareTo(another.getName());
                }
                return 0;
            }
        });
        System.out.println(Arrays.toString(students));

    }
}
執行結果
[Student [name=ls, age=10, iD=2], Student [name=ww, age=19, iD=3], Student [name=zs, age=12, iD=1]]

6.匿名內部類

  

接口,Comparable和Comparator