• 类与对象


    思考题:

     1.早期我们经常这样定义变量

    int value=100;

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

    MyClass obj=new MyClass();

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

    答:当然不一样,前者只是定义一个变量,后者则是定义对象变量,两者不一样。

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

    对象变量也可以使用“==”判断两变量值是否相等吗?

    答:不可以,基本类型byte shout int long char float double boolean这些类型的变量使用==判断,对象要使用equals来判断,因为String是对象所以要使用equals来判断。

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

    public class Test{

           public static void main(String[] args){

                    Foo obj1=new Foo();

                    Foo obj2=new Foo();

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

            }

    }

    class Foo{

            int value=100;

    }

    答:结果为

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

    动手动脑:

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

    public  class Test{

             public static void main(String[] args){

                    Foo obj1=new Foo();

            }

    }

    class Foo{

              int value;

              public Foo(int initValue){

                     value = initValue;

      }

    }

    因为构造函数未定义,newFoo()缺少参数。

    自找麻烦:

    如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

    如果父类中有静态成员赋值或静态初始化块,执行静态成员赋值或静态初始化块。如果类中有静态成员赋值或静态初始化块,执行静态成员赋值或静态初始化块将类的成员赋予初值。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。

    进行试验

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

    public static void main(String[] args){

                InitializeBlockClass obj=new InitalizeblockClass();

                System.out.println(obj.field);

    }

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

    运行结果:100

                300

    总结:

    所有类的变量都默认初始化null,数字类的原始数据类型默认初始化为0。执行类的成员定义的默认值或类的初始化块,到底执行哪个要看哪一个排在前面。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

    动手动脑:

    当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。

    请自行编写示例代码验证以上结论。

     

    class GrangFather{

        static

    {

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

        }

    }

      class Father extends GrangFather

    {

        static 

        {

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

        }

    }

    class Son extends Father

    {

    static 

        {

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

        }

    }

    public class Jicheng {

     

    public static void main(String[] args) {

    new Son();

         }

    }

    结果:

    动手动脑:

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

    结果:

    总结:

    1.静态初始化块只执行一次。

    2.创建子类型的对象时,也会导致父类型的静态初始化块的执行。(对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。)  

    思考:

    代码:

    public static void main(String[]args){

      Integer i1=100;

      Integer j1=100;

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

      Integer j2=129;

      Integer j2=129;

    System.out.println(j2==j2);  //flase

     

    }

    两对整数明明完全一样,为何一个输出true,一个输出false?

    调用了java.lang.String类,包含了字符串的值并且实现比较特殊,可以不适用构造方法,就可以直接获得一个字符串对象。

    课后作业

    使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。

    源程序:

     public class Test{

        private static int i = 0;

           public Test() 

            {
                i++;
             }
          public static int getNumber() 

          {
               return i;
           }
        public static void main(String[] args) {

          Test t1 = new Test();
          Test t2 = new Test();
          Test t3 = new Test();
          System.out.println("一共创建了" + Test.getNumber() + "个对象");
        }
    }

    结果:

  • 相关阅读:
    C++复制构造函数,类型转换构造函数,析构函数,引用,指针常量和常量指针
    POJ1611(The Suspects)--简单并查集
    最小生成树-Kruskal算法
    POJ1861(Network)-Kruskal
    POJ1979(Red and Black)--FloodFill
    [转]全网最!详!细!tarjan算法讲解
    POJ1573(Robot Motion)--简单模拟+简单dfs
    最小生成树-Prim算法
    POJ3368(Frequent values)--线段树
    POJ3255(Roadblocks)--次短路径
  • 原文地址:https://www.cnblogs.com/liulitianxia/p/4892804.html
Copyright © 2020-2023  润新知