Class类之反射
EG:
publicclass Dog {
//成员变量定义
String name;
String age;
//构造方法
public Dog() {
System.out.println("无参数的 Dog construct");
}
public Dog(String name) {
this.name = name;
System.out.println("一个参数的 Dog construct");
}
public Dog(String name,Stringage) {
this.name = name;
System.out.println("二个参数的 Dog construct");
}
//动作
publicvoid meth(){
System.out.println("dog meth"+this.name);
}
publicvoid meth1(){
System.out.println("dog meth1");
}
//成员变量的get set 方法
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public String getAge() {
returnage;
}
publicvoid setAge(String age) {
this.age = age;
}
}
publicstaticvoid main(String[] args) {
//反射
try {
Class class1 = Class.forName("com.etc.classreflection.Dog");//加载此路径的这个类
Dog dog1 = null;//定义Dog类型变量
Dog dog2 = null;
Constructor [] cs = class1.getConstructors();//获取所有构造方法
for(Constructor c:cs){
Type [] ts =c.getGenericParameterTypes();//获取构造方法的参数类型列表
if(ts.length>0){//判断参数类型的个数来确定参数的个数
dog1 = (Dog) c.newInstance("dog");//调用只有一个参数类型为String的构造方法
}else{
dog2 = (Dog) c.newInstance();//调用没有参数的构造方法
}
}
System.out.println("dog1.name:"+dog1.getName());
System.out.println("dog2.name:"+dog2.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
两种形式获取类的实例(对象):
1.通过Class类的实例获取对象
Eg:
Class class1 = Class.forName("com.etc.classreflection.Dog");//加载此路径的这个类
Dog dog1 = (Dog)class1.newInstance();//第一种方式
2.调用类的构造方法获取
dog1 = (Dog) c.newInstance("dog");//调用只有一个参数类型为String的构造方法
dog2 = (Dog)c.newInstance();//调用没有参数的构造方法
Date:日期工具类
包路径:java.util.Date;
Calendar:日期工具类
包路径:java.util.Calendar;
SimpleDateFormat:字符串与日期之间转换类
包路径:java.text.SimpleDateFormat;
日期转字符串eg:
// Calendar c5 =Calendar.getInstance();
// String strdate = sdf.format(c5.getTime());
// System.out.println(strdate);
字符串转日期Eg:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String str = "2013-07-31";//字符串转换到日期类型 字符串格式必须与SimpleDateFormat定义格式完全一致
Date date =sdf.parse(str);
System.out.println(date.getTime());
单例模式:
一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
1.定义一个这私有的静态的自己类型的成员变量
2.私有化构造方法
3.提供一个静态的返回值为自己类型的公共方法
饿汉:
publicclass SingetonClassHungry {
privatestatic SingetonClassHungry sc = null;//1.定义一个这私有的静态的自己类型的成员变量 饿汉式
private SingetonClassHungry(){}//2.私有化构造方法
publicstatic SingetonClassHungry getsingletonClass(){//3.提供一个静态的返回值为自己类型的公共方法
if(sc==null){
sc = new SingetonClassHungry();
}
returnsc;
}
publicvoid meth(){
System.out.println("meth");
}
}
饱汉:
publicclass SingetonClassFull {
privatestatic SingetonClassFull sc = new SingetonClassFull();//饱汉式
private SingetonClassFull(){}//2.私有化构造方法
publicstatic SingetonClassFull getsingletonClass(){//3.提供一个静态的返回值为自己类型的公共方法
returnsc;
}
publicvoid meth(){
System.out.println("meth");
}
}
内存里分四个区域:
code segment(存放代码)
data segment(字符存放静态变量串常量)
stack(存放局部变量)
heap(存放new出来的对象或者数组)
实例化过程
先分配空间
构造函数后被实例变量被赋值
方法执行完局部变量消失
引用指向对象
对象的销毁:
局部变量
实例变量
对象
对象销毁时会调用finalize()
程序运行时会开启两个线程 main主线程 Finalizer线程(垃圾回收)
规范:
package的命名
package 的名字由全部小写的字母组成,例如:cn.mybole。
class和interface的命名
class和interface的名字由大写字母开头而其他字母都小写的单词组成,例如:Person,RuntimeException。
class变量的命名
变量的名字用一个小写字母开头,后面的单词用大写字母开头,例如:index,currentImage。
class方法的命名
方法的名字用一个小写字母开头,后面的单词用大写字母开头,例如:run(),getBalance()。
static final变量的命名
static final变量的名字所有字母都大写,并且能表示完整含义。例如:PI,PASSWORD。
参数的命名
参数的名字和变量的命名规范一致。
数组的命名
数组应该总是用这样的方式来命名:byte[] buffer。
异常:
异常(Exception)是一种特殊的运行错误,是在程序运行过程中发生、会打断程序正常执行的错误。
Java程序运行过程中所发生的异常事件可分为两类:
错误(Error):JVM系统内部错误、资源耗尽等严重情况(代码无法控制)
违例(Exception):其它因编程错误或偶然的外在因素导致的一般性问题,例如:
对负数开平方根
空指针访问
试图读取不存在的文件
Error类对象由Java虚拟机生成并抛出;
无法恢复
OutOfMerroyError
Exception类对象由应用程序处理或抛出
编译错误:语法错
编译错误是由于所编写的程序存在语法问题,未能通过有源代码到目标代码得的转换,这个错误可以简单地有编译系统查出来
运行异常:运行错误:
运行错误是在程序运行过程中产生的错误
捕获异常
try{可能会抛出异常语句体
}catch(异常类型异常变量名){
抛出异常被捕获后执行语句体1
}finally{
必须执行的语句体2
}
语句体2必须执行
抛出异常
throws:用在方法定义
访问修饰符 修饰符返回值类型 方法名称(参数列表) throws 异常1,异常2.。。。。{方法体}
throw:用在语句体中
throw new 异常类();