基础加强部分的学习,虽然视频数量不多,但是所讲的内容较深, 该部分视频还应该多抽时间学习。
首先学习完后要按照张老师的要求,对英文简写要多熟记,比如 IDE,java EE,等等这些简写,要能写出英文全称。 在这部分的视频中,张老师主要讲解了部分JDK1.5以来的新特性,和其他高新技术。
1、可变参数:
例: 函数名(int...args ) 这里args 默认为一个数组,所以有 args.lenth,int 是数据类型。
2、增强 for:
for(类型 变量名 :数组名或集合) 这里的集合必须是实现了Iterable接口的集合,也就是可以迭代的,对于Map 集合是不行的。
例: for(int a : arr) 这是在int[] arr 数组中循环取出数据。
3、 自动装箱:
Integer obj1=3;
Integer obj2=obj1+2; 这里涉及到自动拆箱和自动装箱
特殊: Integer t1=128; Integer t2=128; System.out.prntln(t1==t2);------------> flase
Integer t3=127; Integer t4=127; System.out.println(t3==t4);---------------.>true
解释:这里的t1 和t2 指向同一个对象, 在新特性中,若数值超过一个字节的范围(-128---127),则自动开辟新空间。若在此范围中,则不开辟新空间,只是讲指向已存在的数据。 所以 t1 和 t2 就是指向两个不同的对象。
因为这个数据对象较小,所以使用的频率可能会高, 正如很多小的对象,这些对象有些相同的属性,将这些属性提取出来, 在新创建时,只创建一个指向即可,这种设计模式就叫: 享元设计模式。
4、枚举(enum)
枚举类作为一个抽象类
例: public enum TrafficLamp
{
RED ,GREEN,YELLOW; //三个对象元素
public abstract TrafficLamp nextLamp();
}
||
||
public enum TrafficLamp
{
RED (time 1) { public TrafficLamp nextLamp() { return GREEN; }} // 新建对象的同时,对抽象函数重写。
GREEN(time 2) { public TrafficLamp nextLamp() { return YELLOW; }}
YELOW(time 3) { public TrafficLamp nextLamp() { return RED; }}
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp( int time) // 构造函数, 灯亮的时间
{ this.time=time ;}
}
5、 反射 (非1.5新特性)
学习反射要先从 Class 类入手,该类是描述java类的 类,是反射的基石。
三种得到类字节码的方法:
》类名.class String.class
》对象.getClass String str="adb"; str.getClass();
》Class.forName("类名") Class.forName("java.lang.String");
Class cla1=String.class; cla1就是 String经过编译后加载到内存中的字节码。
对于8个基础数据类型:int 、char、float、 short 、double、long、boolean ,例:int.class==Integer.TYPE;
总之:只要是在源程序中出现的类型,例如 int[ ],void 等都有各自的Class 实例 对象。
反射: 将类的各个成分映射 到各自的类中。 比如:类中有方法, 则能映射到 Method 类中。 Constructor 类 表示类中的构造方法。
假如:String 类中一个构造函数: String ( StringBuffer sbuf,int x)
那么通过反射获取该构造函数的方法:: Constructor constructor =String.class.getConstructor(StringGuffer.class , int.class )
再例 String 类的 String (int a) 这个构造函数 -----> Constructor constructor =Class.forName("java.lang.String").getConstructor(int.class) //都是要先获得这个String 类的字节码,然后通过 getConstructor ()这个方法获取。
再例::新建一个以 StringBuffer为参数的String 对象。
1、获得这个构造函数
Constructor constructor =String.class.getConstructor(StringGuffer.class );
2、通过该构造函数 的 newInstance()方法初始化对象
String str =(String) constructor .newInstance(new StringBuffer("abc"));
这里为什么要用 强制转换? 因为,编译器在编译是严格按照语法进行编译, 并不知道等号右边的结果是个String类型的数据, 这里就要告诉编译器 右边也是一个String类型的,才能编译通过。 所以 思想中要把 编译 和 运行 区分开对待。
以上创建 对象都是通过先获取 构造函数, 然后再用构造函数的 newInstance() 方法初始化对象 , 然而 Class 中也有newInstance(),方法, 直接通过类的字节码创建的对象,说明该构造函数无参。
--------------------------------------------
Method 类
对象中方法的类。
例:得到 String 中的charAt(int index) 方法
String str="abc";
Method method=String.class.getMehod("charAt",int.class); 括号里要写上函数名和 参数类型。
运用该方法::method.invoke(str,2); 结果:c;
------------------------
知识点:HashSet 中的 hashCode
对于在HashSet 中是按照hash值来存储的和查找的。当一个对象存入之后,再对对象中进行修改,那么它的hash值就不一样了,此时要是再从set集合中查找删除该对象,就会找不到,那么这个找不到的对象就会一直占用内存。这又叫做内存泄露
6、 JavaBean
javaBean 是一个特殊的类,主要用于传递信息,这类中的方法主要用于访问私有字段,且方法的命名符合一定的规则,比如 getxx(), setxx()。 这里 的xx 就是javaBean 类的属性。
JDK中对javaBean进行操作的API,这套API就称为内省(Introspector)
若在两个模块间传递多个信息,可以将这些信息封装到一个javaBean中,这种javaBean的实例对象通常称为“值对象”。(Value-Object VO).
7、 注解 (新特性)
annotation: 注解,注释,释文
@SuppressWarnings(" ") 不让发出 ....的警告
@Deprecated 过时
@Override 覆盖,
@Retention(参数) ,注释有效期 ,这里的参数: RetentionPolicy.SOURCE、RetentionPolicy.CLASS 、RetentinPolicy.RUNTIME
因为注释会有有效阶段:java 源文件---------class 文件----------------------内存中的字节码 分别对应上面三个参数。
8、泛型
例: ArrayList<String> list1=new ArrayList<String>();
ArrayList<Integer> list2=new ArrayList<Integer>();
但是编译器在编译带有类类型说明的集合时,会去掉 类型 信息, 使程序运行效率不受影响,对于参数化的泛型类型, getClass()方法的返回值和原始类型一样。这里是由于编译器生成字节码时会去掉泛型信息。 所以只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据。
所以就有:list1.getClass()==list2.getClass();
知识点::参数化类型不考虑类型参数的继承关系
Vector<String> v=new Vector<Object>(); 错误
Vector<Object> v=new Vector<String>(); 错误
9、类加载器
系统中的三个基本类加载器:BootStrap 、ExtClassLoader 、 AppClassLoader ,此三个类加载器以此向下继承, 对于一个类加载器加载类时,会先反向父类,父类再上查询父类,当这个父类有加载时将字节码返给子类, 如果父类没有加载过,那么子类加载器字节加载。