• 课程作业03-汇总整理


    03-实验性问题总结

    一、对象判等问题

    对于原始数据类型的变量(比如int),可以直接使用“==”判断两变量值是否相等。对象变量也可以使用“==”判断两变量是否相等吗?

    输入并运行以下代码,得到什么结果?

    public class Test {

    public static void main(String[] args0){

    Foo obj1=new Foo();

    Foo obj2=new Foo();

    System.out.println(obj1==obj2);

    }

    }

    class Foo{

    int value=100;

    }

    运行结果false

    原因分析:当“==”施加于原始数据类型变量时,比较的是变量所保存的数据是否相等;当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。引用代表地址,“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

    解决方法:如果要比较两个对象的字段值,可以用基类的equals()方法;例如:A.equals(B).

    二、请总结一下,这个方法有哪些“与众不同”之处,你能列出几条?

    public class MyTestClass {

    public int Value;

    public boolean equals(MyTestClass obj)

    {

    return obj.Value==this.Value;

    }

    public MyTestClass(int initValue)

    {

    Value = initValue;

    }

    }

    1.类名和方法名相同

    2.没有返回值

    三、以下代码为何无法通过编译?哪出错了?

    public class Test

    {

    public static void main(String[] args)

    {

    Foo obj1=new Foo();

    }

    }

    class Foo{

    int value;

    public Foo(int initValue)

    {

    value=initValue;

    }

    }

    如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

    Foo obj1=new Foo()在此处调用的时候没有参数,应增加他的参数。

    四、使用上页幻灯片中定义的类,以下代码输出结果是什么?请依据代码的输出结果,自行总结Java字段初始化的规律。

    1.类的构造方法

    (1)“构造方法”,也称为“构造函数”,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。

    (2)如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

    (3)同一个类可以有多个构造函数,多个构造函数之间通过参数来区分。

    2.类的初始化块

    可以在类中使用“{”和“}”将语句包围起来,直接将其作为类的成员。类的这种“没有名字”的“成员”,多用于初始化类的字段。

    3.执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。

     

    五、请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

    class Root

    {

           static{

                  System.out.println("Root的静态初始化块");

           }

           {

                  System.out.println("Root的普通初始化块");

           }

           public Root()

           {

                  System.out.println("Root的无参数的构造器");

           }

    }

    class Mid extends Root

    {

           static{

                  System.out.println("Mid的静态初始化块");

           }

           {

                  System.out.println("Mid的普通初始化块");

           }

           public Mid()

           {

                  System.out.println("Mid的无参数的构造器");

           }

           public Mid(String msg)

           {

                  //通过this调用同一类中重载的构造器

                  this();

                  System.out.println("Mid的带参数构造器,其参数值:" + msg);

           }

    }

    class Leaf extends Mid

    {

           static{

                  System.out.println("Leaf的静态初始化块");

           }

           {

                  System.out.println("Leaf的普通初始化块");

           }    

           public Leaf()

           {

                  //通过super调用父类中有一个字符串参数的构造器

                  super("Java初始化顺序演示");

                  System.out.println("执行Leaf的构造器");

           }

    }

     

    public class TestStaticInitializeBlock

    {

           public static void main(String[] args)

           {

                  new Leaf();

           }

    }

    执行顺序(先->后):静态初始化块->初始化块(构造代码块)->构造函数

    1. 静态初始化块:在第一次加载类时执行,与对象的创建无关。
    2. 构造代码块:在调用构造方法时执行。
    3. 构造函数:在调用构造函数时执行。

    五、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?请编写代码验证你的想法。

    public class Test

    {

           int a=2;//实例变量

           static int b=3;//类的静态变量

           public static void test()

           {

                  System.out.println("实例变量a=" +new Test().a);

                  //在静态方法中访问类的实例变量需首先进行类的实例化

                  System.out.println("静态变量b="+b);

                  //在静态方法中可直接访问类的静态变量

           }

           public static void main(String[] args)

           {

                  Test.test();

                  Test test1=new Test();

                  System.out.println("结果是:实例变量="+test1.a);

           }

    }

    六、装箱和拆箱:Integer类的装箱和拆箱到底是怎样实现的?

    Int value=100;

    Integer obj=value;//装箱

    Int result=obj*2;//拆箱

    在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。装箱和拆箱的实现过程:装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 intValue方法实现的。

    七、“神奇代码”:两对整数完全一样,为何一个输出true,一个输出false?

    public static void main(String[] args)

    {

           Integer i1=100;

           Integer j1=100;

           System.out.println(i1==j1);//true

          

           Integer i2=129;

           Integer j2=129;

           System.out.println(i2==j2);//false

    }

    整数在小于127时都可以用常量池,因此第一次比较的的地址是取自同一个地址的数字,而第二次比较的数是创建了两个不同地址的对象,所以第一次比较的地址相同,第二次不同。

  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/wenqiu1998/p/7698641.html
Copyright © 2020-2023  润新知