• 课程作业 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的范围,进行==比较时是进行地址及数值比较。

  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/cts1234/p/7699184.html
Copyright © 2020-2023  润新知