java学习笔记

来源:互联网 发布:可视化数据分析软件 编辑:程序博客网 时间:2024/05/16 17:01

一边学习一边总结<Think in java>也就是<java编程思想>中一些有用的知识点,每天更新自己所学到的东西

1.interface中也可以有属性,不过必须是public static final的类型

2.interface中函数作用域不声明的话默认是public而不是package

3.协变返回类型

在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
注意:"协变返回(covariant return)",仅在subclass(子类)的返回类型是superclass(父类)返回类型的extension(继承)时才被容许。

class Processor{  Object process(Object input){return input;}}class MyProcess {   String process(Object input){return input.toString();}}
4.当一个类实现的多个接口中有相似的方法名,如果这二个方法名只有返回值不同那么会出错

5.可以再方法或者语句块内定义类,待遇与在外部类下定义相同

package cn.edu.nankai.innerclasstest.main;public class OuterClass {private int myField = 0;public void myFunction(){class InnerClass {InnerClass(){myField = 5;}}if(false){class InnerClassInIf{public InnerClassInIf() {myField = 6;}}}}public int getMyField(){return myField;}}
6.匿名内部类只能实现一个接口

7.方法内的匿名内部类如果要操作方法传入的参数,不是以构造函数传入的话那么就要是final类型

局部变量的生命周期与局部内部类的对象的生命周期的不一致。
内部类里面使用外部类的局部变量时,其实就是内部类的对象在使用它,内部类对象生命周期中都可能调用它,而内部类试图访问外部方法中的局部变量时,外部方法的局部变量很可能已经不存在了,那么就得延续其生命,拷贝到内部类中,而拷贝会带来不一致性,从而需要使用final声明保证一致性。

8.一个内部类可以访问多层外部类里面的字段

9.继承内部类不能访问采用默认的构造函数,必须要在构造函数中传入外部类的参数,并调用其super方法

10.继承外部类覆盖其内部类不能仅仅重新定义,这样起不到覆盖的作用

11.Collection可以使用Collection将自身初始化,但是不能知道父类的父类,可以通过显示参数解决,但是Collection.addAll(Collection target,Collection source)的方法给已经建立的Collection赋值的效果更好,速度更快

    

class Snow{}class Powder extends Snow{}class Light extends Powder{}class Heavy extends Powder{}class Crusty extends Snow{}class Slush extends Snow{}public class AsListInference{    List<Snow> snow1 = Arrays.asList(        new Crusty(),new Slush(),new Powder()     );    //    // List<Snow> snow2 = Arrays.asList(    //   new Light(),new Heavy()    //);    Collections.assAll(          snow2,new Light(),new Heavy()     );      List<Snow> snow4 = Arrays.<Snow>asLi    st(       new Light(),new Heavy());}

12.可以用Arrays.asList()将数组变为List但是这个List本质上还是固定长度的列表

13.HashSet: 采用哈希算法,存取速度快,元素是无序的

     TreeSet:元素按照字母顺序排列

     LinkedSet:元素按照插入顺序排列

14.containsAll不在乎元素的顺序,顺序不同只要包含就返回true

15.Annotation---系统内置标准注解:

    @Override:用于修饰此方法覆盖了父类的方法;

                 如果子类想覆盖父类的方法,就可以使用这个annotation,这样,如果子类中的函数名拼写错误,和想覆盖的父类不一样,这样就会提示出错误。
    @Deprecated:用于修饰已经过时的方法;

                用于声明一个方法过期了,不推荐使用,当有人使用的时候就会出现警告,如果父类中的方法使用了这个annotation,子类中的这个函数即使没有被这个annotation标记,也会被相同的对待,使用的时候也会出现警告。
    @SuppressWarnnings:用于通知java编译器禁止特定的编译警告。

                 这个annotation是有参数的,参数主要有以下的类型:

                1.deprecation:使用了不赞成使用的类或方法时的警告;

    2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 
    3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
    4.path:在类路径、源文件路径等中有不存在的路径时的警告; 
    5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告; 
    6.finally:任何 finally 子句不能正常完成时的警告; 
    7.all:关于以上所有情况的警告。

16.Annotation---元注解

               元注解就是负责注解的注解。

               1.@Target

                  作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
             取值(ElementType)有:
       1.CONSTRUCTOR:用于描述构造器
     2.FIELD:用于描述域
     3.LOCAL_VARIABLE:用于描述局部变量
     4.METHOD:用于描述方法
     5.PACKAGE:用于描述包
     6.PARAMETER:用于描述参数
     7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

                        

@Target(ElementType.TYPE)public @interface Table {    /**     * 数据表名称注解,默认值为类名称     * @return     */    public String tableName() default "className";}@Target(ElementType.FIELD)public @interface NoDBColumn {}
                  注解Table 可以用于注解类、接口(包括注解类型) 或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。

    2.@Retention,

                     作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
     取值(RetentionPoicy)有:
    1.SOURCE:在源文件中有效(即源文件保留)
     2.CLASS:在class文件中有效(即class保留)
     3.RUNTIME:在运行时有效(即运行时保留)
    

                

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Column {    public String name() default "fieldName";    public String setFuncName() default "setField";    public String getFuncName() default "getField";     public boolean defaultDBValue() default false;}
                  Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

          3.@Documented,

              @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
    4.@Inherited

             @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
  注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
        当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个      @Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

 17.Annotation---自定义注解

              定义注解格式:
            public @interface 注解名 {定义体}
              注解参数的可支持数据类型:
    1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
    2.String类型
    3.Class类型
    4.enum类型
    5.Annotation类型
    6.以上所有类型的数组

        第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;   
  第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例    如,String value();这里的参数成员就为String;  
  第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。

自定义注解1:        

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName {    String value() default "";}
自定义注解2:

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitColor {    public enum Color{ BULE,RED,GREEN};    Color fruitColor() default Color.GREEN;}

使用实例:

public class Apple {        @FruitName("Apple")    private String appleName;        @FruitColor(fruitColor=Color.RED)    private String appleColor;
    public void setAppleColor(String appleColor) {        this.appleColor = appleColor;    }    public String getAppleColor() {        return appleColor;    }        public void setAppleName(String appleName) {        this.appleName = appleName;    }    public String getAppleName() {        return appleName;    }    public void displayName(){        System.out.println("水果的名字是:苹果");    }}

18.AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息:
  方法1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
  方法2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
  方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.

  方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

         

public class FruitInfoUtil {    public static void getFruitInfo(Class<?> clazz){                String strFruitName=" 水果名称:";        String strFruitColor=" 水果颜色:";                Field[] fields = clazz.getDeclaredFields();                for(Field field :fields){            if(field.isAnnotationPresent(FruitName.class)){                FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);                strFruitName=strFruitName+fruitName.value();                System.out.println(strFruitName);            }            else if(field.isAnnotationPresent(FruitColor.class)){                FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);                strFruitColor=strFruitColor+fruitColor.fruitColor().toString();                System.out.println(strFruitColor);            }        }    }}

19.类的加载顺序和反射机制

http://blog.csdn.net/u012585964/article/details/52011138

20.回调函数

http://blog.csdn.net/xiaanming/article/details/8703708

其实所谓的回调函数就是类A继承Callback接口并且持有类B的引用,类B有一个方法可以接收Callback的参数,也就是接收A类,办完事调用A类的接口函数,A类就能得到接口函数的参数。


1 0
原创粉丝点击