java基础面试题(一)
1.java中的数据类型,各占多少个字节?
2.面向对象的特性
1-封装:简单来说,封装就是把数据和操作数据的方法绑定起来,如果需要访问,可以使用已定义的接口进行访问
2-继承:从已有的类得到继承信息创建新的类的过程。提供继承信息的类称为父类(也叫超类,基类);得到继承信息的类称为子类(也叫派生类)
3-多态:允许不同的子类对同一消息做出不同的响应,也就是父类的引用指向子类的对象。而多态性又分为编译时多态和运行时多态。方法重载实现的是编译时多态(前绑定),方法重写实现的是运行时多态(后绑定)。实现多态的两件事:第一就是方法的重写(子类继承父类并重写父类中已有的和抽象方法);第二就是对象造型(父类的引用指向子类的对象)
4-抽象:将一类对象的共同特征总结出来构造类的过程。包括数据抽象和行为抽象。抽象只关注对象有哪些行为和属性,对于行为的细节并不关注
***注意:对象的特性默认情况下有3种,封装,继承,多态。如果面试官说了四种,那就加上抽象
3.访问权限修饰符public,protected,private,default(默认)的区别即访问范围
4.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
答:第一个是错的,因为1是int类型的,而s1+1的运算结果也是int类型的,需要强转(也叫下转化)才能赋值给short类型,即short s1=(short)s1+1;第二个是正确的,s1+=1相当于s1=(short)(s1+1),其中有隐含的强制转换
5.new一个对象的过程和clone一个对象的过程有什么区别?
答:new对象和clone对象的第一步是相同的,都是为了分配内存,而new是根据后面的类型进行内存的分配的,分配完内存之后才调用构造方法,填充对象中的各个域。构造方法返回后一个对象就创建成功了。同时可以将对象的地址发布到外部,在外部就可以用这个地址操作这个对象了。对于clone而言,它的分配内存是根据原对象的内存进行分配的,也就是原对象有多大内存,它就得到多大的内存,然后使用原对象中各个域填充新对象各个域,完成后clone方法返回,同样可以将这个新对象地址发布到外部,可以从外部对其进行操作了。
6.clone中的深克隆和浅克隆的区别
答:浅克隆只复制基本的数据类型,对于引用类型,只复制引用类型的地址,而引用的对象并没有复制,在新对象中修改引用类型的数据会影响原对象中的引用。
深克隆不仅复制对象本身,而且也复制它的引用指向的所有对象
7.&&和&的区别
答:&是逻辑与和按位与运算
&&是短路与运算
相同点:两者都要求 运算符两边的boolean值都是true,整个表达式的值才是true
不同点:如果&&左边的表达式是false,那么右边的表达式会直接短路,不会进行计算。&的按位与是进行二进制按位与的,参与运算的两个二进制数进行按位与,只有对应的两个二进制都为1时,结果才为1,否则为0。如:9&5
1001&0101---->0001,即9&5为1。
8. 内存中的栈(stack)堆(heap)方法区(method area)的用法
答:我们通常定义一个基本数据类型的变量,对象的引用,还有就是函数调用现场保存都使用的是JVM的栈空间,而new关键字和通过构造器创建的对象都放在堆空间。堆是垃圾收集器管理的主要区域,而现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代。堆和方法区都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息,常亮,静态变量。常量池是方法区的一部分。栈空间操作起来快但是栈很小,所以平常都存在堆空间里,栈和堆的大小都可以通过JVM启动 参数进行调整。栈空间用光了会引发stackoverflowerror,而堆和常量池不足会引发outofmemmoryerror
java6开始,由于JIT技术的发展和“逃逸分析”技术的不断成熟、栈上分配等优化技术使得对象一定分配在堆上这件事变的不在那么绝对了
运行时常量池相当于Class文件常量池具有动态性,java语言并不一定要求常亮只有在编译期间才能产生,运行期间也可以将新的常量放到池中
9.java中如何跳出当前的多重嵌套循环?
答:在最外层加个标签, 然后用break 标签可以跳出多重循环了
10.String是否可以被继承?
答:String类是final类,不可以被继承的
11.数组有没有length()方法?string有没有length()方法?
答:数组没有length()方法,它有length属性,string有length()方法。在JavaScript中,获得字符串长度是根据length属性得到的