Java面向对象设计 – Java final关键字 final关键字不允许修改或替换其原始值或定义。 final关键字可以在以下三个上下文中使用: 变量声明 类声明 方法声明 final 变量 如果一个变量被声明为final,它只能被赋值一次。最终变量的值在设置后不能修改。 变量声明包括局部变量的声明,方法/构造函数的形式参数,实例变量和类变量。 变量声明包括局部变量的声明,方法/构造函数的形式参数,实例变量和类变量。 final int YES = 1; 我们可以只设置一次final变量的值。 有两种方法来初始化final变量: 在声明时予以初始化。 将其初始化延迟到稍后的时间。 但是,我们必须在第一次读取最终变量之前初始化它。 final局部变量 你可以声明一个局部变量final。如果将局部变量声明为空的最终变量,则必须在使用前初始化它。 final参数 我们可以声明一个参数final。当调用方法或构造函数时,参数将使用实际参数的值自动初始化。 因此,您不能更改方法或构造函数体内的最终形式参数的值。 final实例变量 我们可以声明一个实例变量final和blank final。 空白最终实例变量必须初始化一次,并且只有在调用类的任何构造函数时才初始化一次。 final类变量 我们可以声明一个类变量final和blank final。我们必须在其中一个静态初始化器中初始化一个空的最终类变量。 final引用变量 引用变量存储对象的引用。最终引用变量意味着,一旦引用一个对象(或null),它就不能被修改以引用另一个对象。 以下代码显示了test2()方法的最终形式参数x: public void test2(final int x) { 如果我们有一个类的多个静态初始化器,我们必须在一个静态初始化器中初始化所有空的最终类变量一次。 public class Main { public static final int YES = 1; public static final int NO = 2; public static final String MSG; static { MSG = "final static variable"; } } final 类 如果一个类被声明为final,它不能被扩展(或子类化)。 final 方法 如果一个方法声明为final,它不能在包含该方法的类的子类中重新定义(覆盖或隐藏)。
Java面向对象设计 – Java varargs方法 术语“varargs”是“可变长度参数”的缩写。 varargs声明一个接受可变数量的参数(或参数)的方法或构造函数。 声明varargs方法 要声明varargs,在方法参数的数据类型之后添加一个省略号 ... 。 下面的代码显示了一个带有一个可变长度参数num的max()方法声明,它是int数据类型。 public static int max(int... num) { } 省略号之前和之后添加空格是可选的。 varargs方法可以有多个参数。下面的代码显示aMethod()接受三个参数,其中一个是可变长度参数: public static int aMethod(String str, double d1, int...num) { } varargs方法最多可以有一个可变长度参数。 varargs方法的variable-length参数必须是参数列表中的最后一个参数。 void m2(String str, int...n1) { } 例子 让我们重写max()方法,使其成为varargs方法: public class Main { public static int max(int... num) { int max = Integer.MIN_VALUE; for (int i = 0; i < num.length; i++) { if (num[i] > max) { max = num[i]; } } return max; } } 使用varargs方法 我们可以使用for循环来处理可变长度参数的参数列表。 length属性给出了为variable-length参数传递的值的数量。 要获取可变长度参数中的第n个值,您需要使用varArgsName [n-1]。 我们可以使用foreach循环来处理可变长度参数。 public class Main { public static int max2(int... num) { int max = Integer.MIN_VALUE; for (int currentNumber : num) { if (currentNumber > max) { max = currentNumber; } } return max; } } 我们可以调用Main.max()方法如下: int...
Java面向对象设计 – Java实例/静态方法 类可以有两种类型的方法:实例方法和类方法。实例方法和类方法也分别称为非静态方法和静态方法。 实例方法用于实现类的实例的行为。实例方法只能在类的实例的上下文中调用。 类方法用于实现类本身的行为。类方法总是在类的上下文中执行。 静态修饰符用于定义类方法。方法声明中缺少静态修饰符,使得该方法成为一个实例方法。 例子 以下是声明一些静态和非静态方法的示例: // A static or class method static void aClassMethod() { } // A non-static or instance method void anInstanceMethod() { } 注意 当调用类的静态方法时,该类的实例可能不存在。因此,不允许从静态方法内部引用实例变量。 类定义一加载到内存中,类变量就存在。类定义在创建类的第一个实例之前加载到内存中。 类方法或静态方法只能引用类的变量或类的静态变量。实例方法或非静态方法可以引用类变量以及类的实例变量。 以下代码演示了在方法中可访问的类字段的类型。 public class Main { static int m = 100; // A static variable int n = 200; // An instance variable // Declare a static method static void printM() { /* * We can refer to only static variable m in this method because you are * inside a static method */ System.out.println("printM() - m = " + m); } // Declare an instance method void printMN() { /* We can refer to both static and instance variables m and n in this method */...
Java面向对象设计 – Java方法重载 在同一类中具有多个具有相同名称的方法称为方法重载。 类中具有相同名称的方法可以是声明的方法,继承的方法或两者的组合。 重载方法必须具有不同数量的参数,不同类型的参数或两者。 方法的返回类型,访问级别和throws子句对使其成为重载方法没有任何影响。 import java.io.IOException; class MyClass { public void m1(int a) { // Code goes here } public void m1(int a, int b) { // Code goes here } public int m1(String a) { // Code goes here return 0; } public int m1(String a, int b) throws IOException { // Code goes here return 0; } } 例子 下面的代码显示了如何使用重载。 public class Main { public double add(int a, int b) { System.out.println("Inside add(int a, int b)"); double s = a + b; return s; } public double add(double a, double b) { System.out.println("Inside add(double a, double b)"); double s = a + b; return s; } public static void main(String[] args) { Main ot =...
Java面向对象设计 – Java导入 导入声明用于将任何类型导入编译单元。 导入声明出现在包声明之后,第一个类型声明之前。 有两种类型的导入声明: 单类型导入声明 按需导入声明 单类型导入声明 单类型导入声明用于从包导入单个类型。它是形式。 import <fully qualified name of a type>; 以下导入声明从com.w3cschool包导入Dog类: import com.w3cschool.Dog; 单类型的导入声明只从包中导入一个类型(一个类)。 要从包中导入多个类型,请为每个类型使用单独的导入声明。 以下导入声明从pkg1包导入ClassOne,从pkg2包导入ClassTwo和ClassThree,以及从pkg3包导入ClassFour: import pkg1.ClassOne; import pkg2.ClassTwo; import pkg2.ClassThree; import pkg3.ClassFour; 以下代码使用Dog类的完全限定名称。 public class Main{ public static void main(String[] args) { com.w3cschool.Dog jack; // Uses full qualified name for the Dog class } } 以下代码显示如何使用单类型import语句将com.w3cschool.Dog类导入到其简单名称。 修改后的Main类声明如下: import com.w3cschool.Dog; // Import the Dog class public class Main { public static void main(String[] args) { Dog jack; // Use simple name of the Dog class } } 当编译器在语句中遇到Dog类的简单名称时,就像 Dog jack; 它将通过所有导入声明将简单名称解析为完全限定名称。 当它尝试解析简单名称Dog时,它会找到导入声明import com.java2s.Dog,它将导入Dog类。 它假定您打算在上面的语句中使用简单名称Dog时使用com.java2s.Dog类。 编译器用以下语句替换上面的语句: com.w3cschool.Dog jack; 导入声明允许您在代码中使用类型的简单名称,从而使您的代码更具可读性。 当编译代码时,编译器用其完全限定名替换类型的简单名称。 它使用导入声明将类型的简单名称转换为其完全限定名称。 按需导入声明 按需导入声明使用一个导入声明从包导入多个类型。 按需导入声明的语法是 import <package name>.*; 这里,包名称后面跟着一个点和一个星号(*)。 例如,以下需要的import-on-demand声明从com.java2s包导入所有类型: import com.w3cschool.*; 您可以使用按需导入声明重写Main类的代码。 import com.w3cschool.*; public class Main { public static void main(String[] args)...