我最近复习一下java的面试题,有很多基础的东西被遗忘了,一般来说,知道这些东西,但是要写面试题还是有点困难的。
- 面向对象的特征有哪些方面?
- 抽象:抽象是将一个类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并步关注这些行为的细节是什么。
- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类;得到继承信息的类被称为子类。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
- 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面对对象的本质就是将现实世界描绘成一系列完全自治、封装的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最即拿单的编程接口。
- 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编辑时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以理解为:当A系统访问B系统提供的服务时,B系统有多重提供服务的方式,但一切对A系统来说都是透明的。方法重载实现的是编译时的多态性,而方法重写实现的时运行时的多态性。运行时的多态时面向对象最精髓的东西,要实现多态需要两个事:1方法重写 2 对象构型(用父类型引用引用子类型对象,这样同意的引用调用同意的方法就会跟进子类对象的不同而表现出不同的行为。)
- 访问修饰符public,private,protected,以及不写(默认)时的区别?
修饰符 | 当前类 | 同包 | 子类 | 其它包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | x |
default | √ | √ | x | x |
private | √ | x | x | x |
3. String是最基本的数据类型吗?
不是。java中的基本数据类型只有8种:byte、short、int、long、double、char、boolean。
4. float f=3.4;是否正确?
不正确,3.4是双精度数,将双精度型赋值给浮点型属于下转型,会造成精度损失,因此需要强制类型转换。
5short s1=1;s1=s1+1;有错吗?short s1=1;s1+=1;有错吗?
对于第一个,由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short型。而第二种相当于s1 =(short)(s1+1)
6. java有没有goto?
goto是java中保留字。
7. int和integer有什么区别?
java为每一个基本数据类型都引入了对应的包装类型。
原始类型:boolean、char、byte、short、int、long、float、double
包装类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double
(如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是true,而f3==f4的结果是false)
8.&和&&的区别?
&运算符有两种用法1按位与2逻辑与。 &&运算符是短路与运算。
9解释内存中的栈、堆和方法区的用法:
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用jvm中栈空间,而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor、Tenured;方法区和堆都是个中线程共享的内存区域,用于存储已经被jvm加载的类信息、常量、静态变量、JIT编辑器编译后的代码等数据;程序中的字面量如直接书写的100、“hello”和常量都是放在常量池中,常量池是方法区的一部分,栈空间操作起来最块但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过jvm的启动参数来进行调整,栈空间用光了会引发StackOverflowError,而堆和常量池空间不租则会引发OutOfMemoryError。
String str=new String(”hello”);
上面的语句中常量str放在栈上,用new创建出来的字符串对象放在堆上,而“hello”这个字面量是放在方法区的。
10. Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
Math.round(11.5)的放回值是12,Math.round(-11.5)的返回值是-11.