java基础增强
JDK1.5以后提供的新特性。
1,自动拆箱/装箱
好处:简化基本数据类型包装类的编写。
Integer i = 30;//自动装箱。
i = i + 3;//拆箱:intValue(),将运算完的结果进行装箱。
注意:Integer i = null;NullPointerException().
--------------------------------------------------
2,静态导入:
好处:简化代码编写。
import导包动作用来简化类的书写。
为了简化工具类中的静态方法调用。
import static java.lang.System.*; out.println("demo");
--------------------------------------------------
3,可变参数。
好处:简化书写。
void methodName(类型... 参数)
三个点代表什么?代表的是接收一个该类型的数组。
注意:可变参数必须写在参数列表的末尾。
--------------------------------------------------
4,泛型:jdk1.5推出一个安全机制。
好处:将运行时期出现的问题(ClassCastException)转移到编译时期
避免了强转的麻烦。
优化了程序设计。
格式:<T>,相当于给类或者方法传递一个引用数据类型参数。
ArrayList<String>
泛型的应用:在操作对象的时候指定对象的类型。
泛型类的设计:
早期:通过Object完成的。但是这种方式需要强制,容易出现类型转换异常。
有了泛型类以后:在定义类时直接定义该类对象所操作的引用数据类型。
class Demo<Q>
{
private Q obj;
public void setObj(Q obj)
{
this.obj = obj;
}
}
泛型方法的设计:
在类上定义时,代表着该类对象调用方法时操作的是同一种指定数据类型。
可是现在的需求是:每一个方法操作的类型有可能不同。但还不确定是哪一种类型。
那么这时将泛型定义在方法上。
public <T> void show(T t){},
通常用在静态方法中。可以参照API文档中的Collections。
泛型的限定:
<? extends E>: 可以接收E类型或者E的子类型。
<? super E>: 可以接收E类型或者E的父类型。
什么时候使用泛型呢?
当描述对象或者描述功能时,其中操作的引用数据类型不确定的时候,使用泛型。不使用泛型可以使用Object。
----------------------------------------------------------
5,增强for循环
好处:简化了遍历。
和老式for循环有什么区别?
新式for循环,需要有一个被变量的目标。或者集合或者数组。
----------------------------------------------------------
6,反射
特点:动态获取类以及类中成员。
好处:通常在程序扩展时,会使用父类或者接口完成,其实就是多态。
在这种情况,运行时,还是需要给其传递一个自定义的子类对象。需要自己new来完成。
虽然修改动作已经很少了,但还是需要修改部分细节。
interface Inter{void show();}
class Demo
{
void function(Inter in)
{
in.show();
}
}
main()
{
Demo d = new Demo();
d.function(new InterImpl());//这里还要做一个小小的改动,传入一个新的后期子类对象。
}
class InterImpl implements Inter{public void show(){}}
能不能完全不改动源程序,就可以运行后期子类内容呢?
对外暴露一个配置文件,该配置文件可以是键值对形式的.ini文件。xml文件。config.txt
通过反射机制动态获取子类字节码文件。并动态创建其对象。
main()
{
Demo d = new Demo();
BufferdReader bufr = new BufferedReader(new FileReader("config.txt"));
String className = bufr.readLine();
Class clazz = Class.forName(className);
Inter in = (Inter)clazz.newInstance();
d.function(in);
}
前期设计完成。
在配置文件中只要将子类字节码名称,写入即可。
config.txt
className=InterImpl
通过上面示例,可以看到反射进一步增强了程序的扩展性。
--------------------------------------
Class类将字节码文件封装成对象。
那么就可以指挥该对象做事情,字段Field,函数Method,构造函数Constructor,都被封装成了对象。
public class Person
{
private String name;
private int age;
public Person(String name,int age)
{
}
public void show()
{
System.out.println("name="+name+",age="+age);
}
}
main()
{
//1,获取指定类的字节码对象。
//a,对象.getClass();
//b,类名.class.
//c,Class.forName("类名");
Class clazz = Person.class;
//获取示例,示例是不是要先构造初始化。
//没有空参数的,就要收到获取但参数的构造函数。
Constructor cons = clazz.getConstructor(String.class,int.class);
//指挥这个构造函数示例化。
Person p = (Person)cons.newInstance("zhangsan",30);
//获取类中的方法对象。
Method m = clazz.getMethod("show",null);
//指挥方法对象做事情。调用invoke方法。
m.invoke(p,null);
}
----------------------------------------------------------------
7,枚举类型
好处:是一种简化形式。
将常见的具体值进行了封装。限定了取值范围。
将运行时出现的问题,转移到了编译时期。
可以直接用switch语句对枚举的值进行选择。
特点:
enum是新特性中提供的一个新的引用数据类型。
每一个枚举值都是一个enum类型的子类对象。
在枚举中可以定义一般方法和抽象方法。
还可以定义构造函数。但构造函数不可以共有。
那么定义了抽象方法,该如何实现呢?
因为枚举的子类对象已经是定义好的,可以在每一个值中进行抽象方法的复写。
public enum Demo{
//GOOD,PASS;//调用枚举中空参数构造函数初始化。
GOOD("良好")
{
public int getNum()
{
return 4;
}
},
PASS("及格")
{
public int getNum()
{
return 3;
}
};
private String name;
private Demo(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public abstract int getNum();
}
//什么时候用枚举?
当分析事物时,值是固定时,可以用枚举类型来将值的范围固定。
比如:性别,星期,月份等。
而早期没有枚举的时候,怎么来描述具体固定值这样的应用场景呢?
通过接口的形式来描述。每一个值有可能不是基本数据类型。因为基本数据类型描述过于简单。
通过对象来描述。参考MyEnum.java
新出的enum类型要间的多。
-----------------------------------------------------------------
Java免费学习 Java自学网 http://www.javalearns.com
好好生活网 http://www.haohaosh.com