---------------------- <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 WeekDay sun = new WeekDay()
{
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
returnmon;
}
};
publicfinalstatic WeekDay mon = 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、 overlaod与override面试题解析:
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>、期待与您交流! ----------------------