—————————— ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ——————————
1:静态导入。2:for—each循环。3:自动装箱/拆箱。4:可变参数。5:枚举。6:注解。7:泛型
1,静态导入
2,for—each循环
public static int add(int x,int ...args) {
int sum = x;
for(int arg:args) {
sum += arg;
}
return sum;
}
3,自动装箱/拆箱
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2); //true
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4); //false
Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12);
System.out.println(num5 == num6); //true
Flyweight(享元)模式是构造型模式之一,他通过与其他类似对象共享数据来减少内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象储存池(Flyweight Pool)来内存内部状态的对象。为了调用方便,FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。
Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当一下情况成立时使用Flyweight模式:1,一个应用程序使用了大量的对象。2.完全由于使用大量的对象,造成很大的储存开销。3,对象的大多数状态都可以变为外部状态。4,如果删除对象以外的状态那么可以用相对减少的共享对象取代很多组对象。5,应用程序不依赖于对象标识。
4,可变参数
Overlead重载 Override重写
特点:
只能出现在参数列表的最后
...位于参数类型和参数名之间,前后有无空格都可以
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
举例代码:
public static void main(String[] args) {
System.out.println(add(1,2,3,5));
System.out.println(add(2,3,5));
}
public static int add(int x,int ...args) {
int sum = x;
for(int i=0;i<args.length;i++) {
sum += args[i];
}
return sum;
}
5,枚举
/*
编写一个关于星期几的枚举,要求:
1.枚举值:MON,TUE,WED,THU,FRI,SAT,SUN
2.该枚举要有一个方法,调用该方法返回中文格式的星期。
*/
public enum WeekDay {
SUN(0,"星期天"){
public WeekDay getNextDay(){
return MON;
}
},
MON(1,"星期一"){
public WeekDay getNextDay(){
return TUE;
}
},
TUE(2,"星期二"){
public WeekDay getNextDay(){
return WED;
}
},
WED(3,"星期三"){
public WeekDay getNextDay(){
return THU;
}
},
THU(4,"星期四"){
public WeekDay getNextDay(){
return FRI;
}
},
FRI(5,"星期五"){
public WeekDay getNextDay(){
return SAT;
}
},
SAT(6,"星期六"){
public WeekDay getNextDay(){
return SUN;
}
};
private String chineseFormat;//封装每个对象对应的中文格式
private Integer digitalFormat;//封装每个对象对应的数字格式
private WeekDay(Integer digitalFormat,String chineseFormat){
this.digitalFormat = digitalFormat;
this.chineseFormat = chineseFormat;
}
public String getChineseFormat(){
return this.chineseFormat;
}
public Integer getDigitalFormat(){
return this.digitalFormat;
}
public abstract WeekDay getNextDay();
}
6,注解
枚举和注解都是特殊的类,不能用new 创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。
在程序中创建出一个注解的实例对象,直接用@放上一个标记即可
MetaAnnotation ma = myAnnotation.annotationAttr();
System.out.println(ma.value());
7,泛型
Vector<? extends Number> y = new Vector<Integer>();
Vector<Number> x = y;
上面的代码错误,原理与Vector<Object > x11 = new Vector<String>();相似,只能通过强制类型转换方式来赋值。
HashMap<String,Integer> hm = new HashMap<String,Integer>();
hm.put("zxx",19);
hm.put("lis",18);
Set<Map.Entry<String,Integer>> mes= hm.entrySet();
for(Map.Entry<String,Integer> me : mes) {
System.out.println(me.getKey() + ":" + me.getValue());
}
C++用模板函数引用自定义泛型
return x+y;
}
return x+y;
}
return x+y;
}
template<class T>
T add(T x,T y) {
return (T) (x+y);
}
定义泛型方法:
<T> T add(T x,T y) {
return (T) (x+y);
//return null;
}
static <E> void swap(E[] a, int i, int j) {
E t = a[i];
a[i] = a[j];
a[j] = t;
}//或用一个面试题讲:把一个数组中的元素的顺序颠倒一下
public static <K,V> V getValue(K key) { return map.get(key);}
1.Java中的泛型类型(或者泛型)类似于 C++ 中的模板。但是这种相似性仅限于表面,Java 语言中的泛型基本上完全是在编译器中实现,用于编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码,这种实现技术称为擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)。这是因为扩展虚拟机指令集来支持泛型被认为是无法接受的,这会为 Java 厂商升级其 JVM 造成难以逾越的障碍。所以,java的泛型采用了可以完全在编译器中实现的擦除方法。
例如,下面这两个方法,编译器会报告错误,它不认为是两个不同的参数类型,而认为是同一种参数类型。
private static void applyGeneric(Vector<String> v){
}
private static void applyGeneric(Vector<Date> v){
}
2.测试代码:
String[] strs = new String[]{"a","b","c"};
swap(strs,1,2);
System.out.println(Arrays.asList(strs));
4. 只有引用类型才能作为泛型方法的实际参数,对于add方法,使用基本类型的数据进行测试没有问题,这是因为自动装箱和拆箱了。 swap(new int[3],3.5);语句会报告编译错误,这是因为编译器不会对new int[3]中的int自动拆箱和装箱了,因为new int[3]本身已经是对象了,你想要的有可能就是int数组呢?它装箱岂不弄巧成拙了。
5.用下面的代码说明对异常如何采用泛型:
private static <T extends Exception> sayHello() throws T
{
try{
}catch(Exception e){
throw (T)e;
}}
类型参数的类型推断
fill(new Integer[3],3.5f) → static <T> void fill(T[] a, T v)
int x =(3,3.5f) → static <T> T add(T a, T b)
copy(new Integer[5],new String[5]) à static <T> void copy(T[] a,T[] b);
copy(new Vector<String>(), new Integer[5]) → static <T> void copy(Collection<T> a , T[] b);
定义泛型类型:主要分两大类:1,自定义泛型方法。2,自定义泛型类和反射泛型。
public class GenericDao<T> {
private T field1;
public void save(T obj){}
public T getById(int id){}
}
—————————— ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ——————————