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教程 – 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教程 – 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教程 – 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泛型限制 类型参数不能实例化 不能创建类型参数的实例。例如,考虑这个类: // 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...