1、对象与对象引用的区别是什么?请举例说明
对象是堆内存的一块区域,它负责存储具体的数据;
对象引用时栈内存的一块区域,它存的是对象的地址;
在Java中我们无法操作堆内存里的对象,都是通过栈内存的对象引用来操作的。
Person person;//person是指向所创建的对象的引用
person person = new Person("小明");//等号右边的new Person("小明")创建真正的对象
2、对象作为参数传递的特点是什么?请举例说明
基本数据类型作为参数在方法中的传递是值传递;对象作为参数传递是引用传递,传递的是对象的地址(即对象只有一个)。
class IntClass{
int value;
}
public class RunIntClass{
public static void modifyValue(IntClass s, int val){
s.value = val;
}
public static void main(String args[]){
IntClass a = new IntClass();//产生对象a
modifyValue(a,8);//对a引用的对象进行属性赋值
System.out.println(a.value);//打印a的属性
}
}
/*
输出结果:
8
*/
3、对象初始化顺序是怎样的?请举例说明
- 初始化类变量(即static修饰的成员变量),并未赋值。无论类变量写在哪里,系统总会先找到它并进行初始化。
- 执行静态代码块和类变量定义式,这二者之间根据写的位置来决定先后,先写先执行。
- 初始化实例变量(即未被static修饰的成员变量),并未赋值。同样的,无论实例变量写在哪里,在创建对象时执行到这里时,系统总会找到它进行变量初始化。
- 执行构造代码块和实例变量定义赋值式,同上,这二者同样根据写的位置先后来决定执行顺序先后。这里要注意的就是构造代码块是可以调用静态变量的,实例变量定义赋值式可以看做是只对实例变量进行赋值的构造代码块。
- 执行构造函数。构造函数同样可以调用静态变量和实例变量。
举例如下:
public class JustForTest {
public static void main(String[] args) {
Car c=new Car();
sop("i="+c.i);
}
static void sop(Object obj){
System.out.println(obj);
}
}
class Car{
static int i=1; //定义赋值
static { //静态代码块
i=4;
}
}
/*
输出结果:
4
*/
只改写Car内部,让静态代码块和静态变量的定义赋值互换位置,其他保持不变:
class Car{
static { //静态代码块
i=4;
}
static int i=1; //定义赋值
}
/*
输出结果:
1
*/
4、类的static字段与非static字段的区别是什么?什么情况应该使用static修饰符?请举例说明
区别:
- static方法内部的代码,只能访问类中的static属性和方法,不能直接访问类中的非static属性和方法,因为那是对象方法;但非static方法可以访问static数据成员。
- static修饰的数据成员不属于任何一个类的具体对象,而是属于类的静态数据成员,类中的任何对象访问它时,存取到的都是相同的数值;而非static修饰的数据成员一般属于某一个类的具体对象,随着类中的操作而数值可能会发生变化。
使用情况:
在需要使用一些逻辑上不属于对象的属性或方法时应当使用static修饰符。如:统计类中对象的个数时需使用静态属性。
5、Java中final修饰符都有什么作用?请举例说明
- 当final修饰属性时,该属性为常量;如:
final int NUM = 20;
NUM = 30;//编译错误
- 当final修饰方法时,则该方法在子类当中不能被覆盖,可防止任何继承类修改此方法,保证了程序的安全性和正确性;如:
class Parent {
public final void method1() {}//该方法将不能被子类所覆盖
}
class Child extends Parent {
public final void method1() {...}//编译错误
}
- 当final修饰类时,则该类不能被继承。如:
class Parent{
}
final class Person extends Parent{
}//此处可以继承Parent类,且用final修饰Person类
class Child extends Person{
}//编译错误,此处不能继承Person类
6、Java中float[10] arr;语句正确吗?为什么?
不正确。数组对象在声明时不能直在方括号内指定数组大小。正确声明格式应为float[] arr;
,或初始化格式float[] arr = new float[10];
。
7、Java数组元素类型为基本数据类型和引用类型时,有什么不同?请举例说明
- Java数组元素类型为基本数据类型时,初始化语句的作用是给数组分配空间,创建数组对象,并将每个单元初始化为默认值0。如:
int[] arr = new int[10];//产生一个有10个单元,类型为int的数组对象,所有单元初始值为0
- Java数组元素类型为引用类型时,每个单元存放的是对象的引用,并未创建具体的对象,单元初值为null;为数组对象引用赋值之后才能够正常使用数组元素,否则将会抛出NullPointerException异常。如:
String[] example = new String[10];//创建对象引用数组
for(String x:example){
System.out.println(x);//输出结果为10个null