Java进阶13讲___第二讲

本讲主要内容:
1.多态   
2.抽象类   
3.接口

一、多态

1.概述

final关键字-前置知识(补充)

1.认识final

2.常量详解-(补充)

二、抽象类

1.认识抽象类

抽象类最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。

类该有的成员(成员变量、方法、构造器)抽象类都可以有

2.使用抽象类的好处

代码案例:更好的支持多态


3.模版方法设计模式

抽象类常见的设计模式:模版方式设计模式

示例代码:

三、接口

1.接口概述

示例代码:

*2.使用接口的好处(重点)

3.接口的综合案例

1.创建学生对象类

package cn.hdc.oop2.i_interface_demo;

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;
    }
}

2.创建班级管理类

package cn.hdc.oop2.i_interface_demo;

import java.util.ArrayList;

public class ClassManage  {
    private ArrayList<Student> students = new ArrayList<>();

    public void printAllInfo(){
    //等待调用接口实现类
    }
    public void printAvgScore(){
    //等待调用接口实现类
    }
    public ClassManage() {
        students.add(new Student("张三", '男', 90));
        students.add(new Student("李四", '女', 80));
        students.add(new Student("王五", '男', 70));
        students.add(new Student("赵六", '女', 60));
    }

    public ClassManage(ArrayList<Student> students) {
        this.students = students;
    }
}

3.创建业务方案接口

package cn.hdc.oop2.i_interface_demo;

import java.util.ArrayList;

public interface StudentOpertaor {
    void printAllInfo(ArrayList<Student> students);
    void printAvgScore(ArrayList<Student> students);
}

4.创建接口实现类

1.方案一:
package cn.hdc.oop2.i_interface_demo;

import java.util.ArrayList;

public class StudentOperatorImpl1 implements StudentOpertaor {

    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("==全班全部学生信息如下:==");
        for (int i = 0; i < students.size(); i++) {
            System.out.println(students.get(i).getName() + ",性别:" + students.get(i).getSex() + ",成绩:" + students.get(i).getScore());
        }
        System.out.println("==========================");
    }

    @Override
    public void printAvgScore(ArrayList<Student> students) {
        double sum = 0;
        System.out.println("==全班同学的平均成绩:==");
        for (int i = 0; i < students.size(); i++) {
            sum += students.get(i).getScore();
        }
        System.out.println("平均分:" + sum / students.size());
        System.out.println("==========================");
    }
}
2.方案二:
package cn.hdc.oop2.i_interface_demo;

import java.util.ArrayList;

public class StudentOperatorImpl2 implements StudentOpertaor {
    @Override
    public void printAllInfo(ArrayList<Student> students) {
        System.out.println("==全班学生信息如下:==");
        int man = 0;
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getSex() == '男') {
                man++;
            }
            System.out.println(students.get(i).getName()+",性别:" + students.get(i).getSex() + ",成绩:" + students.get(i).getScore());
        }
        System.out.println("==全班共有男生" + man + "人,女生" + (students.size() - man) + "人==");
        System.out.println("======================================================");
    }

    @Override
    public void printAvgScore(ArrayList<Student> students) {
        System.out.println("==全班学生去除最高分和最低分后的平均成绩如下:==");
        double sum = 0;
        double max = students.get(0).getScore();
        double min = students.get(0).getScore();
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getScore() > max) {
                max = students.get(i).getScore();
            }
            if (students.get(i).getScore() < min) {
                min = students.get(i).getScore();
            }
            sum += students.get(i).getScore();
        }
        System.out.println("全班学生去除最高分" + max + "和最低分" + min + "后的平均成绩为:" + (sum - max - min) / (students.size() - 2));
        System.out.println("======================================================");
    }
}

5.班级管理类调用接口实现类

package cn.hdc.oop2.i_interface_demo;

import java.util.ArrayList;

public class ClassManage  {
    private ArrayList<Student> students = new ArrayList<>();
    private StudentOpertaor opertaor1 = new StudentOperatorImpl1();//new StudentOperatorImpl2()   随时调用两种方案

    public void printAllInfo(){
        opertaor1.printAllInfo(students);
    }
    public void printAvgScore(){
        opertaor1.printAvgScore(students);
    }
    public ClassManage() {
        students.add(new Student("张三", '男', 90));
        students.add(new Student("李四", '女', 80));
        students.add(new Student("王五", '男', 70));
        students.add(new Student("赵六", '女', 60));
    }

    public ClassManage(ArrayList<Student> students) {
        this.students = students;
    }
}

6.主程序运行

package cn.hdc.oop2.i_interface_demo;

public class Main {
    public static void main(String[] args) {
        ClassManage classManage = new ClassManage();
        classManage.printAllInfo();
        classManage.printAvgScore();
    }
}

7.运行结果

4.接口的其他细节

1.JDK8开始新增的三种方法

接口:

package cn.hdc.oop2.i_interface_jdk8;

public interface A {
    /**
     * 默认方法:必须使用default修饰,默认会被public修饰
     * 实例方法:对象的方法,必须使用实现类的对象来访问。
     */
    default void test1() {
        test2();
        System.out.println("默认方法");
    }

    /**
     * 私有方法:必须使用private修饰 JDK9及以后
     */
    private void test2() {
        System.out.println("私有方法");
    }

    /**
     * 静态方法:必须使用static修饰,默认会被public修饰,只能用接口名调用
     */
    static void test3() {
        System.out.println("静态方法");
    }
}

接口实现类: 

package cn.hdc.oop2.i_interface_jdk8;

public class A1 implements A{

}

 主函数调用:

package cn.hdc.oop2.i_interface_jdk8;

public class Main {
    public static void main(String[] args) {
        A1 a1 = new A1();
        a1.test1();
        A.test3();
    }
}

运行结果: 

2.接口的多继承

package cn.hdc.oop2.i_interface_attention;

public class Main {
    public static void main(String[] args) {
        D d = new D();
        d.test();
        d.testB();
        d.testC();
    }
}

class D implements A {

}

interface A extends B, C {
    default void test() {
        System.out.println("testA");
    }
}

interface B {
    default void testB() {
        System.out.println("testB");
    }
}

interface C {
    default void testC() {
        System.out.println("testC");
    }

}

运行结果:

3.接口的其他注意事项

 1.示例

2.示例

3.示例
package cn.hdc.oop2.i_interface_attention;
public class Main {
    public static void main(String[] args) {
        D d = new D();
        d.test1();
    }
}
class D extends A implements B {}
class A {
    public void test1() {
        System.out.println("这是父类的test1");
    }
}
interface B {
    default void test1() {
        System.out.println("这是接口的test1");
    }
}

4.示例
package cn.hdc.oop2.i_interface_attention;

public class Main {
    public static void main(String[] args) {
        D d = new D();
        d.test1();
    }
}

class D implements A, B {
    @Override
    public void test1() {
        System.out.println("这是重写的test1");
    }
}

interface A {
    default void test1() {
        System.out.println("这是父类的test1");
    }
}

interface B {
    default void test1() {
        System.out.println("这是接口的test1");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值