------- android培训、java培训、期待与您交流! ---
静态导入:
静态导入是JDK1.5的新特性,比如Math类中的静态方法,需要类名调用,也就是Math.max(3,6);
但是我们用静态导入的方法可以不用类名调用,直接写方法掉用。写法如下:在包名的下边输入:
import static java.lang.Math.max;
import static java.lang.Math.*;
这样调用max()方法的时候就可以省略类名了。
overload和override
一般语境里overload是对method(方法)而言的,可以指一个类中多个名字相同而参数类型列表不相同的方法,这个名字代表的方法就是被overload了的。编译器会根据参数类型列表的不同来决定调用叫这个名字的很多方法中具体的哪一个。
>>override(通常被翻译为覆盖)
一般语境里,如果说这个method(方法)是被override来的,就是说在定义这个方法的类的父类中有一个与这个方法同名且参数类型列表相同的方法,在子类中,这个方法被override了。在对这个子类的实例调用该方法时,编译器确切的知道调用的是这个子类的方法。
可变参数:
一个方法接受的的参数个数不固定,例如
可变参数的特点:只能出现在参数列表的最后;
“...”位于变量类型和变量名之间,前后有无空格都可以
掉用可变参数的方法时,编译器可该变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
增强for循环:
for(type变量名:集合变量名){...}
注意:迭代变量必须在()中定义;
集合变量可以是数组或实现iterable接口的集合类
基本数据的自动装箱和拆箱:
Integer obj = 3;装箱
System.out.println(obj + 4);小插曲:
integer i1 = 127;
integer i2 = 127;
System.out.println(i1 == i2);结果为true
当装箱的数超过127的时候呢,那么运行的结果就会
返回false。
结论:如果这个数字在一个字节之内 -128~127之间
那么都为true,比较小的整数使用的频率很高,会反复的出现,浪费内存,对象本来不怎么改变,大家都用它用不去改变他的数据,其实这是一个设计模式,叫享元模式
fiyweight
如果很多很小的对象他们有很多相同的东西,那么就可以把它变成一个对象。还有些不同的属性把他变成方法的参数,不同的属性称为对象的外部状态,不同的属性称为内部状态。
枚举:
枚举的构造方法为什么是私有的
枚举只有一个成员时,就可以作为一种单例的实现方式。
反射:
反射不是JDK1.5的新特性,在JDK1.2的时候出现的特性
概念:java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class.Date
Math 每一个类中有会产生一个字节码,每一份字节码他们就是一个Class的实例对象Date.class代表Date那个类的字节码
pl.getClass()有了对象调用getClass()方法,就可以知道他是属于那个Class
Class.forName("java.lang.String")的作用
得到这个类的字节码,
有两种情况,
1字节码已经加载到内存里了,不需要加载了,直接找到字节码返回.
2,在虚拟机里还没有字节码,于是用类加载,加载完缓存起来,同时返回刚才加载进来的字节码.
1,类型.class,例如System.class
2,对象.getClass().例如 new Date().getClass()
3,Class.forName("类名"),例如,Class、forName("java.util.Date");
9个预定义的Class对象 八个基本数据类型和void
isPrimitive() 查看是否是基本数据类型的字节码
是返回true 不是返回false
基本数据对象类型可以写成 如:Integer.TYPE 获取字节码
数组类型的class实例对象
Class.isArray();
总而言之:只要是在源程序中出现的类型,都有各自的Class实例对象,例如 int[],void
反射的概念:
反射就是把Java类中的各种成分映射成相应的java类。
一,构造方法的反射应用:Constructor类1,得到某个类所有的构造方法:
Constructor[] constructor=
Class.forName("java.lang.String").getConstructors();
2,得到某一个构造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
3,件实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)constuctor.newInstance(new StringBuffer("abc"));
二,成员变量的反射:Field类
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
//fieldY的值是多少?是5,错!
//fieldY不是对象身上的变量,而是类上的,要用它去取某个对象上对应的值。
sop(fieldY.get(pt1));
如果某个变量是私有的用getFileld()方法是不可以获取变量的,而且不可以用get()方法获取变量的值,那么我们可以用getDeclaredField();方法获取私有成员变量并且通过暴力反射的方法
来获取变量的值。
fieldX.setAccessible(true);
sop(fieldX.get(pt1));
成员方法的反射:Method类
用反射的方式得到字节码里面的方法,再拿这个方法去作用某个对象。
Method methodCharAt = String.class.getMethod("charAt",int.class);
SOP(methodCharAt.invoke(str1,1));
invoke(str1,1)表示方法对象身上的方法。
invoke(null,1)如果invoke()方法的第一个参数为null,
说明该Method对象对应的是一个静态方法.
按照1.4的语法来调用:
SOP(methodCharAt.invoke(str1,Object[]{2}));
ArrayList_HashSet的比较:
HashCode的作用?
HashCode把集合分成了若干个区域,每一个要存进来的对象可以算出一个值,根据算出来的值,把它放到相应的区域里面去。当某个对象要存进来时,先算出它的HashCode值,根据它的哈希值判断,把对象放到它所对应的区域,这样对于查找某个对象直接算出他的HashCode值,这样不用挨个去排查,直接找出对象所在的区域即可,提高了效率。
Collection collections = new HashSet();
RefectPoint pt1 = new RefectPoint(3,3);
RefectPoint pt2 = new RefectPoint(5,5);
RefectPoint pt3 = new RefectPoint(3,3);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);
pt1.y = 7;
collections.remove(pt1);
SOP(collections.size());
没改变y的值之前呢,集合中存了一个对象,因为判断了hashcode值和equals,并且移除了pt1对象了。当改变y的值之后呢,hashcode值变化了,变化了再移除pt1,这
时候pt1这个对象已经不在原来的那个区域了。这就叫做内存泄露
反射的作用--->实现框架功能
1,当我们类还没有写出来,我的源程序就已经写好了。
2,框架和工具类不同,框架是调用者,工具类是被调用者
3,HashTable,HashMap,Properties的区别。
HashMap是HashTable的一个轻量级实现,HashMap不是线程安全的,而HashTable是线程安全的。
HashMap允许key或者value为null,而HashTable是不允许的。
在效率方面:HashMap的效率略过于HashTable。
而Properties是HashTable的子类,不过Properties添加了两个方法,load()和store()可以直接导入或者将映射写入文件。另外Properties是的映射。
JavaBean
什么是javaBean,符合某种规则的一种特殊的java类。JavaBean的实例对象通常称之为值对象(value-Object。简称VO),对JavaBean进行内省操作。
1. PropertyDescriptor 对属性进行描述的类。
2. 采用便利BeanInfo的所有属性方式来查找和设置某个RefectPoint对象的X属性,在程序中吧一个类当作JavaBean来看,就是调用IntroSpecto.getBeanInfo方法,得到的BeanInfo对象封装了吧这个类当作JavaBean看的结果信息。
泛型:
1、泛型的参数类型只能是类(class)类型,而不能是简单类型。比如,是不可使用的。
2、可以声明多个泛型参数类型,比如,同时还可以嵌套泛型,例如:>3、泛型的参数类型可以使用extends语句,例如。
4、泛型的参数类型可以使用super语句,例如< T super childclass>。
5、泛型还可以使用通配符,例如<? extends ArrayList>
类加载器的委托机制:
1,引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自java.lang.ClassLoader。2,扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
3,系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。
代理类
AOP 面向方面的编程涉及到代理:A接口有c方法,类B实现A接口,原本应该是执行B类中的c方法,可现在不这样做;我声明产生B类的代理类B',由它来冒充B类的“兄弟”并“实现”A接口,对外界来说B'应该也有c方
法,可当真正调用它的时候,它会去执行与它关联InvocationHandler的invoke()方法,在这个方法里面你可以做很多事情。这样,这个请求就被“代理”到其它地方去了。
------- android培训 、 java培训 、期待与您交流! -----