Java面向对象设计 – Java泛型方法和构造函数 泛型方法 我们可以在方法声明中定义类型参数,它们在方法的返回类型之前的尖括号中指定。 包含泛型方法声明的类型不必是泛型类型。 我们可以在非静态方法声明中使用为泛型类型指定的类型参数。 例子 以下代码显示如何为方法m1()定义新的类型参数V. 新类型参数V强制方法m1()的第一个和第二个参数为相同类型。 第三个参数必须是相同的类型T,这是类实例化的类型。 class MyBag<T> { private T ref; public MyBag(T ref) { this.ref = ref; } public T get() { return ref; } public void set(T a) { this.ref = a; } } class Test<T> { public <V> void m1(MyBag<V> a, MyBag<V> b, T c) { } } 使用泛型方法 要传递方法的形式类型参数的实际类型参数,我们必须在方法调用中的点和方法名之间的尖括号<>中指定它。 class MyBag<T> { private T ref; public MyBag(T ref) { this.ref = ref; } public T get() { return ref; } public void set(T a) { this.ref = a; } } class Test<T> { public <V> void m1(MyBag<V> a, MyBag<V> b, T c) { } } public class Main { public static void main(String[] argv) { Test<String> t = new Test<String>();...
Java面向对象设计 – Java方法重写 方法重写 重新定义从超类继承的类中的实例方法称为方法重写。 例子 让我们考虑类A和类B的以下声明: public class A { public void print() { System.out.println("A"); } } public class B extends A { public void print() { System.out.println("B"); } } 类B是类A的子类。类B从其超类继承print()方法并重新定义它。 类B中的print()方法覆盖类A的print()方法。 如果一个类覆盖了一个方法,它会影响覆盖的类及其子类。考虑下面的类C的声明: public class C extends B { // Inherits B.print() } 类C不声明任何方法。它继承类B中的print()方法。 注意 类总是继承它的直接超类的可用的。 方法必须是实例方法。重写不适用于静态方法。 重写方法必须具有与重写方法相同的名称。 重写方法必须具有与重写方法相同顺序的相同类型的相同数量的参数。 当方法的参数使用通用类型时,考虑通用类型参数的擦除,而不是通用类型本身与其他方法比较。 参数的名称无关紧要。 如果重写方法的返回类型是引用类型,则重写方法的返回类型必须与重写方法的返回类型兼容。 访问级别 重写方法的访问级别必须至少与重写方法的访问级别相同或更宽松。 下表列出了重写方法允许的访问级别 重写方法访问级别 允许重写方法访问级别… public public protected public, protected package-level public, protected, package-level 方法可以在其throws子句中包括检查异常的列表。重写方法无法向重写方法中的异常列表添加新的异常。 它可以删除一个或所有异常,或者可以用另一个异常替换异常。 访问重写方法 从子类访问重写的方法。子类可以使用关键字 super 作为限定符来调用超类的重写方法。 class MySuperClass { public void print() { System.out.println("Inside MySuperClass"); } } class MySubClass extends MySuperClass { public void print() { // Call print() method of MySuperClass class super.print(); // Print a message System.out.println("Inside MySubClass.print()"); } public void callOverridenPrint() { // Call print() method of MySuperClass class super.print();...
Java面向对象设计 – Java继承 子类可以从超类继承。超类也称为基类或父类。子类也称为派生类或子类。 从另一个类继承一个类非常简单。我们在子类的类声明中使用关键字extends,后跟超类名称。 Java不支持多重继承的实现。 Java中的类不能有多个超类。 语法 一般的语法是 <class modifiers>class <SubclassName> extends <SuperclassName> { // Code for the Subclass } 例子 以下代码显示如何使用从Employee类创建Manager类。 class Employee { private String name = "Unknown"; public void setName(String name) { this.name = name; } public String getName() { return name; } } class Manager extends Employee { } public class Main { public static void main(String[] args) { // Create an object of the Manager class Manager mgr = new Manager(); // Set the name of the manager mgr.setName("Tom"); // Get the name of the manager String mgrName = mgr.getName(); // Display the manager name System.out.println("Manager Name: " + mgrName); } } 上面的代码生成以下结果。 注意 我们没有为Manager类编写任何代码,它的工作原理与Employee类相同,因为它继承自Employee类。 您可以使用Manager类的构造函数创建一个管理器对象。 Manager mgr = new Manager(); 创建管理器对象后,Manager对象的工作方式与Employee对象相同。 我们对manager对象使用了setName()和getName()方法。 mgr.setName("Tom");...
Java面向对象设计 – Java内部类成员 内部类可以访问其所有实例成员,实例字段和其封闭类的实例方法。 class Outer { private int value = 2014; public class Inner { public void printValue() { System.out.println("Inner: Value = " + value); } } // Inner class ends here public void printValue() { System.out.println("Outer: Value = " + value); } public void setValue(int newValue) { this.value = newValue; } } public class Main { public static void main(String[] args) { Outer out = new Outer(); Outer.Inner in = out.new Inner(); out.printValue(); in.printValue(); out.setValue(2015); out.printValue(); in.printValue(); } } 上面的代码生成以下结果。 例子 以下代码显示如何访问内部类的内部变量。 public class Main { public static void main(String[] args) { Outer out = new Outer(); Outer.Inner in = out.new Inner(); out.printValue(); in.printValue(); out.setValue(3); out.printValue(); in.printValue(); } } class Outer { private int value = 1; public...
Java面向对象设计 – Java内部类对象 局部内部类的对象是使用块中的新运算符创建的,它声明了类。 在声明类的同时创建一个匿名类的对象。 静态成员类是另一种类型的顶级类。 您可以按照创建顶级类的对象的方式创建静态成员类的对象。 成员内部类的实例始终存在于其封闭类的实例中。 语法 创建成员内部类的实例的一般语法如下: OuterClassReference.new MemberInnerClassConstructor() OuterClassReference是包围类的引用,后跟一个后跟新运算符的点。 例子 成员内部类的构造函数调用遵循new运算符。 class Outer { public class Inner { } } 要创建内部成员内部类的实例,必须首先创建其封闭类Outer的实例。 Outer out = new Outer(); 现在,您需要在out参考变量上使用new运算符来创建Inner类的对象。 out.new Inner(); 为了将内部成员内部类的实例的引用存储在引用变量中,我们可以写下面的语句: Outer.Inner in = out.new Inner(); 以下代码显示了如何创建成员内部类的对象 public class Main { public static void main(String[] args) { Car c = new Car(); Car.Tire t = c.new Tire(9); } } class Car { public class Tire { private int size; public Tire(int size) { this.size = size; } public String toString() { return "Monitor - Size:" + this.size + " inch"; } } }
Java面向对象设计 – Java静态内部类 静态成员类不是内部类 在另一个类的主体中定义的成员类可以声明为静态。 例子 以下代码声明了顶级类A和静态成员类B: class A { // Static member class public static class B { // Body for class B goes here } } 注意 静态成员类不是内部类。它被认为是一个顶级类。 静态成员类也称为嵌套顶级类。 A类的实例和B类的实例可以独立存在,因为它们都是顶级类。 静态成员类可以声明为public,protected,package-level或private,以限制其在其封闭类之外的可访问性。 使用静态成员类有两个好处: 静态成员类可以访问其包含类的静态成员,包括私有静态成员。 一个包通过提供一个命名空间,就像一个顶级类的容器。具有静态成员类的顶级类提供了额外的命名空间层。 静态成员类是其封闭顶级类的直接成员,而不是包的成员。 静态成员类的对象的创建方式与使用new运算符创建顶级类的对象的方式相同。要创建一个B类的对象,你写 A.B bReference = new A.B(); 由于类B的简单名称在类A中的范围内,因此我们可以使用其简单名称在类A中创建其对象 B bReference2 = new B(); // This statement appears inside class A code 我们还可以通过导入com.java2s.innerclasses.A.B类,使用A类之外的简单名称B. 例2 下面的代码显示了如何使用静态内部类。 public class Main { public static void main(String[] args) { Car.Tire m = new Car.Tire(17); Car.Tire m2 = new Car.Tire(19); Car.Keyboard k = new Car.Keyboard(122); Car.Keyboard k1 = new Car.Keyboard(142); System.out.println(m); System.out.println(m2); System.out.println(k); System.out.println(k1); } } class Car { // Static member class - Monitor public static class Tire { private int size; public Tire(int size) { this.size = size;...