问一下关于抽象类和接口的问题

“一个类中若有抽象方法,则这个类必为抽象类”
为什么不能是接口呢

一般来说抽象方法是用来说抽象类的,而接口的方法一般不叫抽象方法而叫方法存根。当然这只是一种习惯叫法。

这句话我不知道从哪里说得,我跟人理解
严谨的话从定义上讲:在Java中,接口可以理解成为一种特殊的抽象类,它定义了一组方法的规范,但没有具体的实现。但注意接口和抽象类是完全不一样的,因为一个是interface,一个是class 。接口类可以实现一个或多个接口;但是抽象类不同。这句话是通的,因为说的是类中有抽象方法。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7401677
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:如何在一次请求中访问多个接口(方法)并获取多个返回值
  • 除此之外, 这篇博客: 【数据结构与算法】之深入解析“迷宫中离入口最近的出口”的求解思路与算法示例中的 ② 广度优先搜索 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 我们可以使用广度优先搜索来寻找迷宫中距离入口最近的出口,在广度优先搜索的过程中,在队列中保存 (cx, cy, d) 三元组,其中 (cx, cy) 为当前的行列坐标, d 为当前坐标相对入口的距离。
    • 当遍历至 (cx, cy) 时,枚举它上下左右的相邻坐标 (nx, ny),此时可能有三种情况:
      • (nx, ny) 不合法或对应的坐标为墙,此时无需进行任何操作;
      • (nx, ny) 为迷宫的出口(在迷宫边界且不为墙),此时应返回 d+1,即该出口相对入口的距离作为答案;
      • (nx, ny) 为空格子且不为出口,此时应将新坐标对应的三元组 (nx, ny, d+1) 加入队列。
    • 最终,如果不存在到达出口的路径,返回 −1 作为答案。
    • 为了避免重复遍历,可以将所有遍历过的坐标对应迷宫矩阵的值改为墙所对应的字符 ‘+’。
    • C++ 示例:
    class Solution {
    public:
        int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {
            int m = maze.size();
            int n = maze[0].size();
            // 上下左右四个相邻坐标对应的行列变化量
            vector<int> dx = {1, 0, -1, 0};
            vector<int> dy = {0, 1, 0, -1};
            queue<tuple<int, int, int>> q;
            // 入口加入队列并修改为墙
            q.emplace(entrance[0], entrance[1], 0);
            maze[entrance[0]][entrance[1]] = '+';
            while (!q.empty()){
                auto [cx, cy, d] = q.front();
                q.pop();
                // 遍历四个方向相邻坐标
                for (int k = 0; k < 4; ++k){
                    int nx = cx + dx[k];
                    int ny = cy + dy[k];
                    // 新坐标合法且不为墙
                    if (nx >= 0 && nx < m && ny >= 0 && ny < n && maze[nx][ny] == '.'){
                        if (nx == 0 || nx == m - 1 || ny == 0 || ny == n - 1){
                            // 新坐标为出口,返回距离作为答案
                            return d + 1;
                        }
                        // 新坐标为空格子且不为出口,修改为墙并加入队列
                        maze[nx][ny] = '+';
                        q.emplace(nx, ny, d + 1);
                    }
                }
            }
            // 不存在到出口的路径,返回 -1
            return -1;
        }
    };
    
    • Python 示例:
    class Solution:
        def nearestExit(self, maze: List[List[str]], entrance: List[int]) -> int:
            m, n = len(maze), len(maze[0])
            # 上下左右四个相邻坐标对应的行列变化量
            dx = [1, 0, -1, 0]
            dy = [0, 1, 0, -1]
            # 入口加入队列并修改为墙
            q = deque([(entrance[0], entrance[1], 0)])
            maze[entrance[0]][entrance[1]] = '+'
            while q:
                cx, cy, d = q.popleft()
                # 遍历四个方向相邻坐标
                for k in range(4):
                    nx = cx + dx[k]
                    ny = cy + dy[k]
                    if 0 <= nx < m and 0 <= ny < n and maze[nx][ny] == '.':
                        # 新坐标合法且不为墙
                        if nx == 0 or nx == m - 1 or ny == 0 or ny == n - 1:
                            # 新坐标为出口,返回距离作为答案
                            return d + 1
                        # 新坐标为空格子且不为出口,修改为墙并加入队列
                        maze[nx][ny] = '+'
                        q.append((nx, ny, d + 1))
            # 不存在到出口的路径,返回 -1
            return -1
    
  • 您还可以看一下 赖国荣老师的微信生活缴费商业项目标准版课程中的 第4讲:查询接口报文参数的详细介绍,加密及异常处理小节, 巩固相关知识点