Java教程 第85页

Java 注释

Java面向对象设计 – Java注释 什么是注释? Java中的注释允许我们将元数据与程序元素相关联。 程序元素可以是包,类,接口,类的字段,局部变量,方法,方法的参数,枚举,注释,泛型类型/方法声明中的类型参数,等等。 我们可以在Java程序中注释任何声明或类型。注释在任何其他修饰符(public,private,final,static等)的程序元素的声明中用作修饰符。 与修饰符不同,注释不会修改程序元素的含义。它是程序元素的注释。 声明注释类型 声明注释类型类似于声明接口类型。 注释类型是一种特殊类型的接口类型。 我们使用前面带有@符号的interface关键字来声明注释类型。 以下是声明注释类型的一般语法: <modifiers> @interface <annotation-type-name> { // Annotation type body } 注释声明的<modifiers>与接口声明的相同。 我们可以将注解类型声明为public或package级别。 @符号和interface关键字可以用空格分隔,也可以放在一起。 按照惯例,它们被放在一起作为 @interface 。 interface关键字后面是注释类型名称。它应该是有效的Java标识符。 注释类型正文放在大括号中。 以下代码创建注释以使用版本信息注释程序元素。 public @interface Version { int major(); int minor(); } 我们在Version注释类型中声明了两个抽象方法:major()和minor()。 注释类型中的抽象方法称为元素。 注释可以声明零个或多个元素,它们被声明为抽象方法。抽象方法名称是注释类型的元素的名称。 在上面的代码中,我们为Version注释类型声明了两个元素major和minor。两个元素的数据类型都是int。 我们需要导入注释类型,方式与导入任何其他类型的方式相同。 注释实例 要创建注释类型的实例并使用它来注释程序元素,我们使用以下语法: @annotationType(name1=value1, name2=value2, names3=values3...) 注释类型前面带有一个@符号,后面跟着用括号括起来的逗号分隔的name = value对列表。 name=value对中的名称是在注释类型中声明的元素的名称,值由用户提供。 name=value对不必按照在注释类型中声明的顺序显示。 以下代码使用Version类型的注释,主要元素值设置为1,次要元素值设置为0。 @Version(major=1, minor=0) 我们可以使用注释类型的完全限定名 @com.w3cschool.annotation.Version(major=0, minor=1) 我们可以将类声明注释为 @Version(major=1, minor=0) public class VersionTest { } 我们可以将程序元素的注释与其他修饰符混合使用。 @Version(major=1, minor=0) public class VersionTest { } public @Version(major=1, minor=0) class VersionTest { } 完整的源代码 @interface Version { int major(); int minor(); } @Version(major = 1, minor = 0) public class Main { @Version(major = 1, minor = 1) private int xyz = 110; @Version(major = 1, minor = 0)...

Java 泛型方法和构造函数

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面向对象设计 – Java泛型约束 无限通配符 通配符类型由问号表示,如<?> 。 对于通用类型,通配符类型是对象类型用于原始类型。 我们可以将任何已知类型的泛型分配为通配符类型。 这里是示例代码: // MyBag of String type MyBag<String> stringMyBag = new MyBag<String>("Hi"); // You can assign a MyBag<String> to MyBag<?> type MyBag<?> wildCardMyBag = stringMyBag; 通配符通配类型中的问号(例如,<?>)表示未知类型。 当您使用通配符声明参数化类型作为参数类型时,这意味着它不知道它的类型。 MyBag<?> unknownMyBag = new MyBag<String>("Hello"); 上限通配符 我们表示通配符的上限 <? extends T> 这里,T是一种类型。<? extends T>表示任何类型为T或其子类是可接受的。 例如,上限可以是数字类型。 如果我们通过任何其他类型,该类型是数字类型的子类,很好。但是,不是Number类型或其子类型的任何东西都应该在编译时被拒绝。 使用上限作为数字,我们可以将方法定义为 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; } } public class Main { public static double sum(MyBag<? extends Number> n1, MyBag<? extends Number> n2) { Number num1 = n1.get(); Number num2 = n2.get(); double sum = num1.doubleValue() + num2.doubleValue(); return sum; } } 不管你为n1和n2传递什么,它们将始终与Number的赋值兼容,因为编译器确保传递给sum()方法的参数遵循其声明中指定的规则 <? extends Number>。 下限通配符...

Java 泛型类

Java面向对象设计 – Java泛型类 使用泛型,我们可以在不知道代码操作对象的类型的情况下编写代码。它允许我们创建泛型类,构造函数和方法。 泛型类是使用形式类型参数定义的。 形式类型参数是一个逗号分隔的变量名列表,位于类声明中类名后面的尖括号<>中。 语法 下面的代码声明一个类Wrapper,它接受一个形式类型参数: public class Wrapper<T> { } 该参数已命名为T. T是一个类型变量,它可以是Java中的任何引用类型,例如String,Integer,Double等。 当使用Wrapper类时,指定形式类型参数值。 形式参数 采用形式类型参数的类也称为参数化类。 您可以声明Wrapper类的变量,将String类型指定为其形式类型参数的值,如下所示。 这里,String是实际的类型参数。 Wrapper<String> stringWrapper; Java允许我们使用泛型类而不指定形式类型参数。 用法 这是为了向后兼容。您还可以声明Wrapper<T>类的变量,如下所示: Wrapper aRawWrapper; 当使用泛型类而不指定实际的类型参数时,它被称为原始类型。上面的声明使用Wrapper <T>类作为原始类型,因为它没有指定T的值。 泛型类的实际类型参数必须是引用类型。 原始类型不允许作为泛型类的实际类型参数。 类可以采用多个正式类型参数。下面的代码声明一个Mapper类,它接受两个形式参数T和R: public class Mapper<T, R> { } 我们可以声明Mapper <T,R>类的变量如下: Mapper<String, Integer> mapper; 这里,实际的类型参数是String和Integer。 形式类型参数在类体中可用作类型。 public class Wrapper<T> { private T obj; public Wrapper(T obj) { this.obj = obj; } public T get() { return obj; } public void set(T obj) { this.obj = obj; } } Wrapper<T>类使用形式类型参数来声明实例变量obj,以声明其构造函数和set()方法的形式参数,以及作为get()方法的返回类型。 您可以通过为构造函数指定实际的类型参数来创建泛型类型的对象,如下所示: Wrapper<String> w1 = new Wrapper<String>("Hello"); 我们可以省略实际的类型参数。在下面的代码中,编译器会将构造函数的实际类型参数推断为String: Wrapper<String> w1 = new Wrapper<>("Hello"); 一旦你声明了泛型类的一个变量,你可以把形式类型参数看作是指定的实际类型参数。 现在,你可以认为,对于w1,Wrapper类的get()方法返回一个String。 String s1= w1.get(); 例子 以下代码显示如何使用Wrapper类。 public class Main { public static void main(String[] args) { Wrapper<String> w1 = new Wrapper<>("Hello"); String s1 = w1.get(); System.out.println("s1=" + s1); w1.set("Testing...

Java 抽象类和方法

Java面向对象设计 – Java抽象类和方法 Java可以定义一个类,其对象不能被创建。 它的目的只是表示一个想法,这是其他类的对象共有的。 这样的类称为抽象类。 语法 我们需要在类声明中使用 abstract 关键字来声明一个抽象类。 例如,下面的代码声明一个Shape类的抽象: public abstract class Shape { } 下面的代码为Shape类添加了一个draw()方法。 public abstract class Shape { public Shape() { } public abstract void draw(); } 抽象类不一定意味着它具有至少一个抽象方法。 如果一个类有一个被声明或继承的抽象方法,它必须被声明为抽象。 抽象方法的声明方式与任何其他方法相同,只是它的主体由分号表示。 例子 下面的Shape类有抽象和非抽象方法。 abstract class Shape { private String name; public Shape() { this.name = "Unknown shape"; } public Shape(String name) { this.name = name; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } // Abstract methods public abstract void draw(); public abstract double getArea(); public abstract double getPerimeter(); } 下面的代码展示了如何创建一个Rectangle类,它继承自Shape类。 class Rectangle extends Shape { private double width; private double height; public Rectangle(double width, double height) { // Set the shape name as "Rectangle" super("Rectangle"); this.width =...

Java 方法重写-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 方法重写

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 继承-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 继承

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 内部类成员-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 内部类成员

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面向对象设计 – 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 静态对象类-国外主机测评 - 国外VPS,国外服务器,国外云服务器,测评及优惠码

Java 静态对象类

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;...