当前位置: 首页 > news >正文

马鞍山 网站建设 有限公司无法打开建行网站

马鞍山 网站建设 有限公司,无法打开建行网站,网络营销专员岗位职责,公众号怎么推广快又有效Java泛型#xff0c;枚举#xff0c;注解 1 泛型 1.1 什么是泛型 泛型#xff1a;即参数化类型。在不创建新的类型的情况下#xff0c;通过泛型指定的不同类型来控制形参具体限制的类型。允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值…                                      Java泛型枚举注解 1 泛型 1.1 什么是泛型 泛型即参数化类型。在不创建新的类型的情况下通过泛型指定的不同类型来控制形参具体限制的类型。允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时确定。 集合类在声明阶段不能确定这个容器是存储什么类的对象在JDK1.5之前只能把元素的类型设计为ObjectJDK1.5之后采用泛型类解决。这个时候除了元素的类型不确定其他部分是确定的如元素如何保存如何管理等所以把元素的类型设计成一个参数这个类型参数就是泛型。常见的ListEArrayListE中的E就是泛型。 JDK1.5改写了集合框架中的全部接口和类为这些接口、类增加了泛型支持从而可以在声明集合变量、创建集合对象时传入类型实参。 为什么要有泛型呢 解决集合中的两个问题1元素存储的安全问题添加元素时检查添加元素的类型比如商品标签不会搞混2元素的类型转换问题泛型可以起到对类的限定作用获取数据元素时就不需要类型强制转换 。 1.2 泛型的特性 泛型只有在编译阶段有效在编译期正确检验泛型结果后将泛型的相关信息擦除并在对象进入和离开方法的边界处添加类型检查和类型装换方法不会进入到运行时阶段 ListString string1 new ArrayListString(); ListInteger integer1 new ArrayListInteger();Class classString1 string1.getClass(); Class classInteger1 integer1.getClass();if(classString1.equals(classInteger1)){System.out.println(类型相同) } //输出结果为类型相同 1.3 泛型的使用 泛型类用于类的定义中 //此处T为任意标识常见的如T、E、K、V等形式的参数常用于表示泛型,在实例化泛型类时必须指定T的具体类型 public class DaoT {//name这个成员变量的类型为T,T的类型由外部指定private T name;//泛型构造方法形参的类型也为TT的类型由外部指定public Dao(T name) {this.name name;}//添加,方法的形参值类型为TT的类型由外部指定public void add(T u) {//添加数据 }//查询多个public ListT query() {//查询数据库return null;}//修改public boolean modificate(T u) {//修改操作return true;} } 在使用泛型的时候传入泛型实参根据传入的实参做相应的限制如果不传入泛型的实参在泛型类中使用泛型的方法或成员变量定义的类型可以为任意类型。 Dao d1 new DaoString; Dao d2 new Dao9; Dao d3 new Dao6.6; 注意泛型的类型参数只能是类类型不能是简单类型不能对确切的泛型类型使用instanceof操作。 if(values instanceof ListT) { //这是错误的应该是(values instanceof List)ListT list (ListT)values;return list; } 泛型接口泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中 public interface GenericityT {//添加void add(T u);//查询多个ListT getUser();//修改boolean updateUser(T u);}泛型方法调用方法决定参数返回值或类型。格式[访问权限] 泛型 返回值类型 方法名([泛型标识 参数名称]) 泛型类是在实例化类的时候指明泛型的具体类型泛型方法是在调用方法的时候指明泛型的具体类型 。 public class DaoT{String T name;//定义泛型方法 //public 与 返回值中间T非常重要可以理解为声明此方法为泛型方法。//T表明该方法将使用泛型类型T此时才可以在方法中使用泛型类型T。public T E[] show(T[] e) {return e;}//在泛型类中声明了一个泛型方法使用泛型E这种泛型E可以为任意类型。可以类型与T相同也可以不同。由于泛型方法在声明的时候会声明泛型E因此即使在泛型类中并未声明泛型编译器也能够正确识别泛型方法中识别的泛型。public E void show_3(E t){System.out.println(t.toString());}public S,E E show3(S s,E e) {return e;}/** * 这才是一个真正的泛型方法。* 首先在public与返回值之间的T必不可少这表明这是一个泛型方法并且声明了一个泛型T* 这个T可以出现在这个泛型方法的任意位置.* 泛型的数量也可以为任意多个 * 如public T,K K showKeyName(GenericT container){* ...* }*///虽然在方法中使用了泛型但是这并不是一个泛型方法。这只是类中一个普通的成员方法只不过他的 返回值是在声明泛型类已经声明过的泛型。所以在这个方法中才可以继续使用 T 这个泛型。public T getName(){return Name;}//这个方法显然是有问题的在编译器会给我们提示这样的错误信息cannot reslove symbol E因为在类的声明中并未声明泛型E所以在使用E做形参和返回值类型时编译器会无法识别。public E setName(E Name){this.Name Name;}*/}//这也不是一个泛型方法这就是一个普通的方法只是使用了DaoNumber这个泛型类做形参而已。public void showNameValue1(DaoNumber obj){}//这也不是一个泛型方法这也是一个普通的方法只不过使用了泛型通配符?//同时这也印证了泛型通配符章节所描述的?是一种类型实参可以看做为Number等所有类的父类public void showKeyName2(Dao? obj){}/*** 这个方法是有问题的编译器会为我们提示错误信息UnKnown class E * 虽然我们声明了T,也表明了这是一个可以处理泛型的类型的泛型方法。* 但是只声明了泛型类型T并未声明泛型类型E因此编译器并不知道该如何处理E这个类型。public T T showKeyName(DaoE container){...} */} 泛型方法与可变参数 public T void printMsg( T... args){for(T t : args){System.out.println(t is t);} } 静态方法与泛型。如果静态方法要使用泛型的话必须将静态方法也定义成泛型方法 。 public class StaticGeneratorT {/*** 如果在类中定义使用泛型的静态方法需要添加额外的泛型声明将这个方法定义成泛型方法* 即使静态方法要使用泛型类中已经声明过的泛型也不可以。* 如public static void show(T t){..},此时编译器会提示错误信息StaticGenerator cannot be refrenced from static context*/public static T void show(T t){} } 1.4 泛型通配符 Ingeter是Number的一个子类但是ListIngeter和ListNumber是平行关系ListIngeter不能看做是ListNumber的子类。因此通配符产生了。类型通配符一般是使用代替具体的类型实参而不是类型形参 。可以把看成所有类型的父类。是一种真实的类型。 1.5 泛型继承关系 1List? 是ListA,ListB等类型的父类ListA和ListB是平行关系 2List? 可以遍历但不可以修改 3List? extends Number 可以小于或等于Number 4List? super Number 可以大于或等于Number 2 枚举 枚举的全称为 enumeration用于创建有限个对象。创建枚举类型要使用 enum 关键字。枚举类型符合通用模式 Class EnumE extends EnumE而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中在这里每个值的名称都被转换成一个字符串并且序数设置表示了此设置被创建的顺序。 在什么情况下适合用枚举在一个类的对象有限且固定的时候如星期Monday(星期一)、......、Sunday(星期天) 。当需要定义一组常量时强烈建议使用枚举类 2.1 枚举类 枚举类的实现JDK1.5之前需要自定义枚举类。JDK 1.5 新增的 enum 关键字用于定义枚举类 。 为什么不用静态常量代替枚举1类型不安全如定义一个季节的int类型的静态常量开发者可以传入任何int类型的参数如果是枚举类型的话就只能传入枚举类型的类中包含的对象2没有命名空间开发者要在命名的时候加个见名知意的前缀才知道这四个常量分别代表季节。 若枚举只有一个对象, 则可以作为一种单例模式的实现方式。枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰。枚举类的使用 private final 修饰的属性应该在构造器中为其赋值。若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数 1自定义枚举类 /*** 步骤:* 1 私有化类的构造器保证不能在类的外部创建其对象* 2 在类的内部创建枚举类的实例。声明为public static final* 3 对象如果有实例变量应该声明为private final并在构造器中初始化*/class TestEnum {private final String name;private TestEnum(String name) {this.name name;}public static final TestEnum SPRING new TestEnum(春天);public static final TestEnum SUMMER new TestEnum(夏天);public static final TestEnum AUTUMN new TestEnum(秋天);public static final TestEnum WINTER new TestEnum(冬天); } 2使用enum定义枚举类 注意①使用 enum 定义的枚举类默认继承了 java.lang.Enum类因此不能再 继承其他类②枚举类的构造器只能使用 private 权限修饰符 ③枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的 实例系统会自动添加 public static final 修饰④必须在枚举类的第一行声明枚举类对象。 枚举类可以定义属性和方法可以是静态的也可以是非静态的。例子如下 public enum TestEnum {SPRING(春季),SUMMER(夏季),FALL(秋季),WINTER(冬季);private final String name; private TestEnum(String name){this.name name;}public String getName() {return name;} } 注意1第一行写枚举类实例的时候默认是调用了构造器的2构造器需定义成私有的就不能在在其他类中生成该对象3枚举类应该要设计成不可变类所以字段用private final修饰。 2.2 枚举实现接口 枚举实现接口与普通类是一样的可以实现一个也可以实现多个需要重写接口中的方法如果没有完全实现需要定义成抽象的可以不需要显示添加abstract修饰系统会默认加上。 public enum TestEnum implements Paly {SPRING(春季),SUMMER(夏季),FALL(秋季),WINTER(冬季);private final String name; private TestEnum(String name){this.name name;}public String getName() {return name;}Overridepublic void setPaly() {System.out.println(实现接口);} } interface Paly { public void setPaly(); } 上述代码只是为了说明枚举的功能重点在下面的代码。枚举的常量值本质就是枚举对象那么我们可以采用匿名内部类。 public enum TestEnum implements Paly {SPRING(){Overridepublic void setPaly() {System.out.println(春季踏青);} },SUMMER(){Overridepublic void setPaly() {System.out.println(夏季游泳);} },FALL(){Overridepublic void setPaly() {System.out.println(秋季收获);} },WINTER(){Overridepublic void setPaly() {System.out.println(冬季堆雪人);} }; } interface Paly { public void setPaly(); } 2.3 Switch语句中的枚举 Java5新增了enum关键字同时扩展了switchcase表达式中直接写入枚举值不需加入枚举类作为限定。 public class TestEnumSwitch {public void play(TestEnum t){switch(t){case SPRING:System.out.println(春);break;case SUMMER:System.out.println(夏);break;case FALL:System.out.println(秋);break;case WINTER:System.out.println(冬);break;}} } 3 注解 从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是Annotation(注解) 。 什么是注解Java 注解用于为 Java 代码提供元数据。作为元数据注解不直接影响你的代码执行但也有一些类型的注解实际上可以用于这一目的。简单的理解为代码的一个特殊标记可以在编译加载运行时读取程序可以在不改变原有的代码的基础上可以在文件嵌入补充信息。 注解可以修饰包类方法构造器参数局部变量。这些信息被保存在 Annotation的“namevalue” 对中。 3.1 注解的定义 注解通过 interface关键字进行定义和 classs 和 interface 一样注解也属于一种类型。自定义注解自动继承了java.lang.annotation.Annotation接口。 Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组。 public interface MyAnnotation { } 注解的的使用方法是在类定义的地方的上面加上MyAnnotation如下 MyAnnotation public class Test { } 注解的属性也叫做成员变量。注解只有成员变量没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明其方法名定义了该成员变量的名字其返回值定义了该成员变量的类型。注解中属性可以有默认值默认值需要用 default 关键值指定 Target({TYPE, FIELD, METHOD}) Retention(RetentionPolicy.RUNTIME) public interface MyAnnotation {String name();int age() defalut 20; } 随属性赋值的方式是在注解的括号内以 value 形式多个属性之前用 隔开。如下 MyAnnotation(nameaa,age18) public class Test {} 注意如果一个注解内仅仅只有一个名字为 value 的属性时应用这个注解时可以直接接属性值填写到括号内。要是没有任何属性的话可以把括号省略 public interface MyAnnotation {String name(); }MyAnnotation(cc) public class Test{ } ------------------------------------public interface MyAnnotation { }MyAnnotation public class Test{ } 3.2 常见注解使用案例 1生成文档相关的注解 author标明开发该类模块的作者多个作者之间使用,分割 version  标明该类模块的版本see参考转向也就是相关主题since从哪个版本开始增加的param对方法中某参数的说明如果没有参数就不能写return对方法返回值的说明如果方法的返回值类型是void就不能写exception对方法可能抛出的异常进行说明如果方法没有用throws显式抛出的异常就不能写其中 param return 和 exception 这三个标记都是只用于方法的。param的格式要求param 形参名形参类型 形参说明 return 的格式要求return 返回值类型返回值说明exception的格式要求exception 异常类型异常说明param和exception可以并列多个 /*** author zs* version 1.0* see String*/ public class DocAnnotation {/*** param args String[] 命令行参数*/public static void main(String[] args) {}/**** param name 名称* return String*/public static String getName(String name){return My name is name;} } 2在编译时进行格式检查(JDK内置的三个基本注解) Override限定重写父类方法, 该注解只能用于方法Deprecated用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择SuppressWarnings抑制编译器警告 public class AnnotationTest {public static void main(String[] args) {SuppressWarnings(unused)String str zs;}Deprecatedpublic void deprecatedMethod(){System.out.println(已过时);}Overridepublic String toString(){return 重写;} } 3跟踪代码依赖性实现替代配置文件功能 Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署 WebServlet(/login) public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} } 代替 servletservlet-nameLoginServlet/servlet-nameservlet-classcom.servlet.LoginServlet/servlet-class /servletservlet-mappingservlet-nameLoginServlet/servlet-nameurl-patternLoginServlet/url-pattern /servlet-mapping 3.3 元注解 元注解就是可以注解到注解上的注解也可以理解为元注解是一种基本注解但是它可以运用到其他注解上。 元注解有Target,Retention,Documented,Inherited,Repeatable 5种 1Targettarget是目标的意思Target指定注解可以运用的地方。他的取值如下 例Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) ElementType.TYPE给一个类型进行注解比如类、接口、枚举ElementType.FIELD可以给属性进行注解ElementType.METHOD可以给方法进行注解ElementType.PARAMETER 可以给一个方法内的参数进行注解ElementType.CONSTRUCTOR可以给构造方法进行注解ElementType.LOCAL_VARIABLE可以给局部变量进行注解 ElementType.ANNOTATION_TYPE 可以给一个注解进行注解ElementType.PACKAGE可以给一个包进行注解 2Retentionretention的意思为保留Retention指定注解的存活时间他的取值如下 例Retention(RetentionPolicy.SOURCE)RetentionPolicy.SOURCE注解只在源码阶段保留在编译器进行编译时它将被丢弃忽视。RetentionPolicy.CLASS注解只被保留到编译进行的时候它并不会被加载到 JVM 中。RetentionPolicy.RUNTIME注解可以保留到程序运行的时候它会被加载进入到 JVM 中所以在程序运行时可以获取到它们。 3Documented他的作用是能够将注解中的元素包含到 Javadoc 中去。 4InheritedInherited的意思为继承。他的作用是如果一个超类被一个被Inherited注解注解过的注解进行注解的话如果子类没有被任何注解应用子类就继承了超类的注解。 Inherited Retention(RetentionPolicy.RUNTIME) interface Inherit {}Inherit public class A {} public class B extends A {}//注解Inherit被Inherited 修饰之后类A被Inherit注解,类B继承A,类B也拥有Inherit这个注解。 5Repeatablerepeatable是可重复的意思jdk1.8才加进来的。在需要对同一种注解多次使用时往往需要借助Repeatable。比如人有多中身份把身份当成注解 //先声明一个Persons类用来包含所有的身份 interface Persons {Person[] value(); }//Repeatable 注解了 Person。而 Repeatable 后面括号中的类相当于一个用来保存该注解内容的容器。 Repeatable(Persons.class) interface Person{String role default ; }//声明一个People类给该类加上一些身份。 Person(roleson) Person(rolefather) Person(roleCEO) public class People{}3.3 java预置的注解 1Deprecated用来标记过时的元素。 2Override提示子类要复写父类中被 Override 修饰的方法业可以做检查编译器可以给你验证Override下面的方法名是否是你父类中所有的,如果没有则报错比如你如果没写Override而你下面的方法名又写错了,这时你的编译器是可以通过的。 3SuppressWarnings阻止警告 4SafeVarargs参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生 unchecked 这样的警告。 5FunctionalInterface函数式接口注解jdk1.8新特性 3.4 注解的提取 注解通过反射获取。首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解然后通过 getAnnotation() 方法来获取 Annotation 对象返回指定类型的注解或者是 getAnnotations() 方法返回注解到这个元素上的所有注解 3.5 自定义注解 public class TestPerson {public static void main(String[] args) {Test1.show(Test1.class);} } Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) Retention(RetentionPolicy.RUNTIME) interface Person{String name() default aa; //default aa 默认值 int age() default 18; //default 18 默认值 } Person(nameli,age20) class Test1{public static void show(Class c) {System.out.println(c.getName()); //Test1类的全路径Person p (Person)c.getAnnotation(Person.class);System.out.println(name:p.name(),age:p.age());} }
http://www.zqtcl.cn/news/608561/

