1.对象与对象引用的区别是什么? 请举例说明
我们经常看到:
plane fp=new plane();
在这里,new plane()创建了一个对象,fp被称为该对象的引用。
具体来说,分成如下几个步骤
plane fp; //在栈内存里面开辟了空间给引用变量fp,这时fp=null
fp=new plane();
// new plane()在堆内存里面开辟了空间给plane类的对象,这个对象没有名字
// plane()随即调用了plane类的构造函数
// 把对象的地址在堆内存的地址给引用变量plane
注意:在这里,"="的意思是将对象的地址赋给引用fp。也就是说,fp里保存的,实际上是一个对象地址,通过fp即可操纵该对象。
形象点说,就像遥控器(对象引用)和电视机(对象)的关系
补充:一个对象引用变量均占据4字节空间; 一个对象至少占据16字节,其中包含12字节的对象头信息。除此以外,还有实例数据,对齐填充字节。
2.对象作为参数传递的特点是什么?请举例说明
首先我们明确,基本数据类型作为参数传递是值传递
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
而对象作为参数传递是引用传递,即传递的是对象地址
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();
modifyValue(a,8);
System.out.println(a.value);
}
}
//8
class IntClass {
int value;
}
public class RunIntClass {
public static IntClass getInstance() {
//在方法中产生对象
IntClass s = new IntClass ();
s.value=8;
return s; //返回对象引用
}
public static void main(String [] args) {
IntClass a = getInstance();
System.out.println(a.value);
}
}
//8
3.对象初始化顺序是怎样的?请举例说明
创建对象时的初始化顺序:
>>系统会对数据成员进行默认初始化
>>执行数据成员定义处的初始化语句
>>调用构造方法为数据成员指定初值
class IntClass{
int value;//自动初始化 默认值为0
//int value=5; 在定义时指定初值
}
public IntClass(){}
public IntClass(){
value=val;
}
public class IntClassConstructor{
public static IntClass getinstance(){
IntClass s=new IntClass(8);
return s;
}
public static void main(String args[]){
IntClass a=new IntClass();
System.out.println(a.value);
a=getinstance();
System.out.println(a.value);
}
}//0 8
4.类的static字段与非static字段的区别是什么?什么场景应该使用static修饰符?请举例说明
>>用static修饰符修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员。
>>它被保存在类的内存区的公共存储单元中,而不是保存在某个对象的内存区中。因此,一个类的任何对象访问它时,存取到的都是相同的数值。
>>访问方式为通过类名加点操作符来访问,也可通过对象引用来访问。
>>静态数据成员仅在类加载时进行初始化,且只执行一次初始化
>>static方法内部的代码,只能访问类中的static属性或方法,不能直接访问类中的非static属性或方法(因为那是对象方法),但非static方法(对象方法)可以访问static数据成员。
>>main方法是特殊的静态方法,是Application程序入口点,必须写成public static void main(String [] args)的形式。
输出 5 2
静态代码块
一个类中可以使用不包含在任何方法体中的静态代码块,当 类被装载时,静态代码块被执行,且只被执行一次,静态代 码块经常用来对类中定义的属性进行初始化。
class Test {
static int value ;
static {
value = 3;
System.out.println("value="+value);
}
public static void main(String[] args){ }
}
//程序输出结果为value=3