大家好,我是陶然同学,软件工程大三明年实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题🙃🙃。
不敢苟同,相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍热门面试题及恰如其分的解答。当然,我不会太深入,因为我怕记不住!!
因此,不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法,希望这100天能够让我们有质的飞越,一起冲进大厂!!,让我们一起学(juan)起来!!!
String、StringBuffer、StringBuilder的区别
1. String是不可变的,如果尝试去修改,会新⽣成⼀个字符串对象,StringBuffer和StringBuilder是可变的
2. StringBuffer是线程安全的,StringBuilder是线程不安全的,所以在单线程环境下StringBuilder效率会更⾼
重载和重写的区别
1. 重载: 发⽣在同⼀个类中,⽅法名必须相同,参数类型不同、个数不同、顺序不同,⽅法返回值和访问修饰符可以不同,发⽣在编译时。
2. 重写: 发⽣在⽗⼦类中,⽅法名、参数列表必须相同,返回值范围⼩于等于⽗类,抛出的异常范围⼩于等于⽗类,访问修饰符范围⼤于等于⽗类;如果⽗类⽅法访问修饰符为private则⼦类就不能重写该⽅法。
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 。接⼝的核⼼是定义⾏为,即实现类可以做什么,⾄于实现类主体是谁、是如何实现的,接⼝并不关⼼。
使⽤场景:当你关注⼀个事物的本质的时候,⽤抽象类;当你关注⼀个操作的时候,⽤接⼝。
抽象类的功能要远超过接⼝,但是,定义抽象类的代价⾼。因为⾼级语⾔来说(从实际设计上来说也是)每个类只能继承⼀个类。在这个类中,你必须继承或编写出其所有⼦类的所有共性。虽然接⼝在功能上会弱化许多,但是它只是针对⼀个动作的描述。⽽且你可以在⼀个类中同时实现多个接⼝。在设计阶段会降低难度