类与对象

课后作业1

源代码:

public class NumberObjects {

 

        public static void main(String[] args) {

        Number n1=new Number();

        Number n2=new Number();

        System.out.println("你已经创建了"+Number.count+"对象");

        }

}

class Number

{

         static int count;

         public Number()

             {

                 count++;

             }

         int  GetCount()

            {

                return count;

            }

}

运行结果截图:

 

*思考1

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

  int value=100;

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

  MyClass obj = new MyClass();

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

不一样。前面只定义一个变量,后者定义的对象变量。

*思考2

 

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

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

 

运行结果:flase

原因:当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等

当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

*动手动脑:

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

 

构造函数未定义。new Foo()缺少参数

*“自找麻烦”:

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

如果父类有静态成员赋值或静态初始化块,执行静态成员赋值和静态初始化块。如果类有静态成员赋值或静态初始化块,执行静态成员赋值和静态初始化块将类的成员赋予初值。如果构造函数中年存在this()调用则执行。

*进行试验:

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

 

运行结果: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.创建子类型的对象时,也会导致父类型的静态初始化块的执行。

一个有趣的问题:

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

*“神器代码”

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类,包含了字符串的值和实现比较特殊,可以不适用构造方法,就可以直接获得一个字符串对象。

*出问题啦!

 package jix

public class Hello

{

public static void main(String[] args) 

{

System.out.println("Hello World!");

}

}

运行结果:错误:找不到或无法加载主类 jxlPacakge.Hello

*动手练习

不使用Eclipse,直接使用命令行运行Test1.javaTest2.JavaTest3.Java

 

 

posted @ 2015-10-16 22:52  drcc  阅读(169)  评论(0编辑  收藏  举报