课程作业 03 动手动脑 2017.10.20

1.

代码:

public class ClassAndObjectTest {

 

    public static void main(String[] args) {

       //创建类的实例,定义一个对象变量引用这一实例

       MyClass obj = new MyClass();

       //通过对象变量调用类的公有方法

       obj.myMethod("Hello");

       //给属性赋值

       obj.setValue(100);

       //输出属性的当前值

       System.out.println(obj.getValue());

       //直接访问对象公有字段

       obj.Information = "Information";

       //输出对象公有字段的当前值

       System.out.println(obj.Information);

    }

}

 

/**

 * 自定义Java类的示例

 */

class MyClass {

    // 公有字段

    public String Information = "";

 

    // 自定义公有Java实例方法

    public void myMethod(String argu) {

       System.out.println(argu);

    }

 

    // 定义属性:私有字段+get方法+set方法

    private int value;

    public int getValue() {

       return value;

    }

    public void setValue(int value) {

       this.value = value;

    }

 

}

截图:

 

2.

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

public class test

{

    public static void main(String[] args)

    {

       Foo obj1=new Foo();

    }

}

class Foo

{

    int value;

    public Foo(int initValue)

    {

       value=initValue;

    }

}

 

 

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

3.

请依据代码的输出结果,自行总结Java字段初始化的规律。

代码:

public class InitializeBlockDemo {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

      

       InitializeBlockClass obj=new InitializeBlockClass();

       System.out.println(obj.field);

      

       obj=new InitializeBlockClass(300);

       System.out.println(obj.field);

    }

 

}

 

class InitializeBlockClass{

    //下面这句在初始化块之前与之后,会影响到field字段的初始值

    //public int field=100;

   

    {

        field=200;

    }

    public int field=100;

    public InitializeBlockClass(int value){

       this.field=value;

    }

    public InitializeBlockClass(){

      

    }

}

结果:

 

 

如果对象中没有形参,则将类中定义的数初始化;如果对象中有形参,则将对象中的数初始化

 

 

4.

请运行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. 非静态初始化块的代码会在类构造函数之前执行。因此若要使用,应当养成把初始化块写在构造函数之前的习惯,便于调试;
  4. 静态初始化块既可以用于初始化静态成员变量,也可以执行初始化代码;
  5. 非静态初始化块可以针对多个重载构造函数进行代码复用

 

 

5. 静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

请编写代码验证你的想法。(发表到博客)、

代码:

package test;

 

class test

{

    int a=1;

    static int b=2;//金泰

    public static void fagnfa()

    {  

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

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

    }

    public static void main(String[] args)

    {

       test.fagnfa();

       test test = new test();

       System.out.println("x = " + test.a);

    }

}

 

 

6.

 

 

 

提示:

         使用javap来分析生成class文件,看它调用了Interger类的哪个方法,然后打开JDK源文件查看源码,就可以找到答案。

在-128~127的Integer值并且以Integer x = value;的方式赋值的Integer值在进行==和equals比较时,都会返回true,因为Java里面对处在在-128~127之间的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比较,而超出-128~127的范围,进行==比较时是进行地址及数值比较。

 

转载于:https://www.cnblogs.com/cts1234/p/7699184.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值