1、JAVA特点
既可以编译又可以解释,JAVA编写一次出处运行,面向对象(继承,封装多态)JAVA有自己的垃圾回收机制,自动管理内存和回收不再使用的对象。支持多线程
2、JVM、JDK、JRE三者之间关系
JVM:java的虚拟机,将java的字节码编译成机器码,并执行程序。JVM提供了内存管理、垃圾回收、安全性等功能。
JDK:是java的开发工具包,是java程序所需的工具集合。包含了JVM、编译器、调试器,以及一系列的类库。JDK提供了开发、编译、调试和运行JAVA程序运行所需要的全部工具和环境 。
JRE:java运行所需要的最小环境。
3、JAVA解释和编译都有的原因
首先经过编译之后生成字节码文件,然后进入JVM中就有两个步骤既能编译又能解释。
编译:首先java的源代码会将其编译成字节码,JIT会将其保存起来
解释:JVM中一个方法调用计数器,当累计计数大于一定值的时候,就会使用JIT进行编译成机器码文件,否则就是用解释器进行解释执行,然后字节码也是经过解释器进行解释运行的。
4、JAVA和python的区别
Java是已经编译的语言,java的编译器将器编译成字节码,然后让虚拟机进行解释。
Python就是一种解释的语言,翻译的时候会在执行程序的同时进行翻译。
在JAVA中,参数传递只有值传递一种方式,不支持引用传递,java中所有参数都是值传递。
5、JAVA的数据类型
基本数据类型和引用数据类型。
基本数据类型:分为三类
数值型:整数类型(byte、short(2)、int(4字节,32位)、long(8))和浮点类型(float,double科学计数法)
字符型:char
布尔型:boolean 通常占1个字节
6、自动转换和强制转换
当一个范围较小的数值或变量转换为一个范围较大的时候会进行自动转换,反之会执行强制转换。
7、自动拆箱与装箱
装箱:将基本数据类型转换为包装类型(引用数据类型)
拆箱:将包装类型拆解为基本数据类型
8、JAVA面向对象编程
封装、继承、多态
封装:指将数据和操作数据的方法捆绑在一起,形成一个独立的对象。对象的属性私有化的过程。
继承:子类自动的共享父类的数据结构和方法,能够进行代码复用,通过继承来建立类与类之间的数据方法。
class Person {
protected String name;
protected int age;
public void eat() {
System.out.println("吃饭");
}
}
class Student extends Person {
private String school;
public void study() {
System.out.println("学习");
}
}
多态:执行一段java的代码,运行的时候会根据对象类型不同产生不同的结果。可以提高代码的扩展性和复用。多态的前置条件:
子类继承父类
子类重写父类的方法
父类引用指向子类的对象
9、重载和重写的区别
重载:(发生在同一个类中)一个类有多个名字相同但是参数个数不同为方法的重载
重写:(发生在子类和父类之间)如果子类和父类具有一样的方法(参数相同,返回的类型相同、方法相同,但是方法体不同)称为重写。
10、This关键字的作用
This本身是一个对象,代表的是对象的本身,可以理解为直线对象本身的一个指针。This的用法有三种:
普通的直接引用,this相当于是指向当前对象本身。
形参与成员变量名字重命名,用this来区分:
public Person(String name,int age){
this.name=name;
this.age=age;
}
引用本类的构造方法
11、抽象类和接口的区别
实现方式:接口用implements,而抽象类的关键字为extends。一个类可以有多个接口,但是一个类只能继承一个抽象类。
方法方式:接口只有定义,不能用方法实现,抽象类既可以定义也可以实现方法。
访问修饰符:接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
变量: 抽象类可以包含实例变量和静态变量,而接口只能包含常量。
12、继承和抽象区别
继承是一种允许子类继承父类的属性和方法,通过继承,子类可以重用父类的代码。抽象是一种隐藏复杂性和只显示必要部分的技术。在面向对象编程中,抽象可以通过抽象类(abstract)和接口实现。抽象类只能做其他类的父类,不能被实例化
13、Final
Final修饰一个类表示这个类不能被继承String 类、Integer 类和其他包装类都是用 final 修饰的。
Final修饰方法,方法不能被重写
Final修饰变量,变量一旦初始化便不能再次修改。
14、为什么重写equals必须重写hashcode
因为基于哈希的集合类需要基于这一点来正确存储对象和查找对象。具体地说,hashmap通过对象的哈希码将其存储在不同的桶中,当查找对象时,需要用key确定在哪个桶中。如果重写了 equals()方法而没有重写 hashCode()方法,那么被认为相等的对象可能会有不同的哈希码,从而导致无法在 HashMap 中正确处理这些对象。
15、JAVA是值传递还是引用传递
是值传递,不是引用传递。引用对象传递的是地址不是对象的本身
16、深拷贝和浅拷贝的区别
浅拷贝会创建一个新对象,但是对象的属性和原来相同。深拷贝也会创建一个新对象,但会递归复制所有的引用对象,确保新对象和原对象独立
17、JAVA创建对象
New 通过调用类的构造方法来创建对象。
Person person = new Person();
反射机制 反射机制允许在运行时创建对象,并且可以访问类的私有成员,在框架和工具类中比较常见。
Class clazz = Class.forName("Person");
Person person = (Person) clazz.newInstance();
Clone拷贝创建
Person person = new Person();
Person person2 = (Person) person.clone();
序列化机制创建
18、String
string是java的一个类,属于引用数据类型,使用final修饰,是不可变类(一旦string对象被创建,存储的文本内容就不能被改变),无法被继承。
19、String和stringbuilder、stringbuffer的区别
String、StringBuilder和StringBuffer在 Java 中都是用于处理字符串的,它们之间的区别是,String 是不可变的,平常开发用得最多,当遇到大量字符串连接时,就用 StringBuilder,它不会生成很多新的对象,StringBuffer 和 StringBuilder 类似,但每个方法上都加了 synchronized 关键字,所以是线程安全的。
20、Integer
Integer a = 127;
Integer b = 127;
a和b是相等的。这是因为 Java 在自动装箱过程中,会使用Integer.valueOf()方法来创建Integer对象。
Integer.valueOf()方法会针对数值在-128 到 127 之间的Integer对象使用缓存。因此,a和b实际上引用了常量池中相同的Integer对象。
21、Java异常处理体系
Try-catch-finally语句和throw关键字实现。
Throw是java语言中所有错误和异常的积累,有两个主要的子类:error和exception,这两个类分别代表了java异常处理体系中的两个分支。
Error代表严重的错误,这类错误通常是程序无法处理的。比如,OutOfMemoryError 表示内存不足。
Exception 类代表程序可以处理的异常。它分为两大类:编译时异常(Checked Exception)和运行时异常(Runtime Exception)。
异常处理的方式:抛出异常:throw和throws,补获异常 try catch。
21、Java 中 IO 流分为几种
数据流的方向(输入或输出)、处理的数据单位(字节或字符)、流的功能以及流是否支持随机访问等。
22、BIO、NIO 和 AIO
同步式阻塞:线程在执行 I/O 操作时被阻塞,无法处理其他任务,适用于连接数较少的场景
同步非阻塞模式:线程在等待 I/O 时可执行其他任务,通过 Selector 监控多个 Channel 上的事件,适用于连接数多但连接时间短的场景。
异步IO:使用异步 I/O 模型,线程发起 I/O 请求后立即返回,当 I/O 操作完成时通过回调函数通知线程,适用于连接数多且连接时间长的场景。
同步式阻塞相当于餐馆服务员只服务一桌,从点菜到客人走,而同步非阻塞相当于这个服务员负责一个区域的人,不同的桌子可以随时找他,而异步阻塞是客人点完菜之后服务员该干啥干啥去。
23、反射、应用、原理
反射允许JAVA在运行时检查和操作类的方法和字段。通过反射,可以动态地获取类的字段、方法、构造方法。
反射功能主要通过 java.lang.Class 类及 java.lang.reflect 包中的类如 Method, Field, Constructor 等来实现。
有些信息在编译的时候无法确定,但是在运行时又想要获取类的信息、创建类的方法和实例,这时候就要用到反射。
应用场景:spring框架利用反射动态加载和管理Bean;JAVA的动态代理机制使用反射来创建代理的类。JUnit 和 TestNG 等测试框架使用反射机制来发现和执行测试方法。

1314

被折叠的 条评论
为什么被折叠?



