final、finally、finalize的区别?
final是一个修饰符,可以修饰变量、方法和类。如果final修饰变量,意味着该变量的值在初始化后不能被改变,如果修饰类,表明该类不能被其他类继承,final类中所有的成员方法都会隐式的定义为final方法,修饰方法时,将方法锁定防止继承类对其更改
finalize方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用finalize没有保证。
finally是一个关键字,与try和catch一起用于异常的处理。finally块一定会被执行,无论在try块中是否有发生异常。(特殊情况:try语句执行之前就已经返回或者异常,或者是直接在try中退出,终止了)
为什么要用static关键字?
通常来说,用new创建类的对象时,数据存储空间才被分配,方法才供外界调用。但有时我们只想为特定域分配单一存储空间,不考虑要创建多少对象或者说根本就不创建任何对象,再就是我们想在没有创建对象的情况下也想调用方法。在这两种情况下,static关键字,满足了我们的需求。
“static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
是否可以在static环境中访问非static变量
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
static静态方法能不能引用非静态资源?
不能,new的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它
static静态方法里面能不能引用静态资源
可以,因为都是类初始化的时候加载的,大家相互都认识
非静态方法里面能不能引用静态资源?
可以,非静态方法就是实例方法,那是new之后产生的,那么属于类的内容它都认识
Java静态变量、代码块和静态方法的执行顺序是什么?
基本上代码块分为三种:Static静态代码块、构造代码块、普通代码块
代码块执行顺序静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块
继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器
Java修饰符有哪些?各自的作用?
主要有两类修饰符:
- 访问控制修饰符:default、public、protected、private
- default:默认,什么也不写,在同一包内可见,不使用任何修饰符,使用对象:类、接口、变量、方法
- private:在同一类内可见,使用对象:变量、方法,注意:不能修饰类(外部类)
- public:对所有类可见,使用对象:类、接口、变量、方法
- protected:对同一包内的类和所有子类可见,使用对象:变量、方法,注意:不能修饰类(外部类)
- 非访问控制修饰符:final、abstract、static、synchronzied、volatile等
- final是一个修饰符,可以修饰变量、方法和类。如果final修饰变量,意味着该变量的值在初始化后不能被改变,如果修饰类,表明该类不能被其他类继承,final类中所有的成员方法都会隐式的定义为final方法,修饰方法时,将方法锁定防止继承类对其更改
- abstract修饰符可以用于类、方法、事件和索引指示器(indexer),表示其为抽象成员,抽象方法是没有方法体的方法。抽象成员,即抽象类、抽象方法、抽象事件。
- static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。- 用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。
- synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。
- volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。一个 volatile 对象引用可能是 null。
String、StringBuffer、StringBuilder的区别是什么?
从两方面来看,第一是可变性,String不可变,而StringBuffer和StringBuilder可变;第二是线程安全方面,String不可变,因此是线程安全的,StringBuffer是线程安全的,内部使用synchronized进行同步的,StringBuilder不是线程安全的。