相关文章:

  • 教做糕点的网站工作计划范文
  • dw自己做网站需要什么黄骅贴吧足疗
  • 稻香村网站建设网站建设制作 优帮云
  • 简单的网站作业seo关键词搜索和优化
  • 个人域名备案网站名称例子龙岩网站制作公司
  • 深圳专门做网站的公司电子商务网站推广目的分为
  • 政协网站法治建设版块设计头像 制作 免费
  • wordpress 去除下划线成都seo公司排名
  • 网站移动页面怎么做万网域名管理入口
  • 吴桥网站建设公司wordpress 不收录设置
  • 长安网站建设工作总结信息安全网站建设方案书
  • seo公司网站wordpress 功能块
  • 手机网站分辨率做多大做羞羞的网站
  • 网站挂到国外服务器地址重庆网络公司排行榜
  • 网站seo诊断优化方案好网站的建设标准
  • 惠东县网站建设WordPress版本识别
  • 网站服务器信息查询宝塔系统怎么建设网站
  • 企业做网站需要提供什么资料桂林微物网络科技有限公司
  • 网站建设淘宝评价学校门户网站
  • 网页制作与网站管理amp 网站开发
  • 青岛手机网站建设公司房屋装修预算明细表格
  • 企业内部网站设计手机网站建设费用价格
  • 苏州高端网站建设公司建筑人才网报名平台
  • 商品网站开发需求表乐清公共
  • 省级示范校建设网站网站制作企业有哪些公司
  • 单位做网站怎么做510企业网站系统源码
  • 福建人力资源建设网站未成年在线观看视频播放免费
  • 网站站内logo怎么做朋友圈广告30元 1000次
  • 绍兴做网站北京做公司网站
  • 青浦区网站建设公司商丘网站建设费用