【java】【面对对象高级3】多态 + final + 抽象类 + 接口

目录

1、多态

1.1 认识多态

 1.1.1 对象多态

 1.1.2 行为多态

 1.1.3 成员变量不谈多态

1.2 使用多态的好处

1.3 多态下的类型转换问题

2、final 

2.1 认识final

2.1.1 修饰类

2.1.2 修饰方法

2.1.3 修饰变量

 2.2 补充知识:常量详解

3、抽象类abstract

3.1 认识抽象类

3.2 使用抽象类的好处

3.3 抽象类的常见应用场景:模版方法设计模式

3.3.1 模版方法设计解决了什么问题

 3.3.2 模版方法设计模式的写法

 3.3.2.1 People父类

3.3.2.2 Student子类

3.3.2.3 Teacher子类 

 3.3.2.4 main

 3.3.2.5 多学一招使用final修饰模版方法

4、接口

4.1 接口概述

4.1.1 IDEA创建接口

4.1.2 认识接口

 4.1.3 接口的好处

 4.1.3.1 一个类同时可以实现多个接口

 4.1.3.2 让程序面向接口编程,灵活切换多个业务(下图存在A/B司机)

4.2 接口的综合案例

4.2.1 创建实体类Student2

 4.2.2 创建接口StudentOperator

4.2.3 定义第一套实现类StudentOperatorImpl1

4.2.4 定义第二套实现类StudentOperatorImpl2

 4.2.5 创建数据处理类ClassManager

4.2.6 主函数

4.3 接口的其他细节:

4.3.1 jdk8接口新增三种方法

4.3.1.1 默认方法:必须使用default修饰,默认会被public修饰

4.3.1.2 私有方法:必须使用privata修饰(jdk9以上) 

4.3.1.3 静态方法:必须使用static修饰 

4.3.2 接口的多继承

4.3.3 使用接口的注意事项[了解]


前言:多态是在继承/实现情况下一种现象,表现形式为:对象多态、行为多态

1、多态

1.1 认识多态

 父类

 学生类

 

 老师类

 1.1.1 对象多态

 

 1.1.2 行为多态

 1.1.3 成员变量不谈多态

1.2 使用多态的好处

  多态下怎么使用子类的独有功能 见 1.3

1.3 多态下的类型转换问题

 

 

2、final 

2.1 认识final

2.1.1 修饰类

一般工具类会加final

2.1.2 修饰方法

2.1.3 修饰变量

 

 2.2 补充知识:常量详解

3、抽象类abstract

3.1 认识抽象类

 

 

3.2 使用抽象类的好处

3.3 抽象类的常见应用场景:模版方法设计模式

3.3.1 模版方法设计解决了什么问题

 3.3.2 模版方法设计模式的写法

 3.3.2.1 People父类
package com.runa.staticdemo;

public abstract class People {
    // 开始设计模版方法设计模式
    //  1 定义有一个模版方法出来
    public final void write(){
        System.out.println("\t\t\t\t\t《我的码农经历》");
        System.out.println("\t\t《我的码农经历》");
        // 2 模版方法不清楚正文内容,子类肯定要写
        System.out.println(writeMain());
        System.out.println("\t\t结尾了");
    }
    // 3 设计一个抽象方法写正文,具体的实现交给子类实现
    public abstract String writeMain();
}
3.3.2.2 Student子类
package com.runa.staticdemo;

public class Student extends People{    
    public String writeMain(){
        return "\t\t正文我是来学习python的";
    }
}
3.3.2.3 Teacher子类 
package com.runa.staticdemo;

public class Teacher extends People{ 
    public String writeMain(){
        return "\t\t正文我是java老师";
    }
}
 3.3.2.4 main
package com.runa.staticdemo;

public class TestTemplate {
    public static void main(String[] args) {
        // 开头相同
        //正文不同
        //结尾相同
        Teacher t = new Teacher();
        t.write();
        System.out.println("===============================================");
        Student s = new Student();
        s.write();
    }
}

改版

package com.runa.staticdemo;

public class TestTemplate {
    public static void main(String[] args) {
        // 开头相同
        //正文不同
        //结尾相同
        People t = new Teacher();
        t.write();
        System.out.println("===============================================");
        People s = new Student();
        s.write();
    }
}
 3.3.2.5 多学一招使用final修饰模版方法

4、接口

4.1 接口概述

4.1.1 IDEA创建接口

4.1.2 认识接口

传统的接口里面只能有成员变量和成员方法,接口中定义的变量是常量;接口中定义的方法是抽象方法;并且接口也不能创建对象

  

package com.runa.staticdemo;

public interface D {
    // 多此一举 public  static
    public  static  String SCHOOLNAME = "S";
    String NAME = "S";
    
    // 成员方法(抽象方法) public  static  多此一举 ,成员方法不能构造器和方法体
    void test();

}

 

 接口D

package com.runa.staticdemo;

public interface D {

    // 成员方法 public  static  多此一举 ,成员方法不能构造器和方法体
    void testd1();
    void testd2();

}

 接口C

package com.runa.staticdemo;

public interface C {
    void testc1();
    void testc2();
}

 实现类E

package com.runa.staticdemo;
//实现类
public class E implements C, D{


    @Override
    public void testc1() {

    }

    @Override
    public void testc2() {

    }

    @Override
    public void testd1() {

    }

    @Override
    public void testd2() {

    }
}

 main

package com.runa.staticdemo;

public class TestIm {
    public static void main(String[] args) {
        E e = new E();
        e.testc1();
        e.testc2();
        e.testd1();
        e.testc2();
    }
}

 4.1.3 接口的好处

 4.1.3.1 一个类同时可以实现多个接口

 

 4.1.3.2 让程序面向接口编程,灵活切换多个业务(下图存在A/B司机)

 

4.2 接口的综合案例

4.2.1 创建实体类Student2

package com.runa.staticdemo;

public class Student2 {
    private String name;
    private char sex;
    private double score;

    public Student2() {
    }

    public Student2(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;
    }
}

 4.2.2 创建接口StudentOperator

定义2个抽象方法,接收全部学生信息

package com.runa.staticdemo;

import java.util.ArrayList;

public interface StudentOperator {
    void printAllInfo(ArrayList<Student2> students);
    void printAverageScore(ArrayList<Student2> students);
}

4.2.3 定义第一套实现类StudentOperatorImpl1

package com.runa.staticdemo;

import java.util.ArrayList;

public class StudentOperatorImpl1 implements StudentOperator{
    @Override
    public void printAllInfo(ArrayList<Student2> students) {
        System.out.println("==============全班全部学生信息如下:===================");
        for (int i = 0; i < students.size(); i++) {
            Student2 s = students.get(i);
            System.out.println("姓名:" + s.getName() + "性别:" + s.getSex()+ "成绩:" + s.getScore());

        }
        System.out.println("=======================================");

    }

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

4.2.4 定义第二套实现类StudentOperatorImpl2

package com.runa.staticdemo;

import java.util.ArrayList;

public class StudentOperatorImpl2 implements StudentOperator{
    @Override
    public void printAllInfo(ArrayList<Student2> students) {
        System.out.println("==============全班全部学生信息如下:===================");
        int count1 = 0;
        int count2 = 0;
        for (int i = 0; i < students.size(); i++) {
            Student2 s = students.get(i);
            System.out.println("姓名:" + s.getName() + "性别:" + s.getSex()+ "成绩:" + s.getScore());
            if(s.getSex()== '男'){
                count1 ++;
            }else {
                count2 ++;
            }
        }
        System.out.println("男生人数:" + count1 + "女生人数:" + count2 );
        System.out.println("总人数:" + students.size() );

        System.out.println("=======================================");

    }

    @Override
    public void printAverageScore(ArrayList<Student2> 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++) {
            Student2 s = students.get(i);
            if(s.getScore() > max) max = s.getScore(); //简写
            if(s.getScore() < min) min = s.getScore();
            allScore += s.getScore();
        }
        System.out.println("最高分:" + max + "最低分:" + min );
        System.out.println("平均分:" + (allScore - max - min) / (students.size() - 2));
    }
}

 4.2.5 创建数据处理类ClassManager

这里我使用了2个构造方法,无参合有参,有参的调用在主函数注释了

package com.runa.staticdemo;

import java.util.ArrayList;

public class ClassManager {
    private ArrayList<Student2> students = new ArrayList<>();
    private StudentOperator studentOperator = new StudentOperatorImpl2();// 这里切换方案
    public ClassManager() {
        students.add(new Student2("迪丽热巴",'女',99));
        students.add(new Student2("古力娜扎",'女',100));
        students.add(new Student2("马尔扎哈",'男',90));
        students.add(new Student2("卡尔",'男',60));
    }

    public ClassManager(ArrayList<Student2> students) {
        this.students = students;
    }

    //打印全班全部学生信息
    public void printInfo(){
        studentOperator.printAllInfo(students);
    }

    // 打印全班全部学生平均分
    public void printScore(){
        studentOperator.printAverageScore(students);
    }
}

4.2.6 主函数

package com.runa.staticdemo;

import java.util.ArrayList;

public class TestImplMain {
    public static void main(String[] args) {
//        ArrayList<Student2> ss = new ArrayList<>();
//        Student2 s1 = new Student2("迪丽热巴",'女',99);
//        Student2 s2 = new Student2("古力娜扎",'女',100);
//        Student2 s3 = new Student2("马尔扎哈",'男',90);
//        Student2 s4 = new Student2("卡尔",'男',60);
//        ss.add(s1);
//        ss.add(s2);
//        ss.add(s3);
//        ss.add(s4);
//        ClassManager c = new ClassManager(ss);
//        c.printInfo();
//        c.printScore();
        ClassManager c = new ClassManager();
        c.printInfo();
        c.printScore();

    }
}

4.3 接口的其他细节:

4.3.1 jdk8接口新增三种方法

4.3.1.1 默认方法:必须使用default修饰,默认会被public修饰

4.3.1.2 私有方法:必须使用privata修饰(jdk9以上) 

 

4.3.1.3 静态方法:必须使用static修饰 

 

4.3.2 接口的多继承

package com.runa.staticdemo;

public class TestInterfaceEx {
    public static void main(String[] args) {

    }
}

interface AA{

}
interface BB{
    void test1();
}
interface CC{
    void test2();

}
interface DD extends CC,BB,AA{

}
class EE implements DD{

    @Override
    public void test1() {
        
    }

    @Override
    public void test2() {

    }
}

4.3.3 使用接口的注意事项[了解]

签名冲突

 继承了父类和接口重名方法

 默认方法同名

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值