Java教程 第83页

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

Java 自定义异常

Java面向对象设计 – Java自定义异常 我们可以创建我们自己的异常类。 它们必须扩展现有的异常类。 <Class Modifiers> class <Class Name> extends <Exception Class Name> { } &lt;Class Name> is the exception class name. 创建一个MyException类,它扩展了java.lang.Exception类。 语法 语法如下: public class MyException extends Exception { } 异常类与Java中的任何其他类一样。通常,我们不向我们的异常类中添加任何方法。 许多有用的方法可以用来查询异常对象的状态在Throwable类中声明。 自定义异常类构造函数 通常,我们为我们的异常类包括四个构造函数。 所有构造函数将使用super关键字调用其超类的相应构造函数。 class MyException extends Exception { public MyException() { super(); } public MyException(String message) { super(message); } public MyException(String message, Throwable cause) { super(message, cause); } public MyException(Throwable cause) { super(cause); } } 第一个构造函数创建一个具有null的异常作为其详细消息。 第二个构造函数创建一个具有详细消息的异常。 第三和第四个构造函数允许您通过包装/不包含详细消息的另一个异常来创建异常。 您可以抛出类型MyException的异常。 throw new MyException("Your message goes here"); 我们可以在方法/构造函数声明中的throws子句中使用MyException类,或者在catch块中使用参数类型。 public void m1() throws MyException { } 或捕获异常类 try { }catch(MyException e) { } Throwable 下面的列表显示了Throwable类的一些常用方法。 Throwable类是Java中所有异常类的超类。此表中显示的所有方法在所有异常类中都可用。 Throwable getCause()返回异常的原因。如果未设置异常的原因,则返回null。 String getMessage()返回异常的详细消息。 StackTraceElement[] getStackTrace()返回堆栈跟踪元素的数组。 Throwable initCause(Throwable cause)设置异常的原因。有两种方法可以将异常设置为异常的原因。其他方法是使用构造函数,它接受原因作为参数。 void printStackTrace()在标准错误流上打印堆栈跟踪。 void printStackTrace(PrintStream s)将堆栈跟踪打印到指定的PrintStream对象。 void printStackTrace(PrintWriter s)将堆栈跟踪打印到指定的PrintWriter对象。 String toString()返回异常对象的简短描述。 例外 以下代码演示了对异常类使用printStackTrace()方法。 public...

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

Java 异常使用

