1,简述面向对象的思想
抽象:通过特定的示例抽取出共同的特征后形成概念的过程,其强调只要特征和忽略次要特征。
封装:把对象属性和方法结合成一个独立的整体,隐藏实现细节并提供对外的访问接口。
继承:从已知的一个类派生出新的一个类(子类),子类继承父类所有的飞私有化属性和方法,并能 根据自己的实际情况进行扩展出新的方法。
多态:多个不同的对象对同一消息做出的响应,同一消息根据不同的对象而采用不同的行为方法。
2,多态的原理
多态就是允许基类的指针或引用指向派生类的对象,且再具体访问时实现方法的动态绑定。原理就是java的后期绑定。
3 ,简述String ,StringBuffer,StringBuider的区别
String 是final的,内部用一个final类型的char数组存储数据,其拼接效率比较低,实际上是通过建立一个StringBuffer,让后台调用append(),最后再将StringBuffer.toString(); 每次操作String都会重新创建新的对象来保存新的值,原来的对象就没用了,就要被垃圾回收,这样比较影响性能。
StringBuffer也是final,线程安全的,采用一个char数组来保存需要的append的字符串,char数组有一个初始大小,当append的字符串长度超过char数组容量时,对char进行动态扩容,即重新申请一个更大的内存空间,然后将当前的char数组拷贝到新的位置,因为重新分配内存并拷贝的开销比较大,所以每此申请内存空间都是采用申请大于当前需要的内存空间的方式。
StringBuider 字符串长度可变 ,线程非安全,适合单线程操作。
我们可以看到,初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费。为了应对经常性的字符串相关的操作,就需要使用Java提供的其他两个操作字符串的类——StringBuffer类和StringBuild类来对此种变化字符串进行处理。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。