Java抽象类知识点(含面试大厂题和源码)

抽象类(Abstract Class)是面向对象编程中的一个核心概念,它在Java等编程语言中扮演着重要的角色。以下是关于抽象类的一系列知识点:

1. 抽象类的定义

抽象类是一种不能被实例化的类,它通常包含一个或多个抽象方法。抽象方法是指没有具体实现的方法,只有声明而没有方法体。

2. 抽象类的作用

  • 规范功能:抽象类可以定义一组规范,其子类必须遵循这些规范来实现具体功能。
  • 封装共性:抽象类可以封装一组相关的属性和方法,这些共性可以在所有子类中共享。
  • 代码复用:通过抽象类,可以在不编写具体实现的情况下复用代码,提高代码的可维护性和可扩展性。

3. 抽象类的创建

在Java中,使用 abstract 关键字来定义一个抽象类。如下所示:

public abstract class Animal {
    // 抽象方法
    public abstract void sound();
    
    // 具体方法
    public void eat() {
        System.out.println("Eating...");
    }
}

4. 抽象方法的定义

抽象方法是一种没有具体实现的方法,它只有声明。子类必须覆盖(override)这些方法,提供具体的实现。如下所示:

public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Woof!");
    }
}

5. 抽象类的限制

  • 不能实例化:不能直接使用 new 关键字创建抽象类的实例。
  • 可以包含构造函数:虽然不能实例化,但抽象类可以有构造函数,这些构造函数在子类对象创建时被调用。
  • 可以包含字段:抽象类可以有成员变量,这些变量可以是静态的、最终的或易变的。
  • 可以包含方法:除了抽象方法,抽象类还可以包含具体方法和静态方法。

6. 抽象类的继承

所有抽象类的子类都必须覆盖父类中的所有抽象方法,除非子类本身也是抽象类。如果子类没有覆盖所有抽象方法,那么子类也必须被声明为抽象类。

7. 抽象类与接口

抽象类和接口(Interface)都可以用来定义规范,但它们有一些区别:

  • 抽象类可以包含具体方法和非抽象方法,而接口只能包含抽象方法(在Java 8之前)。
  • 一个类可以继承多个接口,但只能继承一个抽象类。
  • 接口不能包含状态信息,即不能有实例变量(除了静态常量),而抽象类可以有状态信息。

8. 使用场景

  • 当你想创建一个基类来规范一系列子类的行为时。
  • 当你的类中有多个方法需要子类实现,但这些方法之间有共同的默认行为时。
  • 当你希望在运行时只知道你的类是某种类型的实例,但不需要知道它的具体子类时。

通过理解抽象类的这些知识点,你可以更好地设计和使用抽象类来提高代码的质量和灵活性。

题目 1:二叉树的最大深度

问题描述:给定一个二叉树,找出其最大深度。

解决方案:使用递归算法遍历二叉树的所有节点,计算树的高度。

Java 源码

public class BinaryTreeMaxDepth {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        return Math.max(leftDepth, rightDepth) + 1; // 加1是因为要计算当前节点的深度
    }

    // 定义二叉树节点
    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int x) {
            val = x;
        }
    }
}

题目 2:有效的括号

问题描述:给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

解决方案:使用栈数据结构,遇到左括号就入栈,遇到右括号就出栈,如果栈为空或者最后栈中还有元素,则字符串无效。

Java 源码

public class ValidParentheses {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(' || c == '{' || c == '[') {
                stack.push(c);
            } else {
                if (stack.isEmpty()) {
                    return false;
                }
                char top = stack.pop();
                if ((c == ')' && top == '(') || (c == '}' && top == '{') || (c == ']' && top == '[')) {
                    continue;
                } else {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

题目 3:字符串的排列

问题描述:给定一个字符串,找到所有不同的非空子字符串的排列。

解决方案:生成所有可能的排列,并将它们转换为字符串,然后存储在列表中。

Java 源码

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

public class PermutationsOfString {
    public List<String> permuteUnique(String s) {
        List<String> result = new ArrayList<>();
        if (s == null || s.length() == 0) {
            return result;
        }
        char[] chars = s.toCharArray();
        Arrays.sort(chars); // 排序以消除重复的排列
        backtrack(result, new boolean[s.length()], chars, 0);
        return result;
    }

    private void backtrack(List<String> result, boolean[] used, char[] chars, int start) {
        if (start == chars.length) {
            result.add(new String(chars));
            return;
        }
        for (int i = 0; i < chars.length; i++) {
            if (used[i] || (start > 0 && chars[i] == chars[start - 1] && !used[i])) {
                continue; // 跳过重复字符
            }
            used[i] = true;
            backtrack(result, used, chars, start + 1);
            used[i] = false; // 回溯
        }
    }
}

这些题目覆盖了递归、栈、字符串处理等常见的算法和数据结构知识点,是面试中常见的问题类型。在准备面试时,理解和掌握这些问题的解决方法对于成功通过技术面试至关重要。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值