Java:私有构造方法与抽象类的区别解析
私有构造方法与抽象类的核心区别
设计目的完全不同
私有构造方法的核心是禁止任何实例化,不管是本类内部还是其他类,都没法创建这个类的对象,搭配final关键字就是为了做成纯静态的工具类,所有功能都靠静态字段和方法来实现。
抽象类的核心是作为基类被继承,它本身不能直接实例化,但必须被子类继承并实现抽象方法后,才能通过子类创建实例,目的是定义一套通用的行为规范,让子类遵循这套规范来实现具体逻辑。实例化规则差异
- 带私有构造的类:哪怕是它的子类,也没法调用父类的私有构造方法,所以子类也没法基于父类的构造来实例化(除非子类自己定义了独立的构造,但那和父类已经没有实例层面的关联了),整个类从根上就没法创建对象。
示例代码:
public final class StringUtils { // 私有构造,彻底禁止实例化 private StringUtils() {} public static String reverse(String str) { return new StringBuilder(str).reverse().toString(); } } // 尝试实例化会直接编译报错:StringUtils utils = new StringUtils();- 抽象类:不能直接用
new关键字创建实例,但子类继承抽象类并实现所有抽象方法后,就能正常创建子类的实例:
public abstract class Vehicle { public abstract void run(); } public class Car extends Vehicle { @Override public void run() { System.out.println("汽车在公路上行驶"); } } // 可以正常创建子类实例:Vehicle car = new Car();- 带私有构造的类:哪怕是它的子类,也没法调用父类的私有构造方法,所以子类也没法基于父类的构造来实例化(除非子类自己定义了独立的构造,但那和父类已经没有实例层面的关联了),整个类从根上就没法创建对象。
继承限制不同
带私有构造的类如果加上final,会直接禁止被继承;就算没加final,子类也没法完成继承逻辑——因为子类的构造方法必须调用父类的构造方法,但父类的构造是私有的,子类根本访问不到,所以继承会编译失败。
抽象类则是专门为继承设计的,很多抽象类的存在意义就是为了让子类扩展实现,比如Java集合框架里的AbstractCollection,就是为了简化集合类的实现而设计的抽象基类。
内容的提问来源于stack exchange,提问作者Dhia Ben Aicha
相关产品推荐
相关产品推荐

