基础加强的学习

 

 

 

 

 

 

      基础加强部分的学习,虽然视频数量不多,但是所讲的内容较深, 该部分视频还应该多抽时间学习。

     首先学习完后要按照张老师的要求,对英文简写要多熟记,比如 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  ,此三个类加载器以此向下继承,  对于一个类加载器加载类时,会先反向父类,父类再上查询父类,当这个父类有加载时将字节码返给子类, 如果父类没有加载过,那么子类加载器字节加载。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值