1. 面向对象的特征:
继承:被继承的类称为父类,继承的类称为子类。子类拥有父类的属性和方法,当然,构造方法除外。
封装:方法就是一种封装,类也是一种封装,封装之后,外部想进行访问,必须通过一定规则。
多态:不同子类对同一消息做出的不同反应。多态的三个前提:继承+重写+父类引用指向子类对象。
2. 访问修饰符public,private,protected,以及不写(默认)时的区别?
private:本类可以访问。
default:本类+本包下的类可以访问。
protected:本类+本包下的类+子类都可以访问。
public:本类+本包下的类+子类+外部包都可以访问。
3. String 不是基本数据类型,是引用类型。基本数据类型有八种:byte+short+int+long+float+double+char+boolean
分别占1 2 4 8 4 8 2 1个字节。
4. 在定义float型数时,后面要加'F'或者'f',定义浮点型数据时默认是double类型的。
5. &:逻辑与,左边即使为假后,右边还会参与运算。
&&:短路与,左边为假后,直接短路掉,右边不再参与运算。
6. java内存中栈 堆 方法区的区别:栈是方法执行的内存模型,每个方法执行都会创建一个栈帧。通过new关键字和构造方法创 建的对象都会放到堆中。方法区:用于存常量,字符串,类代码信息等一些永久不变的西。常量池是方法区的一部分。栈是线 程之间不共享的。堆和方法区是线程之间共享的内存区域。
7. Java中switch中可以放置:byte+short+char+int(java5以前)+枚举(java5以后)+String(java7之后)。
8. 用最有效率的方法计算2乘以8: 2 << 3,左移3位相当于乘以2的3次方。右移3位相当于除以2的3次方。
9. 数组中有length属性,String中有length()方法。
10. break:跳出当前的循环体。 continue:跳出当前的这次循环,进行下次循环。
11. ==:即可以比较基本数据类型,也可以比较引用数据类型。比较基本数据类型时,比较的是数值。比较引用数据类型时,除 了比较数值外,还会比较地址值,两者都相等时,才为true。
equals:用于比较引用数据类型,它是Object中的方法,没有进行重写时,比较数值+引用地址,两者都相等时,才是true.
如果进行重写,可以只比较数值,不比较引用地址,比如String类就重写了equals方法,常用于比较字符串是否相同。
12. String类不能被继承,因为String类被final修饰。被final修饰的类不能被继承,被final修饰的值不能再被更改。即为常量。
被final修饰的方法不能被重写。
13. String和StringBuilder、StringBuffer的区别?
String是不可变字符序列,因为源码private final char value[];value字符数组被private final修饰。
StringBuilder+StringBuffer是可变字符序列,源码中没有private final修饰。
StringBuffer:会做同步检查,效率低,但安全性高。
StringBuilder:java5才有的类,不会做同步检查,安全性低,但效率高,比较常用。
14. 重载和重写的区别:
重载是存在同一类中,方法名相同,方法参数的个数或者方法参数类型不同则构成重载。
重写是存在子父类之间,子类重写父类中的方法要求方法名和返回类型,方法参数类型相同,只是方法体不同,则构成重 写。
15. 抽象类和接口的区别:
一句话概括:都是一种规范,都不能实例化,可以定义其引用,但接口比抽象类更抽象。
抽象类中含有抽象方法,还可以含有普通方法,接口中只含有抽象方法和常量,方法默认被public static final修饰,如果
一个类实现了接口或继承了抽行类,那么必须重写所有抽象方法
16. 一个类只能有一个父类,即单继承,但可以实现多个接口。一个接口可以继承一个或多个接口。
17. java内存泄露:java应用程序中有些没有用的对象,但垃圾回收器无法进行回收,这就造成内存泄露。
例如hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存
在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。
18. 静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,被所有此类的对象共享。静态变量在内存中有且仅有一个
拷贝;
实例变量必须依存于某一实例,需要先创建对象,然后通过对象才能访问到它。
19. 静态方法只能访问静态成员变量和静态方法,非静态方法的调用要先创建对象。
20. java中实现克隆的两种方式:实现Cloneable接口并重写Object类中的clone()方法。
类实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。