1. 概念:单例是常见的设计模式,在Java中,单例对象必须保证JVM中只有一个该类的
实例对象存在。
2. 单例的代码实现:
//饿汉式:
优点:并发效率高
缺点:空间利用率低
class Single1{
private static final Single1 s=new Single1();
private Single1(){}
public static Single1 getInstance(){
return s;
}
}
//懒汉式:
优点:空间利用率高
缺点:并发效率低
class Single2{
private static Single2 s;
private Single2(){}
public synchronized static Single2 getInstance(){
if(s==null){
s=new Single2();
}
return s;
}
}
二、反射
1. 概念:【理解】
① 类的对象:基于定义好的一个类,创建该类的实例对象。
new出来的对象都是类的对象
② 类对象:类加载的产物,封装了该类的所有的信息
(类名、包名、父类、接口、方法、属性等)。
2. 获取类对象的方式:【重点】① 通过 类的对象 获取 类对象
Student s=new Student();
Class c1=s.getClass();
② 使用类名获取类对象:
Class c2=Student.class;
③ 使用Class中静态方法 forName获取类对象
Class c3=Class.forName("包名.类名");
注意:类名必须是全类名:包名.类名
3. 反射的特点:① 缺点:可读性差
② 优点:可以使代码更加灵活通用。一般应用在底层开发,例如框架等。
eg:
package demo20171121;
import java.io.File;
import java.lang.reflect.Field;
/*
* 类对象:类加载的产物,封装了该类的所有信息(packageName包名,ClassName类名,superName父类名,fields属性,methods方法,interface接口,construcutor构造方法)
* 类加载:java虚拟机第一次加载的类,读取类的信息,存到java虚拟机中,只进行一次,通过classPath找到.class字节码文件
*
*/
public class classDuixiang {
//获取类对象第一种方法,通过创建类的对象,调用getClass()获取类对象
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Student student = new Student();
Class class1 = student.getClass();
System.out.println(class1);
//获取类对象第二种方法,通过类名.class获取类对象
Class c=Student.class;
System.out.println(c);
//获取类对象第三种方法,通过Class.forName()
Class forName = Class.forName("demo20171121.Student"); //全类明
System.out.println(forName);
Field[] declaredFields = forName.getDeclaredFields();
for(Field ff:declaredFields){
System.out.println("所有属性,私有属性,不包过父类:"+ff.getName());
}
//获取包名
Package package1 = forName.getPackage();
System.out.println(package1.getName());
//获取类名
String name = forName.getName();
System.out.println(name);
//利用反射创建对象
Object newInstance = forName.newInstance();
Student stu=(Student)newInstance;
//获取类名
System.out.println(stu.getClass()+"66666666666666666666666666");
//获取文件的绝对路径;
File file = new File("D:\\Baizhieclipse\\workspace\\Test\\src\\demo2017113");
File absoluteFile = file.getAbsoluteFile();
System.out.println(absoluteFile);
//对文件本身的一种操作,获取文件夹或者文件的名字
String name2 = file.getName();
System.out.println(name2);
//获取文件中所有文件夹中所有的文件名
//把一个文件夹中所有文件存到数组中
File[] listFiles = file.listFiles();
for(File f:listFiles){
//判断文件是否是一种标准的文件格式
if(f.isFile()){
System.out.println(f.getName());
}
}
}
}
class Student{
private String name;
public Student(){}
public Student(String name){
this.name=name;
}
}
未完--------------------------------------------------