关于Java(3)
陈述题
- 对象与对象引用的区别是什么?请举例说明。
对象:是对客观事物的抽象。
对象引用:定义一个变量,这个变量指向一个对象。
new FighterPlane(); //创建一个对象
FighterPlane fp; //声明一个对象引用
fp = new FighterPlane();//初始化对象引用,fp指向实际对象
实质是将新创建的FighterPlane对象的首地址赋给对象引用fp,从此fp与该对象关联,通过fp即可操纵该对象。
一个对象引用:可以指向一个对象 ,也可以不指向对象。
一个对象:可以被一个对象引用引用,也可以被多个对象引用同时引用。
e.g. 遥控器(对象引用)和电视机(对象)
- 对象作为参数传递的特点是什么?请举例说明。
基本数据类型作为参数传递是值传递,而对象是引用传递。
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进行自增。
- 对象初始化顺序是怎样的?请举例说明。
- 系统会对数据成员进行默认初始化
- 执行数据成员定义处的初始化语句
- 调用构造方法为数据成员指定初值
class IntClass {
int value;
//自动初始化,默认值为0
//int value = 5; //在定义时指定初值
public Intclass(){}
//定义构造方法将属性value初始化
public IntClass( int val){
value = val;
}
}
public class IntclassConstructor {
public static Intclass getInstance(){
//调用构造方法,从而省略了s.value代码
IntClass s = new IntClass (8); // s.value=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);
}
}
- 类的static字段与非static字段的区别是什么?什么场景应该使用static修饰符?请举例说明。
- Static修饰的数据成员
用static修饰符修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员。它被保存在类的内存区的公共存储单元中,而不是保存在某对象的内存区中。因此一个类的任何对象访问它时,存取到的都是相同的数值。
(访问静态数据成员仅在类加载时进行初始化,并且只进行一次初始化。) - static修饰的类方法:
static方法是类方法,但可以被所有对象访问,static方法内部的代码,只能访问类中static属性或方法,不能直接访问类中的非static属性或方法(因为那是对象方法),但非static方法(对象方法)可以访问static数据成员。main方法是特殊的静态方法,是Application程序入口点,必须写成public static void main(String[] args)的形式。
当某一个方法或属性属于所有对象共有或不属于某一个对象时可以使用static修饰符。
- Java中final修饰符都有什么作用?请举例说明。
final修饰类属性则属性为常量,final修饰类方法则该方法在子类当中不能被覆盖,可防止任何继承类修改此方法,保证了程序的安全性和正确性。
class IntClass{
public final int value=5;
public final int getValue() {
return this.value;
}
}
public class test extends IntClass{
public static void main(String[] args) {
IntClass a=new IntClass();
//a.value=10;The final field IntClass.value cannot be assigned
//public fianl int getValue() {}fianl cannot be resolved
}
}
- Java中float[10]arr,语句正确么?为什么?
不正确。arr是数组声明,是引用。
但是不能写成 float[10] arr; 系统无法识别该语句给arr数组分配内存空间。
public class test extends IntClass{
public static void main(String[] args) {
//float[10] arr;//Syntax error on token "10", delete this token
float[] arr=new float[10];
}
}
- Java数组元素类型为基本类型和引用类型时,有什么不同?请举例说明。
Java数组的数组名相当于一个引用变量,当数组元素为基本类型时数组存储的是值(初始值为0),当数组元素为引用类型时数组存储的是对象引用(初始值为null)。
数组引用变量是存放在栈内存(stack)中,数组元素是存放在堆内存(heap)中,通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问,以下图来说明数组此时的存放形式。
public class test {
public static void main(String[] args) {
int[] arr=new int[10];
String[] s=new String[10];
System.out.println(arr);//[I@5ca881b5 arr为地址
System.out.println(s);//[Ljava.lang.String;@24d46ca6 s为地址
System.out.println(arr[0]);//0 初始值为0
System.out.println(s[0]);//null 初始值为null
}
}