android面试(1)-Java基础

最近需要面临找工作的压力,所以在寒假的时候恶补了一下关于android方面的知识,这是一个系列的博客,希望自己可以坚持更新下去。

今天找了一些Java基础的面试题,我在里面挑选了一些我还有些模糊的题,在此处记录一下:

1.面向对象的特征:

(1)抽象:将一类对象的共同特征总结出来构造类的过程。

(2)继承:从已有类得到继承信息,创建新类的过程。

(3)封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。

(4)多态:允许不同子类型的对象对同一消息做出不同的响应。

2.float f=3.4是否正确?

这是一个比较经典的问题了,答案相信大家都已经知道了,不正确,当然的解释就是3.4是双精度数,也就是double型,将double转换为float需要强转,也就是float f=(float)3.4;当时我看到解释后还是很懵逼,我就想知道,为啥3.4就是double型呢?后来我才明白,java对于一个小数的初始默认类型就是double型,所以一切都明白了;

3.A. short s1=1;s1=s1+1;与B. short s1=1;s1+=1;的区别

这一题只要弄清楚两点,第一就是,1是int型;第二就是,s1+=1相当于s1=(short)(s1+1);这样就知道,A式是错误的,s1+1是int型的,赋值给s1需要强转;B式相应就是正确的了;

4.Java中的内存管理机制:

Java中把内存大致分为三个部分:

(1)方法区:也叫静态存储区,在这里存储的是直接书写的常量,静态数据,全局变量,在这里的数据在整个程序运行时一直都会存在。

(2)栈区:方法体内的局部变量,基本数据类型的变量,对象的引用等;

(3)堆区:也叫动态内存分配,new 和 构造器创建的对象保存在这里;

举个例子:  String str=new String(“hello”);

str这个引用存储在栈上,new出来的字符串对象存储在堆上,hello这个字符串存储在方法区内;

5.一些容易被忽略的小点:

(1)Math.round(11.5)=12; Math.round(-11.5)=-11;  向大值取整;

(2)如果两个对象 x,y满足x.equals(y)=true;那么他们的哈希码也应该相同;

(3)String是final类,无法被继承;

(4)Java中方法调用仅支持值传递;

6.String ,StringBuilder和StringBuffer的区别:

(1)String为只读字符串,String引用的字符串内容是不能改变的,StringBuffer和StringBuilder的值可以直接修改;

(2)StringBulider与StringBuffer的方法完全一样,但是StringBulider的所有方法没有被Synchronized修饰,所以是单线程,是线程不安全的,但是其效率最高;

(3)String赋予新值会重新开辟内存地址,而StringBuffer和StringBuilder则采用append和insert等方法来改变字符串的值,是在原有对象的内存上进行操作,所以大量字符串拼接时采用StringBuffer或StringBuilder,少量可采用String的“+”;

(4)这里还有一个比较偏的点:请说出下面程序的输出:

1

2

3

4

5

6

7

8

9

10

11

class StringEqualTest {

 

    public static void main(String[] args) {

        String s1 = "Programming";

        String s2 = new String("Programming");

        String s3 = "Program" + "ming";

        System.out.println(s1 == s2);

        System.out.println(s1 == s3);

        System.out.println(s1 == s1.intern());

    }

}

正确答案是:false, true ,true;

第一个很好理解,s1和s2的引用不一样,当然是false

第二个我也很纳闷为什么会是true,原来啊,String的+被Java进行了特殊处理,在运算过程中会使用StringBuilder或者StringBuffer代替求和,而这两个在进行字符串的运算时,不会改变其内存地址,内存中已经存在了Programming这个字符串,那么就不会重新开辟内存地址,所以是true;

第三个要知道intern方法的使用,String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。

7.重载(OverLoad)和重写(Override)的区别:

这个大部分人应该都清楚,这里我总结一下:

(1)重载实现的是编译时的多态,重写实现的运行时的多态,所谓的编译时的多态就是在编译时就能确定执行的是哪个多态方法,否则就是运行时的多态。

(2)重载发生在一个类中,同名方法具有不同的参数列表(参数类型不同,参数个数不同),重写发生在子类与父类中,子类被重写的方法与父类被重写的方法具有相同的返回类型,比父类要更好访问,不能比父类有更多的异常

这里有一个经典的面试题,为什么函数重载不能根据返回类型区分?

答案:因为函数调用时不会指定类型信息,编译器不知道你到底要调用那个方法。

8.描述一下JVM加载class文件的原理机制:

这个问题设计的东西比较多,在回答这个问题前,我们要知道一些知识点:

(1)Java的类加载器:

A.BootStrop:根加载器,负责加载JVM基础核心类库;

B.Extension:扩展类加载器,java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;

C.System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

(2)由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。

A.加载:把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。

B.连接:经过加载后的Class对象还不可用,进入连接阶段,此阶段又分为三个步骤:

    a.验证:检查二进制字节码是否正确合格;

    b.准备:给类的类变量分配内存并初始化;

    c.解析:将常量池的符号引用转换为直接引用;

C.初始化:最后一步对类进行初始化,遵循“先父后子”,“先静态后普通”的原则,依次执行初始化语句。

9.如何实现对象的克隆?

(1)实现cloneable接口并重写clone()方法;(浅克隆,只能复制值类型的成员变量,引用类型的无法复制)

class Student implements Cloneable{  
    private int number;  
 
    public int getNumber() {  
        return number;  
    }  
 
    public void setNumber(int number) {  
        this

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值