zoukankan      html  css  js  c++  java
  • 类和对象动手动脑

    // 信1705-3 20173574 李胜明

    1.

    早期经常这样定义变量

    int value=100;

    前面的示例中这样定义变量

    MyClass obj = new MyClass();

    这两种方式定义的变量是一样的吗?

    答:这两种方式定义的变量是不一样的,第一种是原始数据类型定义的变量,而第二种是通过引用类名创建一个对象obj出来,obj称为对象变量。

    2.

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

     

    代码截图:

     

    3.

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

    package 动手动脑;

    public class Text {

    public static void main(String[] args)

    {

    Foo obj1=new Foo();

    System.out.println(obj1=obj2);

    }

    }

    class Foo

    {int value;

    public Foo(int initValue) {

    value=initValue;

    }

    }

    错误原因:

    Foo的这个类中只定义了一个Foo(int)类型的构造函数,在之前的学习工程中,我们并没有接触到java的构造函数的声明过程,因此,在类中没有书写构造函数的方法的时候,编译器默认继承Object类,并在编译的时候会产生一个参数为空的构造函数,然而在定义的Foo这个类的时候,给予了一个Foo(int)类型的构造方法,所以在上述Test的调用过程中,obj1并不能够调用到new Foo()这个构造函数的方法。

    4.

    使用上页幻灯片中定义的类,以下代码输出结果是什么?

     

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

    Java进行初始化的地方有两个:初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。

    如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。

    运行截图:

     

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

    代码:

    package Root;

    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();

            

        }

    }

    代码截图:

     

    通过上面的实验可以看到,调用一个类的构造方法,会首先从最开始的子类往基类方向执行,并且最开始的执行的初始化块总是静态的,并且在执行完静态的初始化块之后,又从子类开始按普通,无参,有参的顺序开始往基类方向执行。

    6.

    上述神奇代码(StrangeIntegerBehavior.java)输出诡异的结果,原因何在?

    代码:

    public class StrangeIntegerBehavior

    {

        

        public static void main(String[] args)

        {

            

            Integer i1=100;

           

            Integer j1=100;

            

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

            

            Integer i2=129;

            

            Integer j2=129;

            

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

        

        }

    }

    代码截图:

     

  • 相关阅读:
    mysql分表场景分析与简单分表操作
    Linux内嵌汇编
    window 和 linux x64差别
    sourcetree和gitlab配置图解
    QT如何管理组件(解决“要继续此操作,至少需要一个有效且已启用的储存库”问题)
    QT5.x应用在Mac OS X和Windows平台的发布过程
    python中读写二进制文件
    mysql分表的3种方法
    MySQL-C++封装类
    MySQL删除数据库时无响应解决办法
  • 原文地址:https://www.cnblogs.com/lishengming00/p/9824948.html
Copyright © 2011-2022 走看看