【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day10

2023-02-24 13:30:51 浏览数 (1)

String、StringBuffer、StringBuilder的区别

1. String是不可变的,如果尝试去修改,会新⽣成⼀个字符串对象,StringBuffer和StringBuilder是

可变的

2. StringBuffer是线程安全的,StringBuilder是线程不安全的,所以在单线程环境下StringBuilder效

率会更⾼

重载和重写的区别

1. 重载: 发⽣在同⼀个类中,⽅法名必须相同,参数类型不同、个数不同、顺序不同,⽅法返回

值和访问修饰符可以不同,发⽣在编译时。

2. 重写: 发⽣在⽗⼦类中,⽅法名、参数列表必须相同,返回值范围⼩于等于⽗类,抛出的异常

范围⼩于等于⽗类,访问修饰符范围⼤于等于⽗类;如果⽗类⽅法访问修饰符为private则⼦类就不

能重写该⽅法。

代码语言:javascript复制
public int add(int a,String b)
public String add(int a,String b)
//编译报错

接⼝和抽象类的区别

  • 抽象类可以存在普通成员函数,⽽接⼝中只能存在public abstract ⽅法。
  • 抽象类中的成员变量可以是各种类型的,⽽接⼝中的成员变量只能是public static final类型的。
  • 抽象类只能继承⼀个,接⼝可以实现多个。

接⼝的设计⽬的,是对类的⾏为进⾏约束(更准确的说

是⼀种“有”约束,因为接⼝不能规定类不可以有什么⾏为),也就是提供⼀种机制,可以强制要求

不同的类具有相同的⾏为。它只约束了⾏为的有⽆,但不对如何实现⾏为进⾏限制。

⽽抽象类的设计⽬的,是代码复⽤。当不同的类具有某些相同的⾏为(记为⾏为集合A),且其中⼀

部分⾏为的实现⽅式⼀致时(A的⾮真⼦集,记为B),可以让这些类都派⽣于⼀个抽象类。在这

个抽象类中实现了B,避免让所有的⼦类来实现B,这就达到了代码复⽤的⽬的。⽽A减B的部分,

留给各个⼦类⾃⼰实现。正是因为A-B在这⾥没有实现,所以抽象类不允许实例化出来(否则当调

⽤到A-B时,⽆法执⾏)。

抽象类是对类本质的抽象,表达的是 is a 的关系,⽐如: BMW is a Car 。抽象类包含并实现⼦类

的通⽤特性,将⼦类存在差异化的特性进⾏抽象,交由⼦类去实现。⽽接⼝是对⾏为的抽象,表达

的是 like a 的关系。⽐如: Bird like a Aircraft (像⻜⾏器⼀样可

以⻜),但其本质上 is a Bird 。接⼝的核⼼是定义⾏为,即实现类可以做什么,⾄于实现类主体

是谁、是如何实现的,接⼝并不关⼼。

使⽤场景:当你关注⼀个事物的本质的时候,⽤抽象类;当你关注⼀个操作的时候,⽤接⼝。

抽象类的功能要远超过接⼝,但是,定义抽象类的代价⾼。因为⾼级语⾔来说(从实际设计上来说

也是)每个类只能继承⼀个类。在这个类中,你必须继承或编写出其所有⼦类的所有共性。虽然接

⼝在功能上会弱化许多,但是它只是针对⼀个动作的描述。⽽且你可以在⼀个类中同时实现多个接

⼝。在设计阶段会降低难度

0 人点赞