JAVA基础
八种数据类型
byte、int、short、long、char、bool、float、double
object类中有哪些方法
getClass()、toString()、hashCode()、wait()、notify()、notifyAll()、equals()、finalize()、clone()
String、StringBuffer、StringBulider
- String中final修饰的是char[] value和类,不可改变。存储在常量池中。
- StringBulider中final修饰的是类。继承了AbstractStringBulider类,非线程安全,内部value数组长度可变,初始化长度为16。使用toString方法会重新生成对象,不使用内部的value数组,会重新生成并进行数组copy。
- StringBuffer是在StringBulider的基础上加了sychronized关键字。使用toString方法会共享StringBuffer对象中的toStringCache属性(char[]),每次StringBuffer对象修改会将该值设为null
接口和抽象类的关系
相同点:
- 接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。
- 都不能被实例化
- 接口的实现类和抽象类的子类必须实现了其中的方法才能被实例化。
不同点: - 接口 接口是公开的,不能有私有的方法和变量。接口中所有的方法都没有方法体。1.8之后可以有default方法
- 抽象类是可以拥有私有方法和私有变量,被声明为抽象的方法不能有方法体。子类实现方法必须含有相同或更低的访问级别。子类必须实现所有的抽象方法。
- 接口成员变量默认为
public static final
必须赋初值,不能修改,其他所有成员方法是public、abstract的。抽象类中成员变量默认default,可在子类中冲洗性能定义,可以重新赋值。抽象方法不可以被private、static、synchronized、native等修饰。 - 接口可以实现多个,抽象类只能继承一个,接口强调特定功能的实现,抽象类强调所属关系。
继承和组合的区别
继承与组合都是面向对象中代码复用的方式。
- 继承是面向对象三大基本特征之一,继承就是子类继承父类的特征和行为,使子类对象具有父类的行为,子类强调 --is–a 关系。父类的内部细节对子类可见,其代码属于白盒式的复用。继承关系在编码时已经确定
- 组合是对现有对象进行拼装组合产生新的具有更复杂功能的对象。组合最主要地体现的是一种整体和部分的思想。组合强调的是 —hava—a。组合中,对象之间的内部细节不可见,其代码属于黑盒式复用。组合关系一般在运行时才确定。
除非两者的关系是–is–a或者包含对象过多, 否则建议使用组合
重载和重写的区别
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同,参数顺序不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。
-
重载是多态的表现,是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。
重载的规则:①必须具有不同的参数列表。(参数类型不同、参数个数不同甚至是参数顺序不同)
②可以有不同的访问修饰符。
③可以抛出不同的异常。
-
重写是派生类中重新对基类中的函数重新实现。子类函数的访问修饰权限不能少于父类的。
深拷贝和浅拷贝的区别
- 深拷贝::对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递,新的引用依然指向旧对象