ja基础面试题大概有哪些?
一、Ja基础
1、抽象类和接口的区别
<>抽象类>可以提供成员方法的实现细节,而<>接口>只能包含pulic抽象方法。抽象类中的成员变量可以是各种类型,包括非final和非static类型,而接口中的成员变量默认都是pulicstaticfinal类型。抽象类可以包含构造器、静态代码块和静态方法,而接口则不能包含这些结构。一个类只能继承一个抽象类,但是可以实现多个接口。抽象类在访问速度上通常接口要快,因为接口在运行时需要花时间去查找类中具体实现的方法。如果在抽象类中添加新的方法,可以提供默认实现,这样不需要修改现有代码。而在接口中添加新方法,则必须在实现该接口的所有类中添加该方法的实现。接口主要用于定义类的行为,强调解耦合;抽象类则更侧重于代码的复用。
2、final、static、synchronized关键字可以修饰什么,以及修饰后的作用
<>static关键字>
static方法static方法般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对像,既然都没有对像,就谈不上this了。static变量static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static代码块static关键字还有一个较关键的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
<>final关键字>
final变量凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。final方法final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。final类使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。例如Ja中有许多类是final的,譬如String、Integer以及包装类。
<>synchronized关键字>synchronized是Ja中解决并发问题的一种最常用的方法,也是最简单的一种方法。synchronized的作用主要有三个:
确保线程互斥的访问同步代码保证共享变量的修改能够及时可见有效解决重排序问题synchronized方法有效避免了类成员变量的访问冲突synchronized代码块这时锁就是对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁。
总结如下。
<>static关键字>
<>static方法>:静态方法属于类而不属于类的任何特定实例。它们可以在没有创建类的实例的情况下调用。静态方法通常用于执行不依赖于实例变量的作。
japulicclassCalculator{pulicstaticintadd(inta,int){retna+;}}//可以这样调用:Calculator.add(5,3);
<>static变量>:静态变量也称为类变量,它们在类的所有实例之间共享。这意味着如果一个实例修改了静态变量的值,这个新值对于类的所有实例都是可见的。
```japulicclassCounter{pulicstaticintcount=0;
pulicCounter(){
count++;
}
}//每次创建Counter的新实例,count都会增加。```
<>static代码块>:静态代码块在类首次加载到JVM时执行,通常用于初始化静态变量。
japulicclassDataaseDriver{static{//这里可以进行数据库驱动的加载System.out.println("数据库驱动加载中...");}}
<>final关键字>
<>final变量>:final变量一旦被初始化后,其值就不能被更改。如果是基本数据类型,其值不能变;如果是引用类型,其引用不能变。
japulicclassConstants{pulicstaticfinaldoulePI=3.14159;}//PI的值不能被更改。
<>final方法>:final方法不能被子类覆盖。这通常是为了防止子类改变父类方法的预期行为。
japulicclassVehicle{pulicfinalvoidstartEngine(){System.out.println("发动机启动中...");}}//子类不能覆盖startEngine方法。
<>final类>:final类不能被继承。这通常是为了保持类的不变性,例如String类。
```japulicfinalclassImmutale{privatefinalintvalue;
pulicImmutale(intvalue){
this.value=value;
}
pulicintgetValue(){
retnvalue;
}