(方立勋)
1.可变参数与overload与override的区别( 解释:重载与重写的区别 )
可变参数的特点:只能出现在参数列表的最后
...位于变量类型和变量名之间,前后有无空格都可以;
调用可变参数的方法是,编译器为该可变参数隐含创建一个数组,在方法体中
以数组的形式访问可变参数
一下复制一行
重写,如果父类用private来修饰,而子类写和父类同名的函数,则不叫重写
package itcast.com;
public class VarableParameter {
/*
*可变参数指的就是,参数数量不加以限制。后面的数组代表存储参数的数组!
* /
public static void main(String[] args) {
System.out.println(VarableParameter.add(1,1,1,1,10, 5));
}
//可变参数,只能在参数的最后,后面不能再有了
public static int add(int x,int... args){
int sum=x;
for(x=0;x<args.length;x++){
//输出数组中的数据
System.out.print(args[x]+" ");
//在方法体中当数组的形式来用
sum+=args[x];
}
System.out.println();
return sum;
}
}
eg:
做到这里有一个疑问,就是x代表什么意思,我要输出,数组里面的数据,到时总是输出不了全部(我自己理解的),?
上了黑马论坛问了一下得到了完美的答案!
答案入下:
int x 是输入的第一个参数,而后面的是可变参数,都存储到了数组里面,所以后面的累加,sum 初始化为x就
不奇怪了,因为累加要加上x。
里面也可以不写x,那就是只累加数组里面的内容(当然sum初始要为0)
2。增强for循环
for(type 变量名:集合变量名){.......}
注意事项:
爬坡/ 正斜杠,下坡/反斜杠
迭代变量必须在()中定义
集合变量可以是数组或实现了,iterable接口的集合类
上面的例子改成了增强for循环来写
for(int arg:args){
sum+=arg;
System.out.println(arg);
}
答案正确
3.基本数据类型的装箱与拆箱
1.重构的好处,调用处会自动改
Integet iObj=3; //装箱
System.out.println(iObj+2); //拆箱
手工调用:
一个字节之内 =128~127
享元模式:flyweight
用的情况1.比方说word里面输入的数字,如果没次都是对象,浪费
可以定义26个对象。
不同的小对象变成一个对象,对象不同的属性,抽出作为外部
的参数
4.枚举(*)
采用抽象方法定义nextDay就将大量的ifelse语句转移成一个个独立的类
package itcast.com;
public abstract class WeekDay {
private WeekDay(){};
public final static WeekDay MON=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public final static WeekDay SUN=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public abstract WeekDay nextDay() ;
/* public WeekDay nextDay() {
if(this==SUN){
return MON;
}
else {
return SUN;
}
}*/
//实现toString
public String toString(){
return this==SUN?"SUN":"MON";
}
}
//测试类
package itcast.com;
public class EnumTest {
public static void main(String[] args) {
WeekDay weekDay =WeekDay.SUN;
System.out.println(weekDay.nextDay());
}
}
5.枚举类的基本应用。
package itcast.com;
public class Enum {
/*
* Enum相当于一个类
* 对像相当与一个对象
*/
public static void main(String[] args) {
WeekDay weekDay=WeekDay.FRI;
//提供的静态方法
System.out.println(WeekDay.valueOf("SUN"));
//对象的放法
System.out.println(weekDay.getClass());
System.out.println(weekDay.getClass());
System.out.println(WeekDay.values().length);
System.out.println(weekDay.ordinal());
}
public enum WeekDay{
//定义weekDay枚举类的对象
SUN,MON,TUE,WED,TRI,FRI,SAT;
}
}
使用jdk提供的enum
枚举类没有构造方法!
我们定义一个带参数的构造方法!位置有规定
/*
* 如果需要调用指定的构造方法只需要定义
* 枚举对象()带参就好了
*/
public enum WeekDay{
//定义weekDay枚举类的对象
SUN(1),MON(),TUE(1,2),WED(2),TRI,FRI,SAT;
//1.不带参数构造方法定义成私有的
private WeekDay(){ System.out.println("first");};
//2.不带参数构造方法定义成私有的
private WeekDay(int day){System.out.println("second");};
//3.不带参数构造方法定义成私有的
private WeekDay(int day,int day2){System.out.println("third");};
}
}
构造方法要是私有的,来隐藏内部结构
6.反射
反射就是把java类中的各种成分映射成java类
可以得到类的Method Contructor Package
类constructor类代表字节码中的构造方法!
String.class.getConstructor(写参数.class);
构造方法可以得到什么东西!
可以构造一个实例对象.newInitargs( initargs) 编译时,运行时
获得方法再调用方法!