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类就能得到接口函数的参数。
- Java学习笔记--CSS笔记
- Java学习笔记001
- Java 学习笔记
- java 学习笔记
- Java学习笔记
- java 学习笔记
- java学习笔记
- java学习笔记
- java学习笔记-1
- java虚拟机学习笔记
- java虚拟机学习笔记
- java虚拟机学习笔记
- Java学习笔记1
- Java学习笔记2
- java学习笔记(1)
- java学习笔记#2
- java学习笔记1
- java 学习笔记
- shell文本过滤编程(八):awk之内置函数
- 初学ViewPager+Fragment的时候,app包中的fragment和v4包中的fragment的使用常常出现混乱,现在总结一下
- 你有必要知道的 25 个 JavaScript 面试题
- SVN提交代码提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解决办法
- Python找不到Enum
- java学习笔记
- rapidjson 使用
- iOS自定义控件_CustomTextView
- Android Framework探索
- 排序算法复习(1)-- 快速排序
- 第三方库管理工具 cocoapods的介绍和安装
- JSR 133 in Public Review Blog
- spring boot 报错 Unable to start embedded container;
- Android 自定义圆形进度条