一、JAVA程序是如何执行的
- 先把java代码编译成字节码文件,也就是.class文件。
- 然后把class文件放置到java虚拟机(JVM)。
- Java虚拟机使用类加载器(ClassLoader)加载class文件。
- 类加完成之后进行字节码校验,字节码校验通过之后JVM解析器会把字节码翻译成机器码交由操作系统执行。
二、JAVA有哪些基本数据类型
| 数据类型 | 默认值 | 取值范围 | 包装类 | 内存空间(8位=1字节) |
|---|---|---|---|---|
| byte | 0 | -128 ~ 127 | Byte | 8位 |
| short | 0 | -32768 ~ 32767 | Short | 16位 |
| int | 0 | -2147483648 ~ 2147483647 | Integer | 32位 |
| long | 0L | -9,223,372,036,854,775,808~ 9,223,372,036,854,775,807 | Long | 64位 |
| float | 0.0f | 1.4E-45~3.4028235E38 | Float | 32位 |
| double | 0.0d | 4.9E-324~1.7976931348623157E308 | Double | 64位 |
| char | 0 | Character | 16位 | |
| boolean | false | Boolean | 64位 |
三、final在java中的作用
- 修饰类:表示该类不能被继承。
- 修饰方法:表示该方法不能被重写。
- 修饰变量:表示变量只能一次赋值后,值不能被修改。
- 修饰引用:表示引用不可变。
四、static有哪些用法
- 修饰类和方法,被static所修饰的方法和变量都属于类的静态资源,类实例所共享。
- static用于修饰静态块,多用于初始化操作。
public calss PreCache{
static{
//执行相关操作
}
}
- 静态导包,这样可以直接使用类中的方法。
import static java.lang.Math.*;
public class Test{
public static void main(String[] args){
//System.out.println(Math.sin(20));传统做法
System.out.println(sin(20));
}
}
五、Exception与Error包结构
Error和Exception的父类同为Throwable。 被检查异常:Exception类本身,以及Exception的子类中除了运行时异常之外的其他子类都属于被检查异常,编译器会检查它,要么throws声明抛出,要么try-catch进行捕获处理,否则不能编译通过。 常见的检查异常:
- IOException IO异常
- FileNotFoundException 文件不存在
- SQLException SQL异常
运行时异常:RuntimeException及其子类都被称为运行时异常,编译器不会检查它,当程序中可能出现这类异常时,如果没有throws声明抛出它,或者也没有try-catch捕获它,还是会通过编译。 常见的运行时异常:
- ClassCastException 类型转换异常
- IndexOutofBoundsException 数组越界
- NullPointerException 空指针
- ArrayStoreException 数组存储异常,操作数组类型不一致
- BufferOverflowException 缓冲区溢出异常
错误:Error类及其子类,和运行时异常一样,编译器不会对错误进行检查,当资源不足、约束失败、或者其他程序无法运行的条件发生时,就会产生错误,程序本身无法修复这些错误的。例如:OutOfMemoryError、ThreadDeath。
六、==和equals的区别
==对于基本类型来说是值比较,对于引用类型来说比较的是引用。 equals默认情况下是引用比较,只是很多类重新了equals方法,比如String,Integer等把它变成了值比较,所以一般情况下equals比较的是值是否相等。
七、hashcode()的作用
java中集合有两类,list、set。 hashCode方法可以这样理解,当集合要添加新的元素时,先调用这个元素的hashCode方法,就能定位到它应该放置的物理位置,如果这个位置上没有元素,它就可以直接存储在这个位置上,如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不需要再保存了,如果不同就散列其他的地址,这样一来实际调用equals方法的次数就大大降低了。 如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()总是为true的。 如果o1.hashCode() == o2.hashCode(),并不意味着o1.equals(o2)会为true。
八、泛型的种类
无边界通配符
List<?> list;
上边界通配符:通用的类型必须是Number及其子类。
List<? extends Number> list;
下边界通配符:通用类型必须是Integer的父类。
List<? super Integer> list;
==泛型必须先声明再使用 通过 <> 来声明 例如 声明泛型T ==
九、面向对象的特征
- 封装:把描述一个对象的属性和行为的代码封装在一个模块中,也就是类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性;
- 抽象:把现实生活中的对象抽象为类,分为过程抽象(类的方法),数据抽象(类的属性);
- 继承:子类继承父类的特征和行为;
- 多态:指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才能确定,方法重写和重载体现了多态性。
十、重写和重载的区别
重写:
- 访问修饰符的限制一定大于被重写方法的访问修饰符;
- 重写方法一定不能抛出新的检查异常或者比被重写方法声明更加宽泛的检查型异常;
- 参数列表必须完全与被重写的方法相同;
- 方法名相同;
- 方法的类型必须完全小于等于被重写方法的返回类型;
- 父类与子类直接存在
重载:
- 方法名一致,参数列表中参数的顺序、类型、个数不同;
- 可以有不同的返回类型;
- 可以有不同的访问修饰符;
- 可以抛出不同的异常;
- 存在同一个类中
总结
人人都有一个进大厂的梦,希望以上的内容能够对你我这样的人有所帮助。