Java面向对象的设计 – Java异常使用 访问线程的堆栈 以下代码显示了如何获取线程的堆栈帧。 Throwable对象在创建线程的点处捕获线程的堆栈。 public class Main { public static void main(String[] args) { m1(); } public static void m1() { m2(); } public static void m2() { m3(); } public static void m3() { Throwable t = new Throwable(); StackTraceElement[] frames = t.getStackTrace(); printStackDetails(frames); } public static void printStackDetails(StackTraceElement[] frames) { System.out.println("Frame count: " + frames.length); for (int i = 0; i < frames.length; i++) { int frameIndex = i; // i = 0 means top frame System.out.println("Frame Index: " + frameIndex); System.out.println("File Name: " + frames[i].getFileName()); System.out.println("Class Name: " + frames[i].getClassName()); System.out.println("Method Name: " + frames[i].getMethodName()); System.out.println("Line Number: " + frames[i].getLineNumber()); } } } 上面的代码生成以下结果。 try-with-resources块 Java 7添加了一个名为try-with-resources的新结构。 使用Java 7中的新的try-with-resources构造,上面的代码可以写成 try (AnyResource aRes = create the...

Java 接口继承-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 接口继承

Java面向对象的设计 – Java接口继承 接口可以从另一个接口继承。与类不同,接口可以从多个接口继承。 interface Singer { void sing(); void setRate(double rate); double getRate(); } interface Writer { void write(); void setRate(double rate); double getRate(); } interface Player { void play(); void setRate(double rate); default double getRate() { return 300.0; } } 一个接口使用关键字extends来继承自其他接口。关键字extends之后是以逗号分隔的继承接口名称列表。 继承的接口称为超级接口,继承接口的接口称为子接口。 接口继承其超级接口的以下成员: 抽象和默认方法 常量字段 嵌套类型 接口不从其超级接口继承静态方法。 接口可以重写它从其超级接口继承的继承的抽象和默认方法。 如果超级接口和子接口具有相同名称的字段和嵌套类型,则子接口获胜。 interface A { String s = "A"; } interface B extends A { String s = "B"; } public class Main { public static void main(String[] argv){ System.out.println(B.s); } } 以下代码显示如何重写默认方法。 interface A { default String getValue(){ return "A"; } } interface B extends A { default String getValue(){ return "B"; } } class MyClass implements B{ } public class Main { public static void main(String[] argv){ System.out.println(new MyClass().getValue());...

Java 接口实现

Java面向对象设计 – Java接口实现 实现接口 接口指定对象必须提供的协议。 类可以提供接口的抽象方法的部分实现,并且在这种情况下,类必须将自身声明为抽象。 实现接口的类使用“implements”子句来指定接口的名称。 “实现”子句由关键字implements,后跟逗号分隔的接口类型列表组成。 一个类可以实现多个接口。 实现接口的类声明的一般语法如下: <modifiers> class <class-Name> implements <comma-separated-list-of-interfaces> { // Class body goes here } 假设有一个Circle类。 public class Circle implements Shape { void draw(){ System.out.println("draw circle"); } } 实现接口的类必须重写以实现接口中声明的所有抽象方法。否则,类必须声明为abstract。 接口的默认方法也由实现类继承。 植入类可以选择不需要重写默认方法。 接口中的静态方法不会被实现类继承。 下面的代码定义了两种引用类型,一种来自Circle类,另一种来自接口类型。 Circle c = new Circle(); Shape shape = new Circle(); 变量c是Circle类型。它指的是Circle对象。 第二个赋值也是有效的,因为Circle类实现了Shape接口,而Circle类的每个对象也都是Shape类型。 实现接口方法 当一个类完全实现了一个接口时,它为所实现的接口的所有抽象方法提供一个实现。 接口中的方法声明包括方法的约束。例如,方法声明中的throws子句是​​方法的约束。 import java.io.IOException; interface Shape { void draw(double amount) throws IOException; } class Main implements Shape{ @Override public void draw(double amount) { // TODO Auto-generated method stub } } Main的代码是有效的,即使它丢弃了throws子句。当类覆盖接口方法时,允许删除约束异常。 如果我们使用Shape类型,我们必须处理IOException。 import java.io.IOException; interface Shape { void draw(double amount) throws IOException; } class Main implements Shape{ @Override public void draw(double amount) { // TODO Auto-generated method stub } public void anotherMethod(){ Shape s = new Main();...

Java 接口类型

Java面向对象设计 – Java接口类型 接口定义了一个新的引用类型。 我们可以使用接口类型来声明变量,在方法中声明参数类型,作为方法的返回类型等。 interface Shape { void draw(); } public class Main { // interface type as instance variable private Shape myShape; // interface type as parameter type for a constructor public Main(Shape s) { this.myShape = s; } // interface type as return type of a method public Shape getShape() { return this.myShape; } // interface type as parameter type for a method public void setShape(Shape s) { this.myShape = s; } public void letItSwim() { // interface type as a local variable Shape locaShape = null; locaShape = this.myShape; // interface variable can invoke methods // declared in the interface and the Object class locaShape.draw(); } } 注意 接口类型的变量是指其类实现该接口的内存中的对象。 我们可以使用接口类型的变量或直接使用接口名称来访问接口中声明的任何常量字段。 最好使用接口名访问接口的常量。常量。 我们可以使用接口类型的变量来调用接口中声明的任何方法。 接口类型的变量可以调用java.lang.Object类的任何方法。 默认情况下,接口类型的实例或静态变量将初始化为null。

Java 接口方法

Java面向对象设计 – Java接口方法 方法声明 您可以在接口中声明三种类型的方法: 抽象方法 静态方法 默认方法 在Java 8之前,您只能在接口中声明抽象方法。修饰符static和default用于分别声明静态和默认方法。 缺少静态和默认修饰符使得方法抽象。 以下是具有所有三种类型方法的接口的示例: interface AnInterface { // An abstract method int m1(); // A static method static int m2() { // The method implementation goes here } // A default method default int m3() { // The method implementation goes here } } 抽象方法声明 接口中的所有方法声明都是隐式抽象和公开的,除非它们声明为static或default。 接口中的抽象方法没有实现。 抽象方法的主体总是由分号表示,而不是一对大括号。 下面的代码声明一个名为Player的接口: public interface Player { public abstract void play(); public abstract void stop(); public abstract void forward(); public abstract void rewind(); } 播放器界面是音频/视频播放器的规范。 真实的播放器,例如DVD播放器,将通过实现播放器接口的所有四种方法来提供该规范的具体实现。 在接口中的方法声明中使用抽象和公共关键字是多余的。 上面的Player接口的声明可以改写如下,而不改变其含义: public interface Player { void play(); void stop(); void forward(); void rewind(); } 接口中的抽象方法声明可以包括参数,返回类型和throws子句。 public interface NewPlayer { boolean play(int account) throws AccountNotFoundException; boolean stop(double amount); boolean forward(double amount) throws InsufficientBalanceException; double rewind(); } 来自接口的抽象方法由实现接口的类实现,类重写它们以提供实现。 接口中的抽象方法不能声明为final。 类可以声明接口final的重写方法,表示子类不能重写该方法。 静态方法声明...

Java 接口字段

Java面向对象设计 – Java接口字段 一个接口可以有三种类型的成员: 常量字段 抽象,静态和默认方法 静态类型作为嵌套接口和类 一个接口不能有可变的实例和类变量。与类不同,接口不能被实例化。接口的所有成员都是隐式公开的。 常量字段声明 我们可以在接口中声明常量字段,如下所示。它声明一个名为Choices的接口,它有两个字段的声明:YES和NO。两者都是int数据类型。 public interface Choices { public static final int YES = 1; public static final int NO = 2; } 接口中的所有字段都是隐式的public,static和final。 Choices接口可以声明如下,而不改变其含义: public interface Choices { int YES = 1; int NO = 2; } 您可以使用点形式的形式访问界面中的字段 <interface-name>.<field-name> 您可以使用Choices.YES和Choices.NO访问Choices界面中的YES和NO字段的值。 下面的代码演示了如何使用点符号来访问接口的字段。 public class ChoicesTest { public static void main(String[] args) { System.out.println("Choices.YES = " + Choices.YES); System.out.println("Choices.NO = " + Choices.NO); } } 接口中的字段总是最终的,无论关键字final是否在其声明中使用。我们必须在声明时初始化一个字段。 我们可以使用编译时或运行时常量表达式来初始化字段。由于final字段只赋值一次,因此除了声明之外,我们不能设置接口字段的值。 以下代码显示了接口的一些有效和无效字段声明: public interface ValidFields { int X = 10; int Y = X; double N = X + 10.5; boolean YES = true; boolean NO = false; Test TEST = new Test(); } 使用接口中字段名称中的所有大写字母表示它们是常量是一种约定。 接口的字段总是公共的。

Java 接口

Java面向对象设计 – Java接口 什么是接口? Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。 在Java 8之前,一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。 接口通过抽象概念定义不相关类之间的关系。 例如,我们可以创建一个Person类来表示一个人,我们可以创建一个Dog类来表示一只狗。 人和狗都可以走路。这里的步行是一个抽象的概念。狗可以走,人也是这样。这里我们可以创建一个名为Walkable的接口来表示walk的概念。然后我们可以有Person类和Dog类来实现Walkable概念并提供自己的实现。 Person类实现了Walkable接口,并使人以人的方式走路。Dog类可以实现Walkable界面,使狗以狗的方式走路。 例子 在下面我们将使用一个例子来说明为什么我们需要接口。 假设 Person 类有一个walk()方法。 public interface Walkable { void walk(); } class Person implements Walkable { public Person() { } public void walk() { System.out.println("a person is walking."); } } class Dog implements Walkable { public Dog() { } public void walk() { System.out.println("a dog is walking."); } } 类可以在其声明中使用关键字implements实现一个或多个接口。 通过实现一个接口,类保证它将为接口中声明的所有方法提供一个实现,或者类将自己声明为抽象。 如果一个类实现了Walkable接口,它必须提供walk()方法的实现。 像类一样,接口定义了一个新的引用类型。 当定义一个新的接口(例如,Walkable)时,我们定义一个新的参考接口类型。 以下声明有效: Walkable w; // w is a reference variable of type Walkable 您不能创建接口类型的对象,因为接口是定义抽象概念。以下代码无效: new Walkable(); // A compile-time error 我们可以为一个类类型创建一个对象,但是我们可以使用一个接口类型变量来引用其类实现该接口的任何对象。 因为Person和Dog类实现了Walkable接口,所以Walkable类型的引用变量可以引用这些类的对象。 Walkable w1 = new Person(); // OK Walkable w2 = new Dog(); // OK 我们可以使用它的引用类型变量访问接口的任何成员。由于Walkable接口只有一个成员,这是walk()方法,我们可以编写如下代码: // Let the person walk w1.walk(); // Let the dog walk w2.walk(); 当调用w1上的walk()方法时,它调用Person对象的walk()方法,因为w1指的是Person对象。 当调用w2上的walk()方法时,它调用Dog对象的walk()方法,因为w2指的是Dog对象。 当使用接口类型的引用变量调用方法时,它调用它所引用的对象上的方法。 例2...

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

Java 枚举比较

Java面向对象设计 – Java枚举比较 您可以通过三种方式比较两个枚举常量: 使用Enum类的compareTo()方法 使用Enum类的equals()方法 使用==运算符 Enum类的compareTo()方法比较同一枚举类型的两个枚举常量。它返回两个枚举常量的序数差。如果两个枚举常量相同,则返回零。 例子 以下代码将打印-3,因为LOW(ordinal = 0)和URGENT(ordinal = 3)的序数的差为-3。 负值表示正在比较的常数发生在比较对象之前。 enum Level { LOW, MEDIUM, HIGH, URGENT; } public class Main { public static void main(String[] args) { Level s1 = Level.LOW; Level s2 = Level.URGENT; // s1.compareTo(s2) returns s1.ordinal() - s2.ordinal() int diff = s1.compareTo(s2); System.out.println(diff); } } 上面的代码生成以下结果。 例2 Enum类的equals()方法比较两个枚举常量的相等性。 枚举常量只等于自身。equals()方法可以在不同类型的两个枚举常量上调用。 enum Level { LOW, MEDIUM, HIGH, URGENT; } public class Main { public static void main(String[] args) { Level s1 = Level.LOW; Level s2 = Level.URGENT; System.out.println(s1.equals(s1)); } } 上面的代码生成以下结果。 我们可以使用等于运算符==来比较两个枚举常量的相等性。 ==运算符的两个操作数必须是相同的枚举类型。

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

Java 枚举主体

Java面向对象设计 – Java枚举主体 将主体添加到枚举常量 我们可以为每个枚举常量添加一个不同的体。身体可以有字段和方法。 枚举常量的主体放在其名称后面的大括号中。 如果枚举常量接受参数,其主体将遵循其参数列表。将主体与枚举常量相关联的语法如下: <access-modifier> enum <enum-type-name> { ENUM_VALUE1 { // Body for ENUM_VALUE1 goes here }, ENUM_VALUE2 { // Body for ENUM_VALUE2 goes here }, ENUM_VALUE3(arguments-list) { // Body of ENUM_VALUE3 goes here }; // Other code goes here } 例子 下面的代码用body创建了Level枚举类型。 enum Level { LOW("Low Level", 30) { public double getDistance() { return 30.0; } }, MEDIUM("Medium Level", 15) { public double getDistance() { return 15.0; } }, HIGH("High Level", 7) { public double getDistance() { return 7.0; } }, URGENT("Urgent Level", 1) { public double getDistance() { return 1.0; } }; private int levelValue; private String description; private Level(String description, int levelValue) { this.description = description; this.levelValue = levelValue; } public int getLevelValue() {...