Java教程 第84页

Java 枚举方法-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 枚举方法

Java面向对象设计 – Java枚举方法 因为枚举类型实际上是一个类类型,所以我们可以在枚举类型体中声明一切,我们可以在类体中声明它。 以下代码使用字段,构造函数和方法定义了一个级别枚举。 public enum Level { LOW(30), MEDIUM(15), HIGH(7), URGENT(1); // Declare an instance variable private int levelValue; // Declare a private constructor private Level(int levelValue) { this.levelValue = levelValue; } public int getLevelValue() { return levelValue; } } 上面的代码声明了一个实例变量 levelValue ,它将为每个枚举常量存储一个值。 它还定义了一个私有构造函数,它接受一个int参数。它将其参数的值存储在实例变量中。 我们可以向枚举类型添加多个构造函数。 我们不能向枚举类型添加公共或受保护的构造函数。 级别枚举声明一个公共方法getLevelValue()。 枚举常量声明已更改为 LOW(30), MEDIUM(15), HIGH(7), URGENT(1); 现在每个枚举常量名称后面都跟着括号中的整数值。 LOW(30)是调用int参数类型的构造函数的缩写。 当创建枚举常量时,括号中的值将被传递给我们添加的构造函数。 LOW调用默认的无参数构造函数,而LOW(30)使用参数调用构造函数。 例子 以下代码测试Level枚举类型。它打印常量的名称,它们的序数和它们的下划线值。 enum Level { LOW(30), MEDIUM(15), HIGH(7), URGENT(1); // Declare an instance variable private int levelValue; // Declare a private constructor private Level(int levelValue) { this.levelValue = levelValue; } public int getLevelValue() { return levelValue; } } public class Main { public static void main(String[] args) { for (Level s : Level.values()) { String name = s.name(); int ordinal = s.ordinal();...

Java 枚举类-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 枚举类

Java面向对象设计 – Java枚举类 枚举类型的超类 编译枚举类型时,编译器会创建一个类。 枚举类型可以具有构造函数,字段和方法。枚举类型仅在编译器生成的代码中实例化。 每个枚举类型都隐式地扩展java.lang.Enum类。 Enum类中定义的所有方法都可以与所有枚举类型一起使用。 枚举类 下表列出了在Enum类中定义的方法。 public final String name()返回枚举常量的名称。 public final int ordinal()返回枚举常量的顺序。 public final boolean equals(Object other)如果指定的对象等于枚举常量,则返回true。否则,它返回false。 ==运算符和equals()方法返回相同的结果,当它们用于两个枚举常量。 public final int hashCode()返回枚举常量的哈希码值。 public final int compareTo(E o)将此枚举常量与指定的枚举常量进行比较。它返回此枚举常量和指定的枚举常量的序数值的差异。 public final Class getDeclaringClass()返回声明枚举常量的类的类对象。 public String toString()默认情况下,它返回枚举常量的名称,这与name()方法相同。 public static valueOf(Class enumType,String name)返回指定的枚举类型和名称的枚举常量。 例子 Level lowLevel = Enum.valueOf(Level.class, "LOW") 以下代码显示了如何比较两个枚举常量: enum Level { LOW, MEDIUM, HIGH, URGENT; } public class Main { public static void main(String[] args) { Level s1 = Level.LOW; Level s2 = Level.HIGH; // s1.compareTo(s2) returns s1.ordinal() - s2.ordinal() int diff = s1.compareTo(s2); if (diff > 0) { System.out.println(s1 + " occurs after " + s2); } else { System.out.println(s1 + " occurs before " + s2); } } } 上面的代码生成以下结果。

Java 枚举值-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 枚举值

Java面向对象设计 – Java枚举值 枚举类型定义了两件事: 枚举常量 这些常量的顺序 以下代码声明了一个名为Level的公共枚举类型,它具有四个枚举常量:LOW,MEDIUM,HIGH和URGENT。 public enum Level { LOW, MEDIUM, HIGH, URGENT; } Level枚举类型定义了四个枚举常量。 Level枚举类型的变量只能有四个值之一 – LOW,MEDIUM,HIGH和URGENT或null。 我们可以使用点符号通过使用枚举类型名称作为限定符来引用枚举常量。 以下代码将值分配给Level枚举类型的变量: Level low = Level.LOW; Level medium = Level.MEDIUM; Level high = Level.HIGH; Level urgent = Level.URGENT; 我们不能实例化枚举类型。以下代码导致编译时错误: Level badAttempt = new Level(); // A compile-time error 枚举分配顺序号 枚举类型为其所有常量分配一个顺序号,称为ordinal。 序数从零开始,在常数列表中从第一个到最后一个递增1。 第一个枚举常量赋值为零,第二个为1,第三个为2,依此类推。 分配给Level枚举类型中声明的常量的序数值为0到LOW,1到MEDIUM,2到HIGH,以及3到URGENT。 每个枚举常量都有一个与常量的标识符相同的名称。例如,级别枚举类型中的LOW常数的名称为“LOW”。 我们可以分别使用name()和ordinal()方法获取枚举常量的名称和序号。 每个枚举类型都有一个名为values()的静态方法,它按它们在正文中声明的顺序返回一个常量数组。 以下代码打印在Level枚举类型中声明的所有枚举常量的名称和序号。 enum Level { LOW, MEDIUM, HIGH, URGENT; } public class Main { public static void main(String[] args) { for (Level s : Level.values()) { String name = s.name(); int ordinal = s.ordinal(); System.out.println(name + "(" + ordinal + ")"); } } } 上面的代码生成以下结果。 枚举常量的反向查找 我们可以从名称或位置获得枚举常量的引用。使用valueOf()方法。 枚举常量的反向查找区分大小写。 我们可以使用values()方法返回的数组,通过顺序执行反向查找。 values()方法返回的数组中的值的顺序与枚举常量的声明顺序相同。 枚举常量的序数从零开始。 以下代码演示了如何反转查找枚举常量: enum Level { LOW, MEDIUM, HIGH, URGENT; } public class Main { public...

Java 枚举类型-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 枚举类型

Java面向对象设计 – Java枚举类型 什么是枚举类型? 枚举类型创建常量的有序列表作为类型。它以特定顺序指定常量。 在枚举类型中定义的常量是该枚举类型的实例。 语法 使用关键字enum使用以下语法定义枚举类型: <access-modifier> enum <enum-type-name> { // List of comma separated names of enum constants } <access-modifiers>与类的访问修饰符相同:public,private,protected或package-level。 <enum-type-name>是有效的Java标识符。 枚举类型的主体放在大括号中,名称后面。主体可以有逗号分隔的常量和其他元素的列表,例如实例变量,方法等。 大多数时候,枚举体只包括常量。 例子 下面的代码声明了一个名为Gender的枚举类型,它声明了两个常量:MALE和FEMALE: public enum Gender { MALE, FEMALE; // The semi-colon is optional } 将枚举常量命名为大写是一种惯例。 以下代码声明了一个名为Level的公共枚举类型,它具有四个枚举常量:LOW,MEDIUM,HIGH和URGENT。 public enum Level { LOW, MEDIUM, HIGH, URGENT; } 可以从应用程序中的任何位置访问公共枚举类型。 公共枚举类型保留在具有枚举类型名称的文件中。级别枚举将保存在名为Level.java的文件中。 我们需要在包中放置枚举类型,我们可以使用 import 语句导入枚举类型。 枚举变量 我们可以声明枚举类型的变量,就像声明类类型的变量一样。 以下代码声明Level枚举类型的errorLevel变量。 Level errorLevel; 您可以为枚举类型变量分配null,如下所示: Level defectLevel = null; 在switch语句中使用枚举类型 您可以在switch语句中使用枚举类型。 当switch表达式是枚举类型时,所有case标签必须是同一枚举类型的不合格枚举常量。 enum Direction { East, South, West, North } public class Main { public static void main(String args[]) { Direction dir = Direction.South; switch (dir) { case South: System.out.println("south"); break; case East: System.out.println("East"); break; case West: System.out.println("West"); break; case North: System.out.println("North."); break; } } } 上面的代码生成以下结果。 嵌套枚举类型 我们可以在类,接口或另一个枚举类型中有一个嵌套的枚举类型声明。 嵌套枚举类型是隐式静态的。因为枚举类型总是静态的,所以我们不能在方法体内声明一个局部枚举类型。 对于嵌套枚举类型,我们可以使用任何访问修饰符(public,private,protected或package)级别。 以下代码显示了如何在Person类中声明名为Gender的嵌套公共枚举类型。 class...

Java 注释反射-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 注释反射

Java面向对象设计 – Java注释反射 程序元素上的注释是Java对象。 允许您访问其注释的程序元素实现java.lang.reflect.AnnotatedElement接口。 以下类实现了AnnotatedElement接口: AnnotatedElement接口的方法用于访问以下列出的对象类型的注释。 java.lang.Class java.lang.reflect.Executable java.lang.reflect.Constructor java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Parameter java.lang.Package java.lang.reflect.AccessibleObject 注释类型必须使用运行时的保留策略通过保留元注释注释,以便在运行时访问它。 例子 假设你有一个Test类,并且你想打印它的所有注释。以下代码片段将打印Test类的类声明上的所有注释: import java.lang.annotation.Annotation; @SuppressWarnings("unchecked") @Deprecated public class Main { public static void main(String[] argv) { // Get the class object reference Class<Main> c = Main.class; // Get all annotations on the class declaration Annotation[] allAnns = c.getAnnotations(); System.out.println("Annotation count: " + allAnns.length); // Print all annotations for (Annotation ann : allAnns) { System.out.println(ann); } } } Annotation接口的toString()方法返回注释的字符串表示形式。 例2 以下代码显示了如何获取特定注释。 import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @Documented @interface Version { int major(); int minor(); } @Version(major=1,minor=2) public class Main { public static void main(String[] argv) { Class<Main> c = Main.class; Version v = c.getAnnotation(Version.class); if (v == null) { System.out.println("Version annotation is not...

Java 标准注释

Java面向对象设计 – Java标准注释 Java API定义了许多标准注释类型。 以下部分讨论了在java.lang包中定义的四种最常用的标准注释。 Deprecated Override SuppressWarnings FunctionalInterface 已弃用的注释类型 弃用的注释类型是标记注释类型。它标记了已弃用的代码元素。 使用已弃用的程序元素将导致编译器生成警告。 @Deprecate class MyClass { private MyClass() { } public static MyClass getInstance() { MyClass dt = new MyClass(); return dt; } } public class Main { public static void main(String[] args) { MyClass dt; // Generates a compile-time note } } 重写注释类型 重写注释类型是只能在方法上使用的标记注释类型。 它表示方法重写在其超类中声明的方法。 如果我们要覆盖超类中的一个方法,建议使用@Override注释注释覆盖的方法。 编译器将确保注释的方法真正覆盖超类中的一个方法。 如果注释的方法不覆盖超类中的方法,编译器将生成错误。 class A { public void m1() { } } class B extends A { @Override public void m1() { } } SuppressWarnings注释类型 SuppressWarnings用于抑制命名的编译器警告。它声明一个名为value的元素,其数据类型是一个String数组。 import java.util.ArrayList; public class Main { @SuppressWarnings("unchecked") public void test() { @SuppressWarnings("rawtypes") ArrayList list = new ArrayList(); list.add("Hello"); // The compiler issues an unchecked warning } } FunctionalInterface注释类型 具有一个抽象方法声明的接口被称为功能接口。 如果使用此注释注释的接口不是函数接口,则会生成编译时错误。 @FunctionalInterface interface MyThread{ void run(); } 只有一个抽象方法的接口是一个功能接口,不管它是否用@FunctionalInterface注释注释。...

Java 注释类型

Java面向对象设计 – Java注释类型 标记注释类型 标记注释类型是没有元素的注释类型,甚至没有默认值。 标记注释由注释处理工具使用。 public @interface Marker { } @Marker public class Main{ } 元注释类型 元注释类型是注释类型,用于注释其他注释类型。 元注释类型是Java类库的一部分。它们在包java.lang.annotation中声明。 以下注释类型是元注释类型: Target Retention Inherited Documented Repeatable Native Target注释类型 目标注释类型注释注释类型以设置上下文以使用注释类型。 它只有一个名为value的元素。其值元素是java.lang.annotation.ElementType枚举类型的数组。 下表列出了ElementType枚举中的所有常量。 常量名称 描述 ANNOTATION_TYPE 注释另一个注释类型声明。 这使得注释类型为元注释。 CONSTRUCTOR 注释构造函数。 FIELD 注释字段和枚举常量。 LOCAL_VARIABLE 注释局部变量。 METHOD 注释方法。 PACKAGE 注释包声明。 PARAMETER 注释参数。 TYPE 注释类,接口(包括注释类型)或枚举声明。 TYPE_PARAMETER 在通用类,接口,方法等中注释类型参数。 TYPE_USE 注释所有类型的使用。 以下版本注释类型具有目标元注释,其指定Version注释类型可以与仅有三种类型的程序元素一起使用:任何类型(类,接口,枚举和注释类型),构造函数和方法。 import java.lang.annotation.Target; import java.lang.annotation.ElementType; @Target({ ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD }) public @interface Version { int major(); int minor(); } 版本注释不能用于除其Target注释中指定的三种类型之外的任何程序元素。 import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target({ ElementType.TYPE_USE }) @interface MyAnno { } @Target({ ElementType.TYPE_USE }) @interface MyAnno2 { } public class Main { public void processData() throws @MyAnno Exception { int roundedValue = (@MyAnno2 int) .02; Main t = new @MyAnno Main(); } } 如果我们不与注释目标注释类型注释类型,注释类型可以用作任何声明修饰符,除了一个类型参数声明。 保留注释 保留注释设置注释类型的保留策略。 注释可以在三个级别保留。...

Java 注释用法

Java面向对象设计 – Java注释用法 注释元素的提供值必须是编译时常量表达式,我们不能使用null作为注释中任何类型元素的值。 原始类型 注释类型中的元素的数据类型可以是任何基本数据类型:byte,short,int,long,float,double,boolean和char。 Version注释类型声明两个元素,major和minor,并且都是int数据类型。 以下代码声明了注释类型: public @interface MyAnnotation { byte a(); short b(); int c(); long d(); float e(); double f(); boolean g(); char h(); } @MyAnnotation(a=1, b=2, c=3, d=4, e=12.34F, f=1.89, g=true, h="Y") 我们可以使用编译时常量表达式来指定注释元素的值。 以下两个版本注释实例有效: @Version(major=2+1, minor=(int)13.2) @Version(major=3, minor=13) String类型 我们可以在注释类型中使用String类型的元素。 以下代码定义了名为Name的注释类型。它有两个元素,first和last,它们是String类型。 public @interface Name { String first(); String last(); } @Name(first="Tom", last="Smith") public class NameTest { @Name(first="Jack", last="Iaan") public void aMethod() { } } 在String类型的元素的值表达式中使用字符串连接运算符+是有效的。 @Name(first="Ja" + "ck", last="Ia" + "an") Class类型 以下代码显示如何使用类类型作为注释值。 import java.io.IOException; @interface MyAnnotation { Class<? extends Throwable> willThrow() default java.lang.Throwable.class; } public class Main { @MyAnnotation(willThrow = IOException.class) public static void testCase1() { // Code goes here } @MyAnnotation() public static void testCase2() { } } 枚举类型 注释可以具有枚举类型的元素。 enum Level {...

Java 注释默认值

Java面向对象设计 – Java注释默认值 我们可以为注释中的元素定义默认值。我们不需要为带有默认值的注释元素提供值。 默认值可以使用以下一般语法定义: <modifiers> @interface <annotation type name> { <data-type> <element-name>() default <default-value>; } 关键字 default 指定默认值。 默认值必须是与元素的数据类型兼容的类型。 以下代码通过将其minor元素的默认值指定为零来创建Version注释类型,如下所示: public @interface Version { int major(); int minor() default 0; // zero as default value for minor } 例子 以下代码显示如何使用默认值使用注释。 @Version(major=1) // minor is zero, which is its default value @Version(major=2, minor=1) // minor is 1, which is the specified value 以下代码显示如何为数组和其他数据类型指定默认值: public @interface Version { double d() default 1.89; int num() default 1; int[] x() default { 1, 2 }; String s() default "Hello"; String[] s2() default { "abc", "xyz" }; Class c() default Exception.class; Class[] c2() default { Exception.class, java.io.IOException.class }; }

Java 对注释类型的限制

Java面向对象设计 – Java对注释类型的限制 注释类型的限制 注释类型不能从另一个注释类型继承。 每个注释类型都隐式地继承java.lang.annotation.Annotation接口,其声明如下: package java.lang.annotation; public interface Annotation { boolean equals(Object obj); int hashCode(); String toString(); Class<? extends Annotation> annotationType(); } 注释类型中的方法声明不能指定任何参数。 注释类型中的方法声明不能有throws子句。 在注释类型中声明的方法的返回类型必须是以下类型之一: 任何原始类型:byte,short,int,long,float,double,boolean和char java.lang.String java.lang.Class 枚举类型 注释类型 上述任何类型的数组,例如String[],int[]等。 返回类型不能是嵌套数组。例如,您不能具有String[][]或int[][]的返回类型。 您可以如下所示声明注释方法: public @interface MyAnnotation { Class element1(); // Any Class type Class<Test> element2(); // Only Test class type Class<? extends Test> element3(); // Test or its subclass type } 注释类型不能是泛型的。