Java习题解答03

本文详细解析了Java中的对象与引用的区别,对象作为参数传递的特点,对象初始化顺序,类的static与非static字段差异,final修饰符的作用,以及数组声明的注意事项。涵盖了对象生命周期、数据传递方式和常量管理等关键知识点。
摘要由CSDN通过智能技术生成

问答题

1.对象与对象引用的区别是什么?请举例说明

对象与引用的概念
Vehicle veh1 = new Vehicle(); 通常把这条语句的动作称之为创建一个对象,其实,它包含了三个动作。
1)右边的“new Vehicle()”,即新建对象本身;
2)左边的“Vehicle veh1”创建了一个Vehicle类的引用变量或称对象引用变量。 所谓Vehicle类引用,就是以后可以用来指向Vehicle对象的对象引用。
3)“=”操作符使对象引用指向刚创建的那个Vehicle对象,有两个实体:一是对象引用变量,一是对象本身。 在Java里都是通过引用来操纵对象的。
对象和引用的具体区别
1)当对象的引用变量指向对象时,他们两就联系起来,改变引用的属性,就会改变对象的属性;
2)如果同一个对象被多个引用变量引用的话,则这些引用变量将共同影响这个对象本身。 相互独立体现在:
3)一个对象可以被不同的引用变量操纵,同时一个引用变量也可以指向不同的对象,但是同一时刻只能指向一个对象;
4)从存储空间上来说,对象和引用也是独立的,对象一般存储在堆中,而引用存储在堆栈(存储速度更快)中。
举例
class Vehicle { int passengers; int fuelcap; int mpg; }
Vehicle veh1 = new Vehicle();
通常把这条语句的动作称之为创建一个对象,它包含了四个动作。
1)右边的“new Vehicle”,是以Vehicle类为模板,在堆空间里创建一个Vehicle类对象(也简称为Vehicle对象)。
2)末尾的()意味着,在对象创建后,立即调用Vehicle类的构造函数,对刚生成的对象进行初始化。
3)左边的“Vehicle veh1”创建了一个Vehicle类引用变量。所谓Vehicle类引用,就是以后可以用来指向Vehicle对象的对象引用。
4)“=”操作符使对象引用指向刚创建的那个Vehicle对象。 我们可以把这条语句拆成两部分: Vehicle veh1; veh1 = new Vehicle(); 效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。

2. 对象作为参数传递的特点是什么?请举例说明

对象是引用传递,当对象作为参数传递时,传递的是对象的地址。

class IntClass{
    int value;
}
public class RunIntClass{
    public static void modifyValue(IntClass s,int val){
        s.value = val;
    }
    public static void mian(String args[]){
        IntClass a = new IntClass();
        modifyValue(a,8);
        System.out.println(a.value);
    }
}

程序说明:
上面的程序在main方法中产生对象a,在modifyValue中队a引用的对象进行属性复制后,之后又在main方法中显示a对象的属性。
当程序执行到“IntClass a = new IntClass()”时,产生了一个IntClass的对象,被a所引用,a在main方法栈中,对象放到堆中。
程序执行到“modifyValue(a,8)”时,在方法modifyValue的栈空间内分配了两个变量s和val,其中val通过只传递的方式获得值。但s则不同,“s=a”的含义是将a的地址传递给s,而不是产生了新的对象,这样s和a所指的对象是同一个。此时,在方法modifyValue内部,通过s进行对象的赋值,改变了堆中引用对象的属性值。方法调用完毕后,modifyValue方法所在的栈空间释放,此时s、val不复存在,但堆中的对象属性已经改变,虽然s不存在了,但a任然引用了该对象。
当程序执行到“System.out.println(a.value)”时,此时在main方法中,通过a操纵堆中的对象,显示其属性。

3.对象初始化顺序是怎么样的?请举例说明

1 static静态的变量定义;
2 static块里的代码执行,static变量也是在此刻初始化的
3 非static变量定义
4 构造器
5 非static变量初始化
比如:

class test{
    private static int a=1;
    private int b=1;
    public test(){
         b=2}
}

执行new test();的时候编译后代码顺序为:

private static int a;
static{
    a=1;
}
{
private int b;
}
public test(){
    b=1;
    b=2;
}

4.类的static字段与非static字段的区别是什么?什么情况应该使用static修饰符?请举例说明

用static修饰符修饰的方法称为静态方法,它属于类的方法,不属于类的对象。不用static修饰符限定的方法,虽然在类中定义,但其实是为对象而定义。
static修饰的方法有如下特点:
·static方法是类名,但可以被所有对象访问。调用这个方法是,可以采用“对象引用.方法名”,也可采用“类名.方法名”。
·static方法内部的代码,只能访问类中的static属性或方法,不能访问类中的非static属性或方法(因为他们属于对象);但非static方法(对象方法)可以访问static属性或方法。
·main方法是特殊的静态方法。
例:

public class ArccessValue{
    int value;
    public static void main(String args[]){
        for(int i = 0;i<args.length;i++){
            System.out.println(args[i]);
        }
    //System.out.println(value);
    }
}

5.Java中final修饰符有什么作用?请举例说明

以final修饰类属性,则该属性为常量;如果修饰方法,则方法称为最终方法,在子类当中不能覆盖。利用这一点可以防止子类修改此方法,保证了程序的安全性和正确性。

public Constant{
    static final int OK=0;
    static final int CANCEL=1;
    ...
}

Constant类中定义的静态常量,在别的类中可以通过Constant.OK来调用,Constant.OK就起到了助记符的作用。

6.Java中float[10] arr;语句正确吗?为什么?

不正确,java中数组的声明就像是C++中的定义一个指针,可以初始化,但是不能指定长度。

7.Java数组元素类型为基本数据类型和引用类型时,有什么不同?请举例说明

对于基本类型数组而言,数组元素的值直接存储在对应的数组元素中,因此,初始化数组时,先为该数组分配内存空间,然后直接将数组元素的值存入对应数组元素中。
如:

int[] a1={1,2,3,4,5};

引用类型数组的数组元素是引用,因此情况变得更加复杂:每个数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了有效数据。
如:

MyClass[] mc=new MyClass[10];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值