1. 程式人生 > >JAVA程式設計基礎——(抽象類、密封類和介面)

JAVA程式設計基礎——(抽象類、密封類和介面)

一、抽象類

(一)抽象類:包含抽象方法的類稱為抽象類。

抽象類也要被abstract修飾,抽象類中可以有非抽象方法,抽象類不能建立例項物件。


abstract class Animal {

    public abstract void bark();//抽象方法

    public void fun(){
        System.out.println("abstract Animal.fun()");
    }
}

(二)抽象方法:被abstract所修飾,在抽象類中不予以實現。

當有一個類繼承了當前的抽象類後,需要實現當中的抽象方法。

如果不加訪問修飾限定符,預設為public。

 

(三)抽象類的派生類:

(1)如果是普通方法,必須實現抽象類當中的抽象方法;

(2)如果是抽象方法,可以不實現基類的抽象方法。

 

abstract class Dog extends Animal {
    public Dog() {
        System.out.println("Dod() init");
    }

    public abstract void bark();

//    public void bark() {
//        System.out.println("Dog:wangwang");
//    }
}

class LittleDog extends Dog {
    public void bark() {
        System.out.println("Dog:wangwang");
    }
}

 

 

(四)問題1:

抽象類和普通類的區別:

(1)抽象類不能被例項化;

(2)抽象方法必須是public或protected,或者不寫;

(3)抽象類被abstract所修飾;

(4)抽象方法不能在抽象類當中實現。

二、密封類

(一)密封類:當一個類被final所修飾的時候,當前類被稱為密封類。

注意:1、該類不能作用於基類;

          2、就算派生類也被final所修飾也不可以。

作用:防止有意的派生。

/*
final class Person {
    private String name;
    private int age;
    public Person() {
       System.out.println("Person init()");
    }

    public void fun1() {
        System.out.println("Person fun1()");
    }

}

//Person不能被繼承
//class Student extends Person {
//
//}
*/

(二)密封方法:final

不能被重寫。

/*
class Person {
    private String name;
    private int age;
    public Person() {
        System.out.println("Person init()");
    }

    public final void fun1() {//密封方法
        System.out.println("Person fun1()");
    }

}

class Student extends Person {
    public final void fun1() {
        System.out.println("Person fun1()");
    }
}
*/

三、介面

(一)介面:

1、由interface定義;

2、屬性預設為public static final;

3、方法預設為public abstract;

4、實現介面:implements。

interface A {//定義一個介面
    public static final int AGE = 10;//屬性       預設為public static final
    public abstract void fun();//方法     預設為public abstract方法
    //介面中全部都是抽象方法
//    void fun2() {
//
//    }
}

interface B {//定義一個介面
    int AGE = 111;
    void fun2();
}

注:1、在JAVA裡,繼承只是單繼承

       2、類實現介面必須實現介面中定義的方法

       3、介面支援向上繼承。

(二)Cloneable介面:空介面(標記介面)

注:實現Cloneable介面必須要重寫Object的clone()方法。

public interface Cloneable {
}

問題2、這個空介面的設計有什麼作用?

標記當前類可以進行clone,如果不實現這個介面JVM不能識別。

(三)Comparable介面

public interface Comparable<T> {
    public int compareTo(T o);
}
//Comparable介面

package practise.abstractAndFinal;

import java.util.Arrays;


class Student1 implements Comparable<Student1>{
    private String name;
    private int age;
    private double score;

    public Student1(String name,int age,double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    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 double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    @Override
    public int compareTo(Student1 o) {
//        return age-o.age;
//        return name.compareTo(o.name);//引用型別
        return (int)(score - o.score);
        //[Student1{name='li', age=22, score=77.7}, Student1{name='wang', age=21, score=88.8}, Student1{name='zhang', age=20, score=99.9}
    }
}

/*
public interface Comparable<T> {
    public int compareTo(T o);
}
 */

public class Test7_Comparable {
    public static void main(String[] args) {
        Student1[] students = new Student1[3];//物件陣列
        students[0] = new Student1("zhang",20,99.9);
        students[1] = new Student1("wang",21,88.8);
        students[2] = new Student1("li",22,77.7);
        
        //根據年齡進行排序
        /**
         * 自定義型別進行排序
         * 實現Compareable介面
         * 實現compareTo()方法
         */

        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
    }
}

(四)Comparator介面

package practise.abstractAndFinal;

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

class Student2 {
    private String name;
    private int age;
    private double score;

    public Student2(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    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 double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

public class Test8_Comparator {
    public static void main(String[] args) {
        Student2[] students = new Student2[3];//物件陣列
        students[0] = new Student2("zhang",20,99.9);
        students[1] = new Student2("wang",21,88.8);
        students[2] = new Student2("li",22,77.7);

        Arrays.sort(students, new Comparator<Student2>() {
            /**
             *介面不一定不能new
             * Arrays.sort()排序的時候,用來傳參
             */
            @Override
            public int compare(Student2 o1, Student2 o2) {
//                return o1.getAge() - o2.getAge();
                return (int)(o1.getScore() - o2.getScore());
//                return o1.getName().compareTo(o2.getName());
            }
        });

        System.out.println(Arrays.toString(students));

    }
}

問題3、Comparable和Comparator的區別:

(1)Comparable作用在類內;Comparator在類外。

(2)內部方法:Comparable(compareTo);Comparator(compare)。