黑马程序员—枚举、for循环增强和Overload

来源:互联网 发布:星光璀璨海选网络直播 编辑:程序博客网 时间:2024/05/22 17:01

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

1、              枚举

枚举类的方法及其作用:

 1、Enum(String name,int ordinal)单独的构造方法。程序员无法调用此构造方法。

    该构造方法用于由响应枚举类型声明的编译器发出的代码。

    name - - 此枚举常量的名称,它是用来声明该常量的标识符。

    ordinal - - 枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

 2、name()返回此枚举常量的名称,在其枚举声明中对其进行声明

 3、ordinal()返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

 4、hashCode()返回枚举常量的哈希码。

 5、valueof()返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。

 

 枚举类中的变量是可以带有构造方法的

下面是个枚举的例子

    publicenum WeekDay

    {

       sun(4),mon(),tue,wen,thi,fri,sat;

       private WeekDay(){System.out.println("无参构造方法");}

       private WeekDay(int i){System.out.println(i);}

      

    }

publicclass EnumDemo2

{

    publicstaticvoid main(String[] args)

    {

       WeekDay wd = WeekDay.mon;

      

       //输出枚举定义的对象

       System.out.println(wd);

       

       //输出定义的枚举对象的name,调用的是name()方法

       System.out.println(wd.name());

      

       //调用枚举对象的ordinal()方法输出该枚举对象的序数

       System.out.println(wd.ordinal());

      

       //调用枚举对象的valueof方法使与字符串成为对应的枚举对象

       System.out.println(wd.valueOf("fri").toString());

      

       //调用枚举对象的values(),返回的是个数组,可以取得数组的长度

       System.out.println(wd.values().length);

 

    }

}

其实,枚举在本质上也是一个类,它是一个抽象类,它里边包含有静态方法和抽象方法,它可以被认为是一种单例。

下面我们用类实现枚举:

abstractclass WeekDay

{

//定义无参构造函数

    private WeekDay(){}

    //定义抽象的下一天函数

    publicabstract WeekDay nextDay();

//在每个变量的声明中加入实现下一天的方法

    publicfinalstatic WeekDaysun =new WeekDay()

    {

       @Override

       public WeekDay nextDay() {

           //TODO Auto-generated method stub

           returnmon;

       }

      

    };

 

publicfinalstatic WeekDaymon =new WeekDay()

    {

 

       @Override

       public WeekDay nextDay() {

           //TODO Auto-generated method stub

           returntur;

       }

      

    }; 

   

   

    public String toString()

    {

       if(this==sun)

           return"sunday";

       else

              return"monday";

    }

}

 

publicclass EnumDemo1

{

    publicstaticvoid main(String[] args)

    {

//实例化一个WeekDay

       WeekDay wd = WeekDay.sun;

       System.out.println(wd.toString());

       System.out.println(wd.nextDay().toString());

    }

}

 

2、              for循环增强

 简单for循环:

 for(int i=0;i<x;i++)

 {

    ....

 }

 

 增强for循环:

 for(type 变量名 : 集合变量名)

 {

    ...

 } 

publicclass forDemo

{

    publicstaticvoid main(String[] args)throws Exception

    {

      

       int[] arr = {2,4,3,4,5,6};

       //普通简单for循环

       for(int i =0;i<arr.length;i++)

       {

           System.out.println(arr[i]);

       }

      

       //增强for循环下例类似,只不过数组换成集合即可

       for(int a : arr)

       {

           System.out.println(a);

       }

      

    }

}

 

自动装箱:

    integer i = 4;

    这个在java5版本下是编译不通过的,这个表达式实际上把int型的4装箱成了integer对象

 自动拆箱:

    System.out.println(i+11);

    这时已经被自动拆箱了,i+11已经被拆箱成了int型15。

 

 

 

3、              overlaodoverride面试题解析:

 

 Overload是重载的意思,Override是覆盖的意思,也就是重写。

  重载Overload表示同一个类中可以有多个名称相同的方法,

  但这些方法的参数列表各不相同(即参数个数或类型不同)。

  重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,

  通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,

  这相当于把父类中定义的那个完全相同的方法给覆盖了,

  这也是面向对象编程的多态性的一种表现。

  子类覆盖父类的方法时,只能比父类抛出更少的异常,

  或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,

  不能比父类有更多的问题。

  子类方法的访问权限只能比父类的更大,不能更小。

  如果父类的方法是private类型,那么,子类则不存在覆盖的限制,

  相当于子类中增加了一个全新的方法。

  至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?

  这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,

  它们的返回者类型当然也可以不一样。

  但我估计你想问的问题是:如果两个方法的参数列表完全一样,

  是否可以让它们的返回值不同来实现重载Overload

  这是不行的,我们可以用反证法来说明这个问题,

  因为我们有时候调用一个方法时也可以不定义返回结果变量,

  即不要关心其返回结果,例如,我们调用map.remove(key)方法时,

  虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,

  这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,

  java就无法确定编程者倒底是想调用哪个方法了,

  因为它无法通过返回结果类型来判断。

override可以翻译为覆盖,从字面就可以知道,

它是覆盖了一个方法并且对其重写,以求达到不同的作用。

对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,

而我们在实现时,就需要实现接口声明的所有方法。

除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。

在覆盖要注意以下的几点:

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

 

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,

通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,

来选择合适的方法执行。在使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,

       不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,

       例如可以是fun(int,float),但是不能为fun(int,int));

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响; 4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效

 

 

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

0 0
原创粉丝点击