一.对象与对象引用的区别是什么?请举例说明
FighterPlane fp=new FighterPlane();
1.创建对象: new FighterPlane();
//对象分配在堆heap上
2.声明一个对象引用:FighterPlane fp;
//fp作为局部变量分配在栈stack上; fp也称为引用变量
3.初始化对象引用:fp=new FighterPlane();
//fp指向实际对象
二.对象作为参数传递的特点是什么?请举例说明
基本数据类型作为参数传递是值传递,而对象是引用传递
public class ValuePass{
private static int a;
public static void main(String[] args) {
modify(a);
System.out.println(a);
}
public static void modify(int a){
a++;
}//本程序输出为0,因为a++是对形式参数进行自增,而不是类属性a进行自增
}
三.对象初始化顺序是怎样的?
- 静态语句块:在类加载到JVM时执行,由于JVM使用类的前提是类装载到JVM虚拟机,所以静态语句块首先执行,类只加载一次,静态语句块只执行一次。
- 静态变量初始化:由于静态变量为类的所有实例所共享,不依赖于具体的对象,因此不是在对象创建时初始化,而是在类加载时初始化,初始化顺序在静态语句块之后,只执行一次。
- 实例语句块:在构造方法前执行,每调用一次构造方法,执行一次。执行顺序在静态变量初始化之后,以成员变量初始化为参照,没有绝对的先后顺序,实际顺序取决于定义的顺序,定义在前,就在成员变量初始化前执行;定义在后,就在成员变量初始化后执行。
- 成员变量初始化:在构造方法前执行,每调用一次构造方法,执行一次。执行顺序在静态变量初始化之后,相对于实例语句块的执行顺序取决于定义顺序。
构造方法:最后执行。 - java对象初始化的执行顺序为:静态语句块>静态变量初始化>实例语句块/成员变量初始化>构造方法
实例语句块与成员变量初始化的相对执行顺序取决于定义的先后顺序
四.类的static字段与非static字段的区别是什么?什么场景应该使用static修饰符?
static修饰数据成员:
- 此数据成员不属于任何一个类的具体对象,而是属于类的静态数据成员
- 被保存在类的内存区的公共存储单元中
- 访问方式可以为类名加点操作符,也可以通过对象引用来访问
- 只在类加载时进行初始化,且只进行一次初始化
static修饰类:
- 类方法,可以被所有对象访问
- static方法内部的代码,只能访问类中static属性或方法
- main方法是特殊的静态方法,是Application程序入口点,必须写成public static void main(String[] args)的形式
使用场景:共享
五.Java中final修饰符都有什么作用?
- final修饰属性,属性为常量。
- final修饰方法,则该方法在子类中不能被覆盖。
六.Java中float[10]arr;语句正确吗?为什么?
不正确
float[] arr=new float[10];
//其他:
float[] f1,f2;//数组引用声明
f1=new float[10];//数组引用与新创建的数组对象相关联
f2=f1;
七.Java数组元素类型为基本类型和引用类型时,有什么不同?
- 声明的是基本数据类型的数组,那各元素都是基本数据类型,不是对象
int[] a = new int[3];
-
基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上
-
声明的是引用类型的数组,那各元素都是对象
Object[] test = new Object[12]
- 引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址