Java教程 第72页

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

Java 嵌套类

Java教程 – Java嵌套类 在任何类外部声明的类是顶级类。嵌套类是声明为其他类或作用域的成员的类。 有四种嵌套类: 静态成员类 非静态成员类 匿名类 局部类 Java匿名类 匿名类是没有名称并同时声明的类。您可以实例化一个匿名类,在其中指定一个表达式是合法的。 一个匿名类实例只能访问局部最终变量和最终参数。 如何定义一个匿名类? abstract class People { abstract void speak(); } public class Main { public static void main(final String[] args) { new People() { String msg = "test"; @Override void speak() { System.out.println(msg); } }.speak(); } } 上面的代码生成以下结果。 例子 下面的代码声明和实例化一个实现接口的匿名类。 interface People { abstract void speak(); } public class Main { public static void main(final String[] args) { new People() { String msg = (args.length == 1) ? args[0] : "nothing to say"; @Override public void speak() { System.out.println(msg); } }.speak(); } } 上面的代码生成以下结果。 Java局部类 本地类是在声明局部变量的任何地方声明的类。局部类与局部变量具有相同的范围。 一个本地类有一个名称,可以重复使用。本地类实例可以访问周围范围的本地最终变量和最终参数。 Java局部类 class MyClass { void myMethod(final int x) { final int y = x; class LocalClass { int a = x; int...

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

Java 类变量

Java教程 – Java类变量 三种类型的变量 Java支持三种不同生存期的变量: 成员变量 方法局部变量 静态变量 类成员变量 在创建实例时创建类的成员变量,并且当对象被销毁时被销毁。未显式分配值的所有成员变量在声明期间自动分配一个初始值。成员变量的初始化值取决于成员变量的类型。 下表列出了成员变量的初始化值: 元素类型 初始值 byte 0 short 0 int 0 long 0L float 0.0f double 0.0d char “\u0000” boolean false 对象引用 null 在以下示例中,变量x在声明变量时设置为20。 public class Main{ int x = 20; } 如果您不设置它们,以下示例显示默认值。 class MyClass { int i; boolean b; float f; double d; String s; public MyClass() { System.out.println("i=" + i); System.out.println("b=" + b); System.out.println("f=" + f); System.out.println("d=" + d); System.out.println("s=" + s); } } public class Main { public static void main(String[] argv) { new MyClass(); } } 输出: 方法局部变量的示例 方法的自动变量在入口时创建方法,并且仅在该方法的执行期间存在。只有在执行该方法时才能访问自动变量。(此规则的一个例外是内部类)。 自动变量(方法局部变量)不由系统初始化。自动变量必须在使用前显式初始化。例如,这个方法不会编译: public class Main{ public int wrong() { int i; return i+5; } } 编译上面的代码时的输出: 类变量(静态变量) 这里只是一个类变量的一个副本,它存在,而不管该类的实例数。 静态变量在类加载时初始化; 这里,当Main类被加载时,y将被设置为30。 public class Main{ static int y = 30; } Java...

Java 类访问控制-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 类访问控制

Java教程 – Java类访问控制 我们可以控制类成员变量和方法的访问级别通过访问说明符。 Java的访问说明符是public,private,protected和默认访问级别。 级别 公共类成员可以通过任何其他代码访问。 私有类成员只能在其类中访问。 默认访问类成员没有访问说明符。 类的默认功能可以在同一个包中的任何类访问。 类的受保护特性可用于同一个包(如默认)中的所有类及其子类。 受保护的功能比默认功能更容易访问。 要了解公共和私人访问的影响,请考虑以下程序: class Test { int a; // default access public int b; // public access private int c; // private access // methods to access c void setc(int i) { c = i; } int getc() { return c; } } public class Main { public static void main(String args[]) { Test ob = new Test(); ob.a = 1; ob.b = 2; // This is not OK and will cause an error // ob.c = 100; // Error! // You must access c through its methods ob.setc(100); // OK System.out.println("a, b, and c: " + ob.a + " " + ob.b + " " + ob.getc()); } }...

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

Java 类

Java教程 – Java类 类定义了一种新的数据类型。 此新类型可用于创建该类型的对象。 类是对象的模板,对象是类的实例。 语法 类定义的一般形式如下所示: class classname { type instance-variable1; type instance-variable2; // ... type instance-variableN; type methodname1(parameter-list) { // body of method } type methodname2(parameter-list) { // body of method } // ... type methodnameN(parameter-list) { // body of method } } 使用class关键字声明一个类。 在类中定义的方法和变量称为类成员。 类中定义的变量称为实例变量因为类的每个实例都包含这些变量的自己的副本。 一个对象的数据是独立的,并且与另一个对象的数据唯一。 例子 这里有一个名为 Box 的类,它定义了三个成员变量: width , height 和 depth 。 class Box { int width; int height; int depth; } Java对象 创建类时,将创建一个新的数据类型。您可以使用此类型来声明该类型的对象。 创建类的对象是一个两步过程。 声明类类型的变量。 使用new运算符动态分配对象的内存。 以下行用于声明一个类型为Box的对象: Box mybox = new Box(); 这个语句结合了这两个步骤。 它可以像这样重写来显示每个步骤更清楚: Box mybox; // declare reference to object mybox = new Box(); // allocate a Box object 第一行声明 mybox 作为 Box 类型的对象的引用。此行执行后, mybox 包含值 null 。null表示 mybox 尚未指向实际对象。 此时尝试使用 mybox 会导致错误。 下一行分配一个实际对象并为mybox分配一个引用。第二行执行后,您可以使用mybox作为Box对象。 mybox 保存实际Box对象的内存地址。 类定义了一种新的数据类型。 在这种情况下,新类型称为 Box 。要创建...

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

Java 异常类型

Java教程 – Java异常类型 下图显示了Java异常类型层次结构: Throwable | | +---Exception. | | | | | +--- RuntimeException | +---Error 异常及其子类用于用户程序应捕获的异常条件。您可以子类化Exception以创建自己的自定义异常类型。 错误定义在正常情况下不期望捕获的异常。 Java运行时系统使用错误以指示运行时环境中的错误。 堆栈溢出是这种错误的一个例子。 未捕获异常 这个小程序包括一个有意造成除以零误差的表达式: public class Main { public static void main(String args[]) { int d = 0; int a = 42 / d; } } 以下是执行此示例时生成的异常: 例子 这里是另一个版本的前面的程序,引入相同的错误,但在一个方法与main()分开: public class Main { static void subroutine() { int d = 0; int a = 10 / d; } public static void main(String args[]) { subroutine(); } } 从默认异常处理程序生成的堆栈跟踪显示如何显示整个调用堆栈: 例2 您可以在println()语句中显示异常描述消息。 例如,catch块可以这样写: import java.util.Random; public class Main { public static void main(String args[]) { int a = 0, b = 0, c = 0; Random r = new Random(); for (int i = 0; i < 32000; i++) { try { b...

Java 异常-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 异常

Java教程 – Java异常 异常是在运行时在代码序列中出现的异常状况。例如,读取一个不存在的文件。 Java异常是描述异常条件的对象发生在一段代码中。 关键词 Java异常处理通过五个关键字管理: try,catch,throw,throws和finally。 try block包含要监视的程序语句异常。 如果在块中发生异常,则抛出异常。 catch 语句可以捕获异常并以合理的方式处理它。 要手动抛出异常,请使用关键字throw。 任何抛出的异常一个方法必须由一个 throws 子句指定。 任何代码绝对必须是在try块完成之后执行的命令被放在 finally 块中。 语法 要处理一个异常,我们把可能有的代码在try … catch语句中的异常。 try { // block of code to monitor for errors } catch (ExceptionType1 exOb) { // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) { // exception handler for ExceptionType2 } 可能有异常的程序语句包含在 try 块中。异常处理程序使用 catch 语句进行编码。 这里, ExceptionType 是发生的异常的类型。 例子 在try块和catch子句中封装要监视的代码。 下面的程序包括一个try块和一个catch子句处理由除法生成的ArithmeticException错误: public class Main { public static void main(String args[]) { int d, a; try { // monitor a block of code. d = 0; a = 42 / d; System.out.println("This will not be printed."); } catch (ArithmeticException e) { // catch divide-by-zero error System.out.println("Division by zero."); } System.out.println("After catch statement."); } } 此程序生成以下输出: 例2...

Java 异常语句-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 异常语句

Java教程 – Java异常语句 为了防止和处理运行时错误,请将代码包含在try块中进行监视。 紧跟在try块之后,包括一个catch子句它指定您希望捕获的异常类型。 Java try catch语句 public class Main { public static void main(String args[]) { try { // monitor a block of code. int d = 0; int a = 42 / d; System.out.println("This will not be printed."); } catch (ArithmeticException e) { // catch divide-by-zero error System.out.println("Division by zero."); } System.out.println("After catch statement."); } } 上面的代码生成以下结果。 多个catch子句 您可以指定两个或多个catch子句,每个捕获不同类型的异常。 当抛出异常时,将按顺序检查每个catch语句,并执行类型与异常类型匹配的第一个。 在执行一个catch语句之后,绕过其他catch语句,并在try/catch块之后继续执行。 public class Main { public static void main(String args[]) { try { int a = args.length; System.out.println("a = " + a); int b = 42 / a; int c[] = { 1 }; c[42] = 99; } catch (ArithmeticException e) { System.out.println("Divide by 0: " + e); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Array index oob: "...

Java 内置注释

Java教程 – 什么是Java内置注释 内置注释 Java定义了许多内置注释。大多数是专门的,但七是通用的。 @Retention @Documented @Target @Inherited @Override @Deprecated @SuppressWarnings @Retention @Retention被设计为仅用作另一个注释的注释。它指定保留策略。 @Documented @Documented注释是一个标记界面,它通知工具要注释标记。 @Target @Target 注释指定了声明的类型可以应用注释。 它被设计为仅用作对另一注释的注释。 @Target接受一个参数,它必须是ElementType枚举的常量。 目标常量注释可以应用于 ANNOTATION_TYPE另一个注释 CONSTRUCTOR 构造函数 FIELD 领域 LOCAL_VARIABLE 局部变量 METHOD 方法 PACKAGE 包 PARAMETER 参数 TYPE 类, 接口, 或者 枚举 您可以在@Target注释中指定一个或多个这些值。 要指定多个值,必须在括号分隔列表中指定它们。 例如: @Target( { ElementType.FIELD, ElementType.LOCAL_VARIABLE } ) @Inherited @Inherited 是一个标记注释,只能用于另一个注释声明。它只影响将在类声明中使用的注释。 @Inherited 使得超类的注释由子类继承。 @Override @Override是只能在方法上使用的标记注释。使用@Override注释的方法必须覆盖超类中的方法。 @Deprecated @Deprecated是标记注释。它表示声明已过时,并已被较新的表单替换。 @SuppressWarnings @SuppressWarnings 指定可能由编译器发出的一个或多个警告被抑制。要禁止的警告由名称以字符串形式指定。此注释可应用于任何类型的声明。

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

Java 注释

Java教程 – Java注释 注释将补充信息嵌入源文件中。注释不会更改程序的语义。 通过基于接口的机制创建注释。 以下代码声明了一个名为 MyAnno 的注释: // A simple annotation type. @interface MyAnno { String str(); int val(); } @ 在关键字接口之前。所有注释仅具有方法声明。注释不能包含extends子句。 注意 所有注释类型自动扩展注释接口。注释接口是所有注释的超级接口。注释接口在java.lang.annotation包中声明。 任何类型的声明都可以具有与其相关联的注释。例如,可以注释类,方法,字段,参数和枚举常量。注释也可以注释。在所有情况下,注释在声明的其余部分之前。 应用注释时,您可以向其成员提供值。例如,下面是一个应用于类的 MyAnno 示例: // Annotate a method. @MyAnno(str = "Annotation Example", val = 100) public class Main{} 此注释与类Main链接。 Java注释保留策略 保留策略确定在什么时候丢弃注释。 Java定义了三个这样的策略:SOURCE,CLASS和RUNTIME。 SOURCE仅保留在源文件中,并在编译期间被丢弃。 CLASS在编译期间存储在.class文件中。 它在运行时不能通过JVM。 RUNTIME存储在.class文件中,并可在运行时通过JVM使用。 通过使用Java的内置注释之一为注释指定保留策略: @Retention 其一般形式如下所示: @Retention(retention-policy) retention-policy必须是 SOURCE , CLASS 和 RUNTIME 之一。 默认策略为 CLASS 。 以下代码将保留策略指定为RUNTIME。 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface MyAnno { String str(); int val(); } 如何通过使用反射在运行时获取注释。 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; // An annotation type declaration. @Retention(RetentionPolicy.RUNTIME) @interface MyAnno { String str(); int val(); } public class Main { @MyAnno(str = "Annotation Example", val = 100) public static void myMeth() { Main ob = new...

Java 泛型限制

Java教程 – 什么是Java泛型限制 类型参数不能实例化 不能创建类型参数的实例。例如,考虑这个类: // Can"t create an instance of T. class Gen<T> { T ob; Gen() { ob = new T(); // Illegal!!! } } 静态成员的限制 没有静态成员可以使用由封装类声明的类型参数。例如,此类的所有静态成员都是非法的: class Wrong<T> { // Wrong, no static variables of type T. static T ob; // Wrong, no static method can use T. static T getob() { return ob; } // Wrong, no static method can access object of type T. static void showob() { System.out.println(ob); } } 您可以使用自己的类型参数声明静态泛型方法。 泛型数组限制 您不能实例化基本类型是类型参数的数组。您不能创建类型特定的泛型引用的数组。 以下短程序显示了两种情况: class MyClass<T extends Number> { T ob; T vals[]; MyClass(T o, T[] nums) { ob = o; vals = nums; } } public class Main { public static void main(String args[]) { Integer n[] = { 1 }; MyClass<Integer> iOb...