一、基础知识
3、JVM、JRE和JDK的区别
JDK:Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。开发工具如:用于编译Java程序的javac命令、用于启动JVM运行Java程序的Java命令、用于生成文档的Javadoc命令以及用于打包的jar命令等等。
JRE:Java运行环境,JVM + Java的核心类库。
JVM:Java虚拟机,提供了字节码文件(.class)的运行环境支持。用于保证Java的跨平台的特性,Java语言是跨平台,JVM不是跨平台的。
4、重载和重写的区别
(1)、override(重写)
a、参数列表必须完全与被重写的方法完全相同
b、返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5及更早版本返回类型要一样,java7及更高版本可以不同)
c、访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected
d、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。(但子类方法可以不抛出异常)
e、存在于父类和子类之间
f、方法被定义为final不能被重写
(2)、overload(重载)
a、参数类型、个数、顺序至少有一个不相同
b、不能重载只有返回值不同的方法名
c、存在于父类和子类、同类中
d、可以抛出不同的异常
(3)、访问修饰符范围
修饰符 | 同类 | 同包 | 非同包的子类 | 非同包的非子类 |
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
default(缺省) | ✔️ | ✔️ | ❌ | ❌ |
private | ✔️ | ❌ | ❌ | ❌ |
5、接口(interface)和抽象类(abstract)的区别
(1)、接口的方法默认是public,没有实现方法。但JKD8之后有默认方法用default修饰,子接口自动继承父接口默认方法。抽象类可以有实现方法。
(2)、接口中的实例变量默认是final类型的,而抽象类中则不一定。
(3)、接口用implements去实现接口,需要实现接口中所有方法。抽象类用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要实现父级抽象类中所有抽象方法,父类中非抽象方法可重写也可不重写。
(4)、接口没有构造器,抽象类可以有构造器(构造器不能用abstract修饰)。
(5)、接口可以多继承,抽象类只能单继承。
(6)、接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象。
6、匿名类
(1)、定义
①、匿名类,就是没有名称的类,其名称由Java编译器给出,一般是形如:外部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一次,当然也就不能有构造器。
②、匿名类就是利用父类的构造函数和自身类体构造成一个类。
③、匿名类可以继承父类的方法,也可以重写父类的方法。
④、匿名类可以访问外部类的成员变量和方法,匿名类的类体不可以声明称static成员变量和static方法。
⑤、匿名类由于是一个new的结果,所以其实可以赋值给一个父类对象。因此可以分为两种匿名类,成员匿名类和局部匿名类(作为函数参数)。
(2)、实现
①、与子类有关的匿名类:
格式:new 父类(){子类内容};
//父类
public class Test{
void run(){
System.out.println("父类方法");
}
}
//匿名类
Test test = new Test(){
void run(){
System.out.println("子类方法");
}
};
②、与接口有关的匿名类:
//接口
public interface Test{
void run();
}
//匿名类
public class TestA{
@Override
public void run(Test test){
test.run();
}
}
③、匿名对象:new Test();
new Test().run();
7、==与equals的区别
(1)、==比较的是值是否相等,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址是否相同。
(2)、equals方法不能作用于基本数据类型的变量,只能用于类变量。(对于基本数据类型要用其包装类)。如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
注:Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。
8、值传递和引用传递的区别
(1)、值传递:只要是基本类型传递都是值传递
例:
int类型
int int1 = 10;
int int2 = int1;
//int2输出为10
int2 = 20;
//int2输出为20
String类型
String str1 = "A";
String str2 = str1;等价为String str2 = new String(str1);
//str2输出为A
str2 = "B";
//str2输出为B
(2)、引用传递:针对于基本类型进行封装,对封装进行传递,是引用传递。引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本,并不是原对象本身。
例:
类传递
TestDemo testDemo1 = new TestDemo();
testDemo1.setTxtProtected("potected");
TestDemo testDemo2 = testDemo1;//类传递
//testDemo1和testDemo2类中的txtProtected属性值为potected
testDemo2.setTxtProtected("testDemo2");
//testDemo1和testDemo2类中的txtProtected属性值为testDemo2
(3)、引用数据类型
引用类型包括类(class)、接口(interface)和数组。常见的String是引用类型中的类,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。
9、布尔运算符
&和|称为布尔运算符,&&和||称为条件布尔运算符。
(1)、&和 | :&是逻辑与(and),整个表达式都运算,运算符两边的表达式均为true时,整个结果才为true。 | 是两边都运算为false时,整个结果才为false。
(2)、&&和 || :&&是短路与,如果第一个表达式为false时,第二个表达式就不会计算了。|| 是如果第一个操作数是true,||运算符就返回true,第二个表达式就不会计算了。
条件布尔运算符性能比较好。它检查第一个操作数的值,再根据该操作数的值进行操作,可能根本就不处理第二个操作数。
10、String、StringBuilder、StringBuffer的区别
12、关系运算符
13、序列化和反序列化