Java基础、类和对象面试题总结

Java基础、类和对象面试题总结:
**1.问:**byte a = 127;
a+=5;
System.out.println(a); 请问输出结果是什么?
答:-124,byte取值范围是-128—127,当a+=1时就已经超过了byte的临界值,此时输出的为-128;a+=2时,输出-127,以此类推a+=5输出-124
2.问:不同类型的变量在相互赋值时,什么情况下需要进行强制类型转换?
**答:**范围大的->范围小、长->短、子类—>父类
byte->short->int->long->float->double (范围从小到大)
小范围可以自动转换小范围,而小范围要转大范围必须强转才行
**3.问:**java 的 Integer 和 int 有什么区别?
**答:**int 是 java 内置基本数据类型之一,java 为每个基本类型都提供了一个封装类,Integer 就是 int 的封装类(也叫包装类型);int 变量的默认值为 0,Integer 变量的默认值为 null,所以 Integer 可以区分出未赋值和值为 0 的区别;Integer 类内部提供了一些关于整数操作的方法,例如上文用到的表示整数的最大值和最小值。
Java 为每个原始类型提供了包装类型:
原始类型: boolean,char,byte,short,int,long,float,double(8种基本数据类型)
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
**4.问:**String和StringBuilder的区别?StringBuffer和StringBuilder的区别是什么?
**答:**1)三者之间String的速度最慢,StringBuilder>StringBuffer>String;
2)在java中提供三个类String、StringBuilder、StringBuffer来表示和操作字符串,字符串就是多个字符的集合。
3)String是内容不可变的字符串,是一个字符串常量,Stirng底层使用了一个不可变的字符数组(final char[]),String对象创建之后就不能被改变。
String str = new String(“bbb”); ----private final char value[]
而StringBuilder和StringBuffer是内容可以改变的字符串,StringBuilder和StringBuffer底层使用的是可变数组(没有使用final来修饰)----char value[]
4)StringBuilder 是单线程,是线程不安全的,效率较高,StringBuffer 是多线程,是线程安全的,效率较低
5)最经典就是拼接字符串
1.String进行拼接String c = “a”+”b”;
2.StringBuilder或StringBuffer
StriingBuilder sb = new StringBuilder();sb.append(“a”).append(“b”);
拼接字符串不能使用String进行拼接,要使用StirngBuilder或者StringBudder
**5.问:**java对象的初始化顺序
**答:**父类静态变量(字段)、静态块;子类静态变量(字段)
父类实例变量、实例块、构造方法;子类实例变量、实例块、构造方法
**6.问:**java类的加载过程是什么
**答:**类加载主要是由jvm虚拟机负责的,过程比较复杂,类加载分三步:加载(双亲委派模型)—》连接—》初始化
(1)加载(靠加载器完成,明白加载机制)
Java虚拟机一般使用Java类的流程:编辑.java文件转换成class文件,程序运行之前jvm类加载器会把编译完成的.class二进制文件加载到内存,将它放在运行时数据区的方法区内,然后在堆区创建一个java.lang.class对象,用来封装类在方法去内的数据结构,作为访问的接口,java提供的类加载器绝大多数都继承自classLoader类(根基),他们被用来加载不同来源的字节码文件。
Jdk提供的三种类加载器:
1) BootstrapClassLoader(启动类/引导类/根加载器):主要加载JAVA_HOME/jre/lib里的jar包,该目录下的所有jar包都是运行jvm是所必需的jar包。如果一个类的加载器是BootstrapClassLoader,那么该类的getClassLoader()方法返回null。
2) ExtClassLoader(扩展类加载器):主要加载java核心扩展类,即JAVA_HOME/jre/ext目录下的jar文件。
3) AppClassLoader(应用类加载器):主要加载开发者在应用编程中编写的类,即CLASSPATH路径下的jar文件。
三者的关系:
Java基础、类和对象面试题总结_第1张图片
案例:将用户自定义的people类所在的源文件一jar包的形式放到ExtClassLoader加载类路径下,调用people类的getClassLoader()方法,返回的是ExtClassLoader还是AppClassLoader类加载器,还是两个都返回?
答:一个普通的people类,返回AppClassLoader,放在ExtClassLoader 类加载路径下进行加载,返回的是ExtClassLoader,原因如下:
Java基础、类和对象面试题总结_第2张图片
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190716143302605.png
Java基础、类和对象面试题总结_第3张图片
(2)连接(验证、准备、解析)
连接阶段负责把类的二进制数据合并到JRE中,三个阶段:
1) 验证(文件格式验证、元数据、字节码、符号引用):确保(加载的类信息)Class文件的字节流中包含的信息符合当前虚拟机的要求,并不会危害虚拟机自身的安全。
2) 准备:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。内存分配的只包括被Static修饰的变量,不包括实例变量,实例变量在对象实例化时随着对象一期分配在java堆中。(也就是为静态文件分配内存,并设置初始值)。通常情况下初始值为0值。
3) 解析:是虚拟机将常量池中的符号引用替换为直接引用的过程(将类的二进制数据中的符号引用替换成直接引用)。
(3)初始化
初始化是类加载过程中的最后一步,在准备阶段变量已经赋过一次系统要求的初始值,在初始化阶段,则是根据程序员通过程序制定的主观计划初始化变量和其他资源。
**7.问:**面向对象的三大特征思想
答:1)封装:把描述对象属性的变量及实现对象功能的方法结合起来,定义一个程序单位,并保证外界不能任意更改内部属性,不能任意调动内部的方法接口。
2)继承:具有相同属性和行为的类(单继承),通过关键字extends完成,子类获得父类的成员属性和成员方法,没有指定的父类,默认Object类,继承大大增强了代码的可复用性。
3)多态:同一方法名,根据被调对象的不同,实现不同的行为。
静多态:方法重载,方法名相同,作用域相同(发生在一个类中),参数列表不同(参数个数、参数类型、参数的顺序)
动多态:方法重写(返回值类型相同,方法名相同,参数列表相同,发生在继承类中),继承,向上造型(父类引用引用派生类对象)

你可能感兴趣的:(Java基础、类和对象面试题总结)