重载和重写的区别:
重载: 发生在同一个类中,两个方法的名称必须相同,参数的类型,个数,顺序都可以不同,访问的修饰符和返回值也可以不同.(发生在同一个类中,只要方法名称相同即可)
**重写:**发生在子父类或者接口跟实现类中,两个方法的名称跟参数列表也是必须相同.子类的返回值跟抛出的异常必须小于父类,访问的权限修饰符必须大于父类,如果父类使用private修饰的,子类就不能继承.(发生在两个类,除了方法的内部逻辑,其他都要相同)
String 和 StringBuffffer.StringBuilder 的区别是什么?String 为什么是不可变的?
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity.append.insert.indexOf 等公共 方法。StringBuffffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对 方法进行加同步锁,所以是非线程安全的。
- 操作少量的数据 = String
- 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
- 多线程操作字符串缓冲区下操作大量数据 = StringBuffffer
final关键字的主要作用:
final关键字主要用在三个地方:变量.方法.类。
- 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
- 当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
- 使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。
在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。
接口和抽象类的区别
参数 | 抽象类 | 接口 |
---|---|---|
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 果你往接口中添加方法,那么你必须改变实现该接口的类。 |
Java4种访问修饰符权限的区别
public
被public修饰的成员变量和方法可以在任何类中都能被访问到。
被public修饰的类,在一个java源文件中只能有一个类被声明为public,而且一旦有一个类为public,那这个java源文件的文件名就必须要和这个被public所修饰的类的类名相同,否则编译不能通过。
protected
被protected修饰的成员会被位于同一package中的所有类访问到,也能被该类的所有子类继承下来。
friendly
默认,缺省的。在成员的前面不写访问修饰符的时候,默认就是友好的。
同一package中的所有类都能访问。
被friendly所修饰的成员只能被该类所在同一个package中的子类所继承下来。
private
私有的。只能在当前类中被访问到。