oop_promax_abstractAndInterface

abstract

/*
!!!抽象类、抽象方法是什么样的?
    1.都是用abstract修饰的;抽象方法只有方法签名,不能写方法体。

!!!抽象类有哪些注意事项和特点?
    1.抽象类中可以不写抽象方法、但有抽象方法的类一定是抽象类。
    2.类有的成员(成员变量、方法、构造器)抽象类都具备。
    3.抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
    4.一个类继承抽象类,必须重写玩抽象的全部抽象方法,否则这个类也必须定义成抽象类。

!!!抽象类的场景和好处?
    1.父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,
    我们设计这样的抽象类,就是为了更好的支持多态。
    2.模板方法设计模式:
        解决方法中存在重复代码的问题:
        1.定义一个抽象类。
        2.在里面定义两个方法:
            1.一个是模板方法(加final关键字防止子类重写):把相同的代码放进去。
            2.一个是抽象方法:具体实现交给子类完成。

*/

interface

/*
接口:
    1.Java提供看一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口。
    public interface 接口名{
        //成员变量(常量)
        //成员方法(抽象方法)
    }
    2.注意:接口不能创建对象;接口是用来被类实现的,实现接口的类被成为实现类。
    修饰符 class 实现类 implements 接口1,接口2,接口3,...{
    }
    3.一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口,必须重写完全部类的全部抽象方法,否则实现类
    必须定义成抽象方法。

!!!使用接口有啥好处?
    1.可以解决类单继承的问题,通过接口,我们可以让一个类有一个亲爹的同时,还可以找多个干爹去扩展自己的功能。

!!!为什么我们要通过接口已扩展自己的功能?
    1.因为通过接口去找干爹,别人通过你implements的接口,就可以显性的知道你是谁,从而也可以放心的把你当作谁
    来使用。

!!!使用接口的第二个好处?
    1.一个类我们说可以实现多个接口,同样,一个接口也可以被多个类实现的。这样做的好处是我们的程序就可以面向
    接口编程了,这样我们程序员就可以很方便的灵活切换各种业务实现。

!!!JDK8开始,接口中新增了哪些方法?
    1.默认方法:使用default修饰,使用实现类的对象调用。
    2.静态方法:static修饰,必须用当前接口名调用。
    3.私有方法:private修饰,jdk9开始才有的,只能在接口内部被调用。
    4.它们都会默认被public修饰。
    public interface A{
       default void test1(){
            ...
       }

       private void test2(){
            ...
       }

       static void test3(){
            ...
       }
    }

!!!JDK8开始,接口中为啥要新增怎这些方法?
    1.增强了接口的能力,更便于项目的拓展和维护。

接口的多继承:
    1.一个接口可以同时继承多个接口。

接口多继承的作用:
    1.便于实现类去实现。

接口其他注意事项:
    1.一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。
    2.一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。
    3.一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。(先后亲爸、后有干爹)
    4.一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
*/

interface_case

demand

/*
需求:
    请设计一个班级学生的信息管理模块:学生的数据有:姓名、性别、成绩
    功能 1:要求打印出全班学生的信息;功能 2:要求打印出全班学生的平均成绩

第 1 套方案:
    1.能打印出班级全部学生的信息;能打印班级全部学生的平均分。
第 2 套方案:
    1.能打印处班级全部学生的信息(包含男女人数);打印班级全部学生的平均分(要求是去掉最高分和最低分)。

需求:系统可以支持灵活的切换这些实现方案。
*/

print

package com.item.huang.interface_case;

import java.util.ArrayList;

public interface Print {
    //打印全部学生信息
    void printAllInformation(ArrayList<Student> students);
    //打印全部学生的平均分
    void printAverageScore(ArrayList<Student> students);
}

PrintLmol1

package com.item.huang.interface_case;

import java.util.ArrayList;

public class PrintImpl1 implements Print{

    @Override
    public void printAllInformation(ArrayList<Student> students) {
        for (int i = 0; i < students.size(); i++) {
            System.out.println("姓名:" + students.get(i).getName());
            System.out.println("性别:" + students.get(i).getSex());
            System.out.println("成绩:" + students.get(i).getScore());
        }
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore = 0.0;
        for (int i = 0; i < students.size(); i++) {
            allScore += students.get(i).getScore();
        }
        System.out.println("平均成绩是:"+allScore/students.size());
    }
}

PrintLmol2

package com.item.huang.interface_case;

import java.util.ArrayList;

public class PrintImpl2 implements Print{
    @Override
    public void printAllInformation(ArrayList<Student> students) {
        int count1 = 0;
        int count2 = 0;
        for (int i = 0; i < students.size(); i++) {
            System.out.println("姓名:" + students.get(i).getName());
            System.out.println("性别:" + students.get(i).getSex());
            System.out.println("成绩:" + students.get(i).getScore());
            if (students.get(i).getSex()=='男'){
                count1++;
            }else{
                count2++;
            }
        }
        System.out.println("男生有:"+count1+"人"+" 女生有:"+count2+"人");
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore = 0.0;
        double max = students.get(0).getScore();
        double min = students.get(0).getScore();
        for (int i = 0; i < students.size(); i++) {
            allScore += students.get(i).getScore();
            if (students.get(i).getScore()>max){
                max = students.get(i).getScore();
            }
            if (students.get(i).getScore()<min){
                min = students.get(i).getScore();
            }
        }
        System.out.println("平均成绩是:"+(allScore-max-min)/(students.size()-2));
    }
}

Student

package com.item.huang.interface_case;

//学生类
public class Student {
    private String name;
    private char sex ;
    private double score;

    public Student() {
    }

    public Student(String name, char sex, double score) {
        this.name = name;
        this.sex = sex;
        this.score = score;
    }

    public String getName() {
        return name;
    }

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

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public double getScore() {
        return score;
    }

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

StudentOperator

package com.item.huang.interface_case;

import java.util.ArrayList;
//学生操作类-1.定义打印全部学生信息功能 2.定义打印全班学生平均成绩功能
//Print接口有两个实现类,PrintImpl1 和 PrintImpl2
//根据多态的思想可以改变指向的实现类而使用其不同的方法
public class StudentOperator {
    private ArrayList<Student> Students = new ArrayList<>();
    private Print print = new PrintImpl2();
    public StudentOperator(){
        Student s1 = new Student("张三",'男',100);
        Students.add(s1);
        Student s2 = new Student("李四",'男',90);
        Students.add(s2);
        Student s3 = new Student("李娟",'女',90);
        Students.add(s3);
        Student s4 = new Student("魏琳",'女',60);
        Students.add(s4);
    }

    public void printAllInformation(){
    print.printAllInformation(Students);
    }
    public void printAverageScore(){
    print.printAverageScore(Students);
    }

}

Test

package com.item.huang.interface_case;


public class Test {
    public static void main(String[] args) {
        StudentOperator studentOperator = new StudentOperator();
        studentOperator.printAllInformation();
        studentOperator.printAverageScore();
    }
}

posted @ 2024-03-30 22:51  qing集  阅读(4)  评论(0编辑  收藏  举报