久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

java虛擬機詳述-第二章(二)

瀏覽:115日期:2024-07-01 15:18:27
內容: 2.8 ClassesA class declaration specifies a new reference type and provides its implementation. Each class is implemented as an extension or subclass of a single existing class. A class may also implement one or more interfaces. The body of a class declares members (fields and methods), static initializers, and constructors.2.8.1 Class NamesIf a class is declared in a named package with the fully qualified name P, then the class has the fully qualified name P.Identifier. If the class is in an unnamed package, then the class has the fully qualified name Identifier. Two classes are the same class (and therefore the same type) if they are loaded by the same class loader (§2.17.2) and they have the same fully qualified name (§2.7.5).2.8.2 Class ModifiersA class declaration may include class modifiers. A class may be declared public, as discussed in §2.7.4. An abstract class is a class that is incomplete, or considered incomplete. Only abstract classes may have abstract methods (§2.10.3), that is, methods that are declared but not yet implemented.A class can be declared final if its definition is complete and no subclasses are desired or required. Because a final class never has any subclasses, the methods of a final class cannot be overridden in a subclass. A class cannot be both final and abstract, because the implementation of such a class could never be completed.A class can be declared strictfp to indicate that all expressions in the methods of the class are FP-strict (§2.18), whether or not the methods themselves are declared FP-strict.A class is declared public to make its type available to packages other than the one in which it is declared. A public class is accessible from other packages, using either its fully qualified name or a shorter name created by an import declaration (§2.7.2), whenever the host permits access to its package. If a class lacks the public modifier, access to the class declaration is limited to the package in which it is declared.2.8.3 Superclasses and SubclassesThe optional extends clause in a class declaration specifies the direct superclass of the current class, the class from whose implementation the implementation of the current class is derived. A class is said to be a direct subclass of the class it extends. Only the class Object (§2.4.7) has no direct superclass. If the extends clause is omitted from a class declaration, then the superclass of the new class is Object. The subclass relationship is the transitive closure of the direct subclass relationship. A class A is a subclass of a class C if A is a direct subclass of C, or if there is a direct subclass B of C and class A is a subclass of B. Class A is said to be a superclass of class C whenever C is a subclass of A.2.8.4 The Class MembersThe members of a class type include all of the following: Members inherited from its direct superclass (§2.8.3), except in class Object, which has no direct superclass.Members inherited from any direct superinterfaces (§2.13.2).Members declared in the body of the class. Members of a superclass that are declared private are not inherited by subclasses of that class. Members of a class that are not declared private, protected, or public are not inherited by subclasses declared in a package other than the one in which the class is declared. Constructors (§2.12) and static initializers (§2.11) are not members and therefore are not inherited.--------------------------------------------------------------------------------2.9 FieldsThe variables of a class type are its fields. Class (static) variables exist once per class. Instance variables exist once per instance of the class. Fields may include initializers and may be modified using various modifier keywords. If the class declares a field with a certain name, then the declaration of that field is said to hide any and all accessible declarations of fields with the same name in the superclasses and superinterfaces of the class. A class inherits from its direct superclass and direct superinterfaces all the fields of the superclass and superinterfaces that are accessible to code in the class and are not hidden by a declaration in the class. A hidden field can be accessed by using a qualified name (if it is static) or by using a field access expression that contains a cast to a superclass type or the keyword super.A value stored in a field of type float is always an element of the float value set (§2.4.3); similarly, a value stored in a field of type double is always an element of the double value set. It is not permitted for a field of type float to contain an element of the float-extended-exponent value set that is not also an element of the float value set, nor for a field of type double to contain an element of the double-extended-exponent value set that is not also an element of the double value set.2.9.1 Field ModifiersFields may be declared public, protected, or private, as discussed in §2.7.4. If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. A static field, sometimes called a class variable, is incarnated when the class is initialized (§2.17.4).A field that is not declared static is called an instance variable. Whenever a new instance of a class is created, a new variable associated with that instance is created for every instance variable declared in that class or in any of its superclasses. A field can be declared final, in which case its declarator must include a variable initializer (§2.9.2). Both class and instance variables (static and non-static fields) may be declared final. Once a final field has been initialized, it always contains the same value. If a final field holds a reference to an object, then the state of the object may be changed by operations on the object, but the field will always refer to the same object.Variables may be marked transient to indicate that they are not part of the persistent state of an object. The transient attribute can be used by an implementation to support special system services. The JavaTM Language Specification does not yet specify details of such services.The Java programming language allows threads that access shared variables to keep private working copies of the variables; this allows a more efficient implementation of multiple threads (§2.19). These working copies need to be reconciled with the master copies in the shared main memory only at prescribed synchronization points, namely, when objects are locked or unlocked (§2.19). As a rule, to make sure that shared variables are consistently and reliably updated, a thread should ensure that it has exclusive access to such variables by obtaining a lock that conventionally enforces mutual exclusion for those shared variables. Alternatively, a field may be declared volatile, in which case a thread must reconcile its working copy of the field with the master copy every time it accesses the variable. Moreover, operations on the master copies of one or more volatile variables on behalf of a thread are performed by the main memory in exactly the order that the thread requested. A final field cannot also be declared volatile.2.9.2 Initialization of FieldsIf a field declaration contains a variable initializer, then it has the semantics of an assignment to the declared variable, and: If the declaration is for a class variable (that is, a static field), then the variable initializer is evaluated and the assignment performed exactly once, when the class is initialized (§2.17.4).If the declaration is for an instance variable (that is, a field that is not static), then the variable initializer is evaluated and the assignment performed each time an instance of the class is created. --------------------------------------------------------------------------------2.10 MethodsA method declares executable code that can be invoked, passing a fixed number of values as arguments. Every method declaration belongs to some class. A class inherits from its direct superclass (§2.8.3) and any direct superinterfaces (§2.13.2) all the accessible methods of the superclass and superinterfaces, with one exception: if a name is declared as a method in the new class, then no method with the same signature (§2.10.2) is inherited. Instead, the newly declared method is said to override any such method declaration. An overriding method must not conflict with the definition that it overrides, for instance, by having a different return type. Overridden methods of the superclass can be accessed using a method invocation expression involving the super keyword. 2.10.1 Formal ParametersThe formal parameters of a method, if any, are specified by a list of comma-separated parameter specifiers. Each parameter specifier consists of a type and an identifier that specifies the name of the parameter. When the method is invoked, the values of the actual argument expressions initialize newly created parameter variables (§2.5), each of the declared type, before execution of the body of the method. A method parameter of type float always contains an element of the float value set (§2.4.3); similarly, a method parameter of type double always contains an element of the double value set. It is not permitted for a method parameter of type float to contain an element of the float-extended-exponent value set that is not also an element of the float value set, nor for a method parameter of type double to contain an element of the double-extended-exponent value set that is not also an element of the double value set. Where an actual argument expression corresponding to a parameter variable is not FP-strict (§2.18), evaluation of that actual argument expression is permitted to use values drawn from the appropriate extended-exponent value sets. Prior to being stored in the parameter variable, the result of such an expression is mapped to the nearest value in the corresponding standard value set by method invocation conversion (§2.6.8).2.10.2 Method SignatureThe signature of a method consists of the name of the method and the number and type of formal parameters (§2.10.1) of the method. A class may not declare two methods with the same signature. 2.10.3 Method ModifiersThe access modifiers public, protected, and private are discussed in Section 2.7.4. An abstract method declaration introduces the method as a member, providing its signature (§2.10.2), return type, and throws clause (if any), but does not provide an implementation. The declaration of an abstract method m must appear within an abstract class (call it A). Every subclass of A that is not itself abstract must provide an implementation for m. A method declared abstract cannot also be declared to be private, static, final, native, strictfp, or synchronized.A method that is declared static is called a class method. A class method is always invoked without reference to a particular object. A class method may refer to other fields and methods of the class by simple name only if they are class methods and class (static) variables.A method that is not declared static is an instance method. An instance method is always invoked with respect to an object, which becomes the current object to which the keywords this and super refer during execution of the method body.A method can be declared final to prevent subclasses from overriding or hiding it. A private method and all methods declared in a final class (§2.8.2) are implicitly final, because it is impossible to override them. If a method is final or implicitly final, a compiler or a runtime code generator can safely 'inline' the body of a final method, replacing an invocation of the method with the code in its body.A synchronized method will acquire a monitor lock (§2.19) before it executes. For a class (static) method, the lock associated with the class object for the method's class is used. For an instance method, the lock associated with this (the object for which the method is invoked) is used. The same per-object lock is used by the synchronized statement.A method can be declared strictfp to indicate that all expressions in the method are FP-strict (§2.18).A method can be declared native to indicate that it is implemented in platform-dependent code, typically written in another programming language such as C, C++, or assembly language. A method may not be declared to be both native and strictfp.--------------------------------------------------------------------------------2.11 Static InitializersAny static initializers declared in a class are executed when the class is initialized (§2.17.4) and, together with any field initializers (§2.9.2) for class variables, may be used to initialize the class variables of the class (§2.17.4). The static initializers and class variable initializers are executed in textual order. They may not refer to class variables declared in the class whose declarations appear textually after the use, even though these class variables are in scope. This restriction is designed to catch, at compile time, most circular or otherwise malformed initializations.--------------------------------------------------------------------------------2.12 ConstructorsA constructor is used in the creation of an object that is an instance of a class. The constructor declaration looks like a method declaration that has no result type. Constructors are invoked by class instance creation expressions (§2.17.6), by the conversions and concatenations caused by the string concatenation operator +, and by explicit constructor invocations from other constructors; they are never invoked by method invocation expressions. Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.If a constructor body does not begin with an explicit constructor invocation and the constructor being declared is not part of the primordial class Object, then the constructor body is implicitly assumed by the compiler to begin with a superclass constructor invocation 'super();', an invocation of the constructor of the direct superclass that takes no arguments.If a class declares no constructors then a default constructor, which takes no arguments, is automatically provided. If the class being declared is Object, then the default constructor has an empty body. Otherwise, the default constructor takes no arguments and simply invokes the superclass constructor with no arguments. If the class is declared public, then the default constructor is implicitly given the access modifier public. Otherwise, the default constructor has the default access implied by no access modifier (§2.7.4).A class can be designed to prevent code outside the class declaration from creating instances of the class by declaring at least one constructor, in order to prevent the creation of an implicit constructor, and declaring all constructors to be private.2.12.1 Constructor ModifiersAccess to constructors is governed by the access modifiers public, protected, and private (§2.7.4). A constructor cannot be abstract, static, final, native, or synchronized. A constructor cannot be declared to be strictfp. This difference in the definitions for method modifiers (§2.10.3) and constructor modifiers is an intentional language design choice; it effectively ensures that a constructor is FP-strict (§2.18) if and only if its class is FP-strict, so to speak.--------------------------------------------------------------------------------2.13 Interfaces An interface is a reference type whose members are constants and abstract methods. This type has no implementation, but otherwise unrelated classes can implement it by providing implementations for its abstract methods. Programs can use interfaces to make it unnecessary for related classes to share a common abstract superclass or to add methods to Object. An interface may be declared to be a direct extension of one or more other interfaces, meaning that it implicitly specifies all the abstract methods and constants of the interfaces it extends, except for any constants that it may hide, and perhaps adds newly declared members of its own.A class may be declared to directly implement one or more interfaces, meaning that any instance of the class implements all the abstract methods specified by that interface. A class necessarily implements all the interfaces that its direct superclasses and direct superinterfaces do. This (multiple) interface inheritance allows objects to support (multiple) common behaviors without sharing any implementation.A variable whose declared type is an interface type may have as its value a reference to an object that is an instance of any class that is declared to implement the specified interface. It is not sufficient that the class happens to implement all the abstract methods of the interface; the class or one of its superclasses must actually be declared to implement the interface, or else the class is not considered to implement the interface.2.13.1 Interface ModifiersAn interface declaration may be preceded by the interface modifiers public, strictfp, and abstract. The access modifier public is discussed in (§2.7.4). Every interface is implicitly abstract. All members of interfaces are implicitly public. An interface cannot be final, because the implementation of such a class could never be completed.2.13.2 SuperinterfacesIf an extends clause is provided, then the interface being declared extends each of the other named interfaces and therefore inherits the methods and constants of each of the other named interfaces. Any class that implements the declared interface is also considered to implement all the interfaces that this interface extends and that are accessible to the class. The implements clause in a class declaration lists the names of interfaces that are direct superinterfaces of the class being declared. All interfaces in the current package are accessible. Interfaces in other packages are accessible if the host system permits access to the package and the interface is declared public.An interface type K is a superinterface of class type C if K is a direct superinterface of C ; or if C has a direct superinterface J that has K as a superinterface; or if K is a superinterface of the direct superclass of C. A class is said to implement all its superinterfaces.There is no analogue of the class Object for interfaces; that is, while every class is an extension of class Object, there is no single interface of which all interfaces are extensions.2.13.3 Interface MembersThe members of an interface are those members inherited from direct superinterfaces and those members declared in the interface. The interface inherits, from the interfaces it extends, all members of those interfaces, except for fields with the same names as fields it declares. Interface members are either fields or methods. 2.13.3.1 Interface (Constant) FieldsEvery field declaration in the body of an interface is implicitly static and final. Interfaces do not have instance variables. Every field declaration in an interface is itself implicitly public. A constant declaration in an interface must not include either of the modifiers transient or volatile. Every field in the body of an interface must have an initialization expression, which need not be a constant expression. The variable initializer is evaluated and the assignment performed exactly once, when the interface is initialized (§2.17.4).2.13.3.2 Interface (Abstract) MethodsEvery method declaration in the body of an interface is implicitly abstract and implicitly public. A method declared in the body of an interface must not be declared static, because static methods cannot be abstract. A method declared in the body of an interface must not be declared native, strictfp, or synchronized, because those keywords describe implementation properties rather than interface properties; however, a method declared in an interface may be implemented by a method that is declared native, strictfp, or synchronized in a class that implements the interface. A method declared in the body of an interface must not be declared final; however, one may be implemented by a method that is declared final in a class that implements the interface.2.13.4 Overriding, Inheritance, and Overloading in InterfacesIf the interface declares a method, then the declaration of that method is said to override any and all methods with the same signature in the superinterfaces of the interface that would otherwise be accessible to code in this interface. An interface inherits from its direct superinterfaces all methods of the superinterfaces that are not overridden by a method declared in the interface.If two methods of an interface (whether both are declared in the same interface, or both are inherited by an interface, or one is declared and one is inherited) have the same name but different signatures, then the method name is said to be overloaded. --------------------------------------------------------------------------------2.14 Nested Classes and InterfacesJDK release 1.1 added nested classes and interfaces to the Java programming language. Nested classes and interfaces are sometimes referred to as inner classes and interfaces, which are one sort of nested classes and interfaces. However, nested classes and interfaces also encompass nested top-level classes and interfaces, which are not inner classes or interfaces. A full specification of nested classes and interfaces will be published in the second edition of The JavaTM Language Specification. Until then, interested persons should refer to the Inner Classes Specification, which may be found at http://java.sun.com/products/jdk/1.1/docs/guide/innerclasses/spec/innerclasses.doc.html.--------------------------------------------------------------------------------2.15 ArraysArrays are objects, are dynamically created, and may be assigned to variables of type Object (§2.4.7). All methods on arrays are inherited from class Object except the clone method, which arrays override. All arrays implement the interfaces Cloneable and java.io.Serializable. An array object contains a number of variables. That number may be zero, in which case the array is said to be empty. The variables contained in an array have no names; instead they are referenced by array access expressions that use nonnegative integer index values. These variables are called the components of the array. If an array has n components, we say n is the length of the array.An array of zero components is not the same as the null reference (§2.4).An array component of type float is always an element of the float value set (§2.4.3); similarly, a component of type double is always an element of the double value set. A component of type float may not be an element of the float-extended-exponent value set unless it is also an element of the float value set. A component of type double may not be an element of the double-extended-exponent value set unless it is also an element of the double value set.2.15.1 Array TypesAll the components of an array have the same type, called the component type of the array. If the component type of an array is T, then the type of the array itself is written T[]. The component type of an array may itself be an array type. The components of such an array may contain references to subarrays. If, starting from any array type, one considers its component type, and then (if that is also an array type) the component type of that type, and so on, eventually one must reach a component type that is not an array type; this is called the element type of the original array, and the components at this level of the data structure are called the elements of the original array.There are three situations in which an element of an array can be an array: if the element type is of type Object (§2.4.7), Cloneable, or java.io.Serializable, then some or all of the elements may be arrays, because every array object can be assigned to a variable of one of those types.In the Java programming language, unlike in C, an array of char is not a String (§2.4.7), and neither a String nor an array of char is terminated by 'u0000' (the NUL-character). A String object is immutable (its value never changes), while an array of char has mutable elements.The element type of an array may be any type, whether primitive or reference. In particular, arrays with an interface type as the component type are supported; the elements of such an array may have as their value a null reference or instances of any class type that implements the interface. Arrays with an abstract class type as the component type are supported; the elements of such an array may have as their value a null reference or instances of any subclass of this abstract class that is not itself abstract.2.15.2 Array VariablesA variable of array type holds a reference to an object. Declaring a variable of array type does not create an array object or allocate any space for array components. It creates only the variable itself, which can contain a reference to an array. Because an array's length is not part of its type, a single variable of array type may contain references to arrays of different lengths. Once an array object is created, its length never changes. To make an array variable refer to an array of different length, a reference to a different array must be assigned to the variable.If an array variable v has type A[], where A is a reference type, then v can hold a reference to any array type B[], provided B can be assigned to A (§2.6.7).2.15.3 Array CreationAn array is created by an array creation expression or an array initializer. 2.15.4 Array AccessA component of an array is accessed using an array access expression. Arrays may be indexed by int values; short, byte, or char values may also be used as they are subjected to unary numeric promotion (§2.6.10) and become int values. All arrays are 0-origin. An array with length n can be indexed by the integers 0 through n - 1. All array accesses are checked at run time; an attempt to use an index that is less than zero or greater than or equal to the length of the array causes an ArrayIndexOutOfBoundsException to be thrown.--------------------------------------------------------------------------------2.16 ExceptionsWhen a program violates the semantic constraints of the Java programming language, the Java virtual machine signals this error to the program as an exception. An example of such a violation is an attempt to index outside the bounds of an array. The Java programming language specifies that an exception will be thrown when semantic constraints are violated and will cause a nonlocal transfer of control from the point where the exception occurred to a point that can be specified by the programmer. An exception is said to be thrown from the point where it occurred and is said to be caught at the point to which control is transferred. A method invocation that completes because an exception causes transfer of control to a point outside the method is said to complete abruptly. Programs can also throw exceptions explicitly, using throw statements. This provides an alternative to the old-fashioned style of handling error conditions by returning distinguished error values, such as the integer value -1, where a negative value would not normally be expected.Every exception is represented by an instance of the class Throwable or one of its subclasses; such an object can be used to carry information from the point at which an exception occurs to the handler that catches it. Handlers are established by catch clauses of try statements. During the process of throwing an exception, the Java virtual machine abruptly completes, one by one, any expressions, statements, method and constructor invocations, static initializers, and field initialization expressions that have begun but not completed execution in the current thread. This process continues until a handler is found that indicates that it handles the thrown exception by naming the class of the exception or a superclass of the class of the exception. If no such handler is found, then the method uncaughtException is invoked for the ThreadGroup that is the parent of the current thread.In the Java programming language the exception mechanism is integrated with the synchronization model (§2.19) so that locks are properly released as synchronized statements and so that invocations of synchronized methods complete abruptly.The specific exceptions covered in this section are that subset of the predefined exceptions that can be thrown directly by the operation of the Java virtual machine. Additional exceptions can be thrown by class library or user code; these exceptions are not covered here. See The JavaTM Language Specification for information on all predefined exceptions.2.16.1 The Causes of ExceptionsAn exception is thrown for one of three reasons: An abnormal execution condition was synchronously detected by the Java virtual machine. These exceptions are not thrown at an arbitrary point in the program, but rather at a point where they are specified as a possible result of an expression evaluation or statement execution, such as:When an operation violates the normal semantics of the Java programming language, for example indexing outside the bounds of an array.When an error occurs in loading or linking part of the program.When some limit on a resource is exceeded, for example when too much memory is used.A throw statement was executed.An asynchronous exception occurred because:The stop method of class Thread or ThreadGroup was invoked, orAn internal error occurred in the virtual machine implementation. Exceptions are represented by instances of the class Throwable and instances of its subclasses. These classes are, collectively, the exception classes.2.16.2 Handling an ExceptionWhen an exception is thrown, control is transferred from the code that caused the exception to the nearest dynamically enclosing catch clause of a try statement that handles the exception. A statement or expression is dynamically enclosed by a catch clause if it appears within the try block of the try statement of which the catch clause is a part, or if the caller of the statement or expression is dynamically enclosed by the catch clause.The caller of a statement or expression depends on where it occurs:If within a method, then the caller is the method invocation expression that was executed to cause the method to be invoked.If within a constructor or the initializer for an instance variable, then the caller is the class instance creation expression or the method invocation of newInstance that was executed to cause an object to be created.If within a static initializer or an initializer for a static variable, then the caller is the expression that used the class or interface so as to cause it to be initialized. Whether a particular catch clause handles an exception is determined by comparing the class of the object that was thrown to the declared type of the parameter of the catch clause. The catch clause handles the exception if the type of its parameter is the class of the exception or a superclass of the class of the exception. Equivalently, a catch clause will catch any exception object that is an instanceof the declared parameter type.The control transfer that occurs when an exception is thrown causes abrupt completion of expressions and statements until a catch clause is encountered that can handle the exception; execution then continues by executing the block of that catch clause. The code that caused the exception is never resumed.If no catch clause handling an exception can be found, then the current thread (the thread that encountered the exception) is terminated, but only after all finally clauses have been executed and the method uncaughtException has been invoked for the ThreadGroup that is the parent of the current thread.In situations where it is desirable to ensure that one block of code is always executed after another, even if that other block of code completes abruptly, a try statement with a finally clause may be used. If a try or catch block in a try-finally or try-catch-finally statement completes abruptly, then the finally clause is executed during propagation of the exception, even if no matching catch clause is ultimately found. If a finally clause is executed because of abrupt completion of a try block and the finally clause itself completes abruptly, then the reason for the abrupt completion of the try block is discarded and the new reason for abrupt completion is propagated from there.Most exceptions occur synchronously as a result of an action by the thread in which they occur and at a point in the program that is specified to possibly result in such an exception. An asynchronous exception is, by contrast, an exception that can potentially occur at any point in the execution of a program.Asynchronous exceptions are rare. They occur only as a result of:An invocation of the stop method of class Thread or ThreadGroup.An internal error in the Java virtual machine implementation. A stop method may be invoked by one thread to affect another thread or all the threads in a specified thread group. It is asynchronous because it may occur at any point in the execution of the other thread or threads. An internal error is considered asynchronous so that it may be handled using the same mechanism that handles the stop method, as will now be described. The Java programming language permits a small but bounded amount of execution to occur before an asynchronous exception is thrown. This delay is permitted to allow optimized code to detect and throw these exceptions at points where it is practical to handle them while obeying the semantics of the language.A simple implementation might poll for asynchronous exceptions at the point of each control transfer instruction. Since a program has a finite size, this provides a bound on the total delay in detecting an asynchronous exception. Since no asynchronous exception will occur between control transfers, the code generator has some flexibility to reorder computation between control transfers for greater performance.All exceptions in the Java programming language are precise: when the transfer of control takes place, all effects of the statements executed and expressions evaluated before the point from which the exception is thrown must appear to have taken place. No expressions, statements, or parts thereof that occur after the point from which the exception is thrown may appear to have been evaluated. If optimized code has speculatively executed some of the expressions or statements which follow the point at which the exception occurs, such code must be prepared to hide this speculative execution from the user-visible state of the program.2.16.3 The Exception HierarchyThe possible exceptions in a program are organized in a hierarchy of classes, rooted at class Throwable, a direct subclass of Object. The classes Exception and Error are direct subclasses of Throwable. The class RuntimeException is a direct subclass of Exception. Programs can use the preexisting exception classes in throw statements, or define additional exception classes as subclasses of Throwable or of any of its subclasses, as appropriate. To take advantage of compile-time checking for exception handlers, it is typical to define most new exception classes as checked exception classes, specifically as subclasses of Exception that are not subclasses of RuntimeException.2.16.4 The Classes Exception and RuntimeExceptionThe class Exception is the superclass of all the standard exceptions that ordinary programs may wish to recover from. The class RuntimeException is a subclass of class Exception. The subclasses of RuntimeException are unchecked exception classes. The package java.lang defines the following standard unchecked runtime exceptions:ArithmeticException: An exceptional arithmetic situation has arisen, such as an integer division or integer remainder operation with a zero divisor. ArrayStoreException: An attempt has been made to store into an array component a value whose class is not assignment compatible with the component type of the array.ClassCastException: An attempt has been made to cast a reference to an object to an inappropriate type.IllegalMonitorStateException: A thread has attempted to wait on or notify other threads waiting on an object that it has not locked.IndexOutOfBoundsException: Either an index of some sort (such as to an array, a string, or a vector) or a subrange, specified either by two index values or by an index and a length, was out of range.NegativeArraySizeException: An attempt was made to create an array with a negative length.NullPointerException: An attempt was made to use a null reference in a case where an object reference was required.SecurityException: A security violation was detected. The class Error and its standard subclasses are exceptions from which ordinary programs are not ordinarily expected to recover. The class Error is a separate subclass of Throwable, distinct from Exception in the class hierarchy, in order to allow programs to use the idiom } catch (Exception e) {to catch all exceptions from which recovery may be possible without catching errors from which recovery is typically not possible. Package java.lang defines all the error classes described here. The Java virtual machine throws an object that is an instance of a subclass of LinkageError when a loading (§2.17.2), linking (§2.17.3), or initialization (§2.17.4) error occurs. The loading process is described in (§2.17.2). The errors ClassFormatError, ClassCircularityError, NoClassDefFoundError, and UnsupportedClassVersionError are described there.The linking process is described in (§2.17.3). The linking errors NoSuchFieldError, NoSuchMethodError, InstantiationError, and IllegalAccessError are described there.The class verification process is described in (§2.17.3). The verification failure error VerifyError is described there.The class initialization process is described in (§2.17.4). A virtual machine will throw the error ExceptionInInitializerError if execution of a static initializer or of an initializer for a static field (§2.11) results in an exception that is not an Error or a subclass of Error.A LinkageError may also be thrown at run time:An AbstractMethodError is thrown at run time if an abstract method is invoked.An UnsatisfiedLinkError is thrown at run time if the Java virtual machine cannot find an appropriate definition of a method declared to be native. A Java virtual machine implementation throws an object that is an instance of a subclass of the class VirtualMachineError when an internal error or resource limitation prevents it from implementing the semantics of the Java programming language. This specification defines the following virtual machine errors:InternalError: An internal error has occurred in the Java virtual machine implementation because of a fault in the software implementing the virtual machine, a fault in the underlying host system software, or a fault in the hardware. This error is delivered asynchronously when it is detected and may occur at any point in a program.OutOfMemoryError: The Java virtual machine implementation has run out of either virtual or physical memory, and the automatic storage manager was unable to reclaim enough memory to satisfy an object creation request.StackOverflowError: The Java virtual machine implementation has run out of stack space for a thread, typically because the thread is doing an unbounded number of recursive invocations as a result of a fault in the executing program.UnknownError: An exception or error has occurred, but the Java virtual machine implementation is unable to report the actual exception or error. --------------------------------------------------------------------------------2.17 ExecutionThis section specifies activities that occur during execution of a program. It is organized around the life cycle of the Java virtual machine and of the classes, interfaces, and objects that form a program. It specifies the detailed procedures used in starting up the virtual machine (§2.17.1), class and interface type loading (§2.17.2), linking (§2.17.3), and initialization (§2.17.4). It then specifies the procedures for creation of new class instances (§2.17.6). It concludes by describing the unloading of classes (§2.17.8) and the procedure followed when a virtual machine exits (§2.17.9). 2.17.1 Virtual Machine Start-upThe Java virtual machine starts execution by invoking the method main of some specified class and passing it a single argument, which is an array of strings. This causes the specified class to be loaded (§2.17.2), linked (§2.17.3) to other types that it uses, and initialized (§2.17.4). The method main must be declared public, static, and void. The manner in which the initial class is specified to the Java virtual machine is beyond the scope of this specification, but it is typical, in host environments that use command lines, for the fully qualified name of the class to be specified as a command-line argument and for subsequent command-line arguments to be used as strings to be provided as the argument to the method main. For example, using Sun's Java 2 SDK for Solaris, the command line java Terminator Hasta la vista Baby!will start a Java virtual machine by invoking the method main of class Terminator (a class in an unnamed package) and passing it an array containing the four strings 'Hasta', 'la', 'vista', and 'Baby!'. We now outline the steps the virtual machine may take to execute Terminator, as an example of the loading, linking, and initialization processes that are described further in later sections.The initial attempt to execute the method main of class Terminator discovers that the class Terminator is not loaded-that is, the virtual machine does not currently contain a binary representation for this class. The virtual machine then uses a ClassLoader (§2.17.2) to attempt to find such a binary representation. If this process fails, an error is thrown. This loading process is described further in (§2.17.2).After Terminator is loaded, it must be initialized before main can be invoked, and a type (class or interface) must always be linked before it is initialized. Linking (§2.17.3) involves verification, preparation, and (optionally) resolution.Verification (§2.17.3) checks that the loaded representation of Terminator is well formed, with a proper symbol table. Verification also checks that the code that implements Terminator obeys the semantic requirements of the Java virtual machine. If a problem is detected during verification, an error is thrown.Preparation (§2.17.3) involves allocation of static storage and any data structures that are used internally by the virtual machine, such as method tables.Resolution (§2.17.3) is the process of checking symbolic references from class Terminator to other classes and interfaces, by loading the other classes and interfaces that are mentioned and checking that the references are correct.The resolution step is optional at the time of initial linkage. An implementation may resolve a symbolic reference from a class or interface that is being linked very early, even to the point of resolving all symbolic references from the classes and interfaces that are further referenced, recursively. (This resolution may result in errors from further loading and linking steps.) This implementation choice represents one extreme and is similar to the kind of static linkage that has been done for many years in simple implementations of the C language.An implementation may instead choose to resolve a symbolic reference only when it is actually used; consistent use of this strategy for all symbolic references would represent the 'laziest' form of resolution. In this case, if Terminator had several symbolic references to another class, the references might be resolved one at a time or perhaps not at all, if these references were never used during execution of the program.The only requirement regarding when resolution is performed is that any errors detected during resolution must be thrown at a point in the program where some action is taken by the program that might, directly or indirectly, require linkage to the class or interface involved in the error. In the 'static' example implementation choice described earlier, loading and linking errors could occur before the program is executed if they involved a class or interface mentioned in the class Terminator or any of the further, recursively referenced classes and interfaces. In a system that implemented the 'laziest' resolution, these errors would be thrown only when a symbolic reference was used.In our running example, the virtual machine is still trying to execute the method main of class Terminator. This is permitted only if the class has been initialized (§2.17.4).Initialization consists of execution of any class variable initializers and static initializers of the class Terminator, in textual order. But before Terminator can be initialized, its direct superclass must be initialized, as well as the direct superclass of its direct superclass, and so on, recursively. In the simplest case, Terminator has Object as its implicit direct superclass; if class Object has not yet been initialized, then it must be initialized before Terminator is initialized.If class Terminator has another class Super as its superclass, then Super must be initialized before Terminator. This requires loading, verifying, and preparing Super, if this has not already been done, and, depending on the implementation, may also involve resolving the symbolic references from Super and so on, recursively.Initialization may thus cause loading, linking, and initialization errors, including such errors involving other types.Finally, after completion of the initialization for class Terminator (during which other consequential loading, linking, and initializing may have occurred), the method main of Terminator is invoked.2.17.2 Loading Loading refers to the process of finding the binary form of a class or interface type with a particular name, perhaps by computing it on the fly, but more typically by retrieving a binary representation previously computed from source code by a compiler and constructing, from that binary form, a Class object to represent the class or interface. The binary format of a class or interface is normally the class file format (see Chapter 4, 'The class File Format'). The loading process is implemented by the class ClassLoader and its subclasses. Different subclasses of ClassLoader may implement different loading policies. In particular, a class loader may cache binary representations of classes and interfaces, prefetch them based on expected usage, or load a group of related classes together. These activities may not be completely transparent to a running application if, for example, a newly compiled version of a class is not found because an older version is cached by a class loader. It is the responsibility of a class loader, however, to reflect loading errors only at points in the program where they could have arisen without prefetching or group loading.If an error occurs during class loading, then an instance of one of the following subclasses of class LinkageError will be thrown at any point in the program that (directly or indirectly) uses the type:ClassFormatError: The binary data that purports to specify a requested compiled class or interface is malformed.UnsupportedClassVersionError: A class or interface could not be loaded because it is represented using an unsupported version of the class file format.3ClassCircularityError: A class or interface could not be loaded because it would be its own superclass or superinterface (§2.13.2).NoClassDefFoundError: No definition for a requested class or interface could be found by the relevant class loader. 2.17.3 Linking: Verification, Preparation, and ResolutionLinking is the process of taking a binary form of a class or interface type and combining it into the runtime state of the Java virtual machine, so that it can be executed. A class or interface type is always loaded before it is linked. Three different activities are involved in linking: verification, preparation, and resolution of symbolic references. The Java programming language allows an implementation flexibility as to when linking activities (and, because of recursion, loading) take place, provided that the semantics of the language are respected, that a class or interface is completely verified and prepared before it is initialized, and that errors detected during linkage are thrown at a point in the program where some action is taken by the program that might require linkage to the class or interface involved in the error.For example, an implementation may choose to resolve each symbolic reference in a class or interface individually, only when it is used (lazy or late resolution), or to resolve them all at once, for example, while the class is being verified (static resolution). This means that the resolution process may continue, in some implementations, after a class or interface has been initialized.Verification ensures that the binary representation of a class or interface is structurally correct. For example, it checks that every instruction has a valid operation code; that every branch instruction branches to the start of some other instruction, rather than into the middle of an instruction; that every method is provided with a structurally correct signature; and that every instruction obeys the type discipline of the Java programming language.If an error occurs during verification, then an instance of the following subclass of class LinkageError will be thrown at the point in the program that caused the class to be verified:VerifyError: The binary definition for a class or interface failed to pass a set of required checks to verify that it cannot violate the integrity of the Java virtual machine. Preparation involves creating the static fields for a class or interface and initializing such fields to the standard default values (§2.5.1). This does not require the execution of any Java virtual machine code; explicit initializers for static fields are executed as part of initialization (§2.17.4), not preparation.Implementations of the Java virtual machine may precompute additional data structures at preparation time in order to make later operations on a class or interface more efficient. One particularly useful data structure is a 'method table' or other data structure that allows any method to be invoked on instances of a class without requiring a search of superclasses at invocation time.The binary representation of a class or interface references other classes and interfaces and their fields, methods, and constructors symbolically, using the fully qualified names (§2.7.5) of the other classes and interfaces. For fields and methods these symbolic references include the name of the class or interface type that declares the field or method, as well as the name of the field or method itself, together with appropriate type information.Before a symbolic reference can be used it must undergo resolution, wherein a symbolic reference is validated and, typically, replaced with a direct reference that can be more efficiently processed if the reference is used repeatedly.If an error occurs during resolution, then an instance of one of the following subclasses of class IncompatibleClassChangeError, or of some other subclass, or of IncompatibleClassChangeError itself (which is a subclass of the class LinkageError) may be thrown at any point in the program that uses a symbolic reference to the type:IllegalAccessError: A symbolic reference has been encountered that specifies a use or assignment of a field, or invocation of a method, or creation of an instance of a class to which the code containing the reference does not have access because the field or method was declared private, protected, or default access (not public), or because the class was not declared public. This can occur, for example, if a field that is originally declared public is changed to be private after another class that refers to the field has been compiled.InstantiationError: A symbolic reference has been encountered that is used in a class instance creation expression, but an instance cannot be created because the reference turns out to refer to an interface or to an abstract class. This can occur, for example, if a class that is originally not abstract is changed to be abstract after another class that refers to the class in question has been compiled.NoSuchFieldError: A symbolic reference has been encountered that refers to a specific field of a specific class or interface, but the class or interface does not declare a field of that name. This can occur, for example, if a field declaration was deleted from a class after another class that refers to the field was compiled.NoSuchMethodError: A symbolic reference has been encountered that refers to a specific method of a specific class or interface, but the class or interface does not declare a method of that name and signature. This can occur, for example, if a method declaration was deleted from a class after another class that refers to the method was compiled. 2.17.4 InitializationInitialization of a class consists of executing its static initializers (§2.11) and the initializers for static fields (§2.9.2) declared in the class. Initialization of an interface consists of executing the initializers for fields declared in the interface (§2.13.3.1). Before a class or interface is initialized, its direct superclass must be initialized, but interfaces implemented by the class need not be initialized. Similarly, the superinterfaces of an interface need not be initialized before the interface is initialized.A class or interface type T will be initialized immediately before one of the following occurs:T is a class and an instance of T is created.T is a class and a static method of T is invoked.A nonconstant static field of T is used or assigned. A constant field is one that is (explicitly or implicitly) both final and static, and that is initialized with the value of a compile-time constant expression. A reference to such a field must be resolved at compile time to a copy of the compile-time constant value, so uses of such a field never cause initialization. Invocation of certain methods in library classes (§3.12) also causes class or interface initialization. See the Java 2 platform's class library specifications (for example, class Class and package java.lang.reflect) for details.The intent here is that a type have a set of initializers that put it in a consistent state and that this state be the first state that is observed by other classes. The static initializers and class variable initializers are executed in textual order and may not refer to class variables declared in the class whose declarations appear textually after the use, even though these class variables are in scope. This restriction is designed to detect, at compile time, most circular or otherwise malformed initializations.Before a class or interface is initialized its superclass is initialized, if it has not previously been initialized.2.17.5 Detailed Initialization ProcedureInitialization of a class or interface requires careful synchronization, since some other thread may be trying to initialize the same class or interface at the same time. There is also the possibility that initialization of a class or interface may be requested recursively as part of the initialization of that class or interface; for example, a variable initializer in class A might invoke a method of an unrelated class B, which might in turn invoke a method of class A. The implementation of the Java virtual machine is responsible for taking care of synchronization and recursive initialization by using the following procedure. It assumes that the Class object has already been verified and prepared and that the Class object contains state that can indicate one of four situations: This Class object is verified and prepared but not initialized.This Class object is being initialized by some particular thread T.This Class object is fully initialized and ready for use.This Class object is in an erroneous state, perhaps because the verification step failed or because initialization was attempted and failed. The procedure for initializing a class or interface is then as follows: Synchronize on the Class object that represents the class or interface to be initialized. This involves waiting until the current thread can obtain the lock for that object (§8.13).If initialization by some other thread is in progress for the class or interface, then wait on this Class object (which temporarily releases the lock). When the current thread awakens from the wait, repeat this step.If initialization is in progress for the class or interface by the current thread, then this must be a recursive request for initialization. Release the lock on the Class object and complete normally.If the class or interface has already been initialized, then no further action is required. Release the lock on the Class object and complete normally.If the Class object is in an erroneous state, then initialization is not possible. Release the lock on the Class object and throw a NoClassDefFoundError.Otherwise, record the fact that initialization of the Class object is now in progress by the current thread and release the lock on the Class object.Next, if the Class object represents a class rather than an interface, and the direct superclass of this class has not yet been initialized, then recursively perform this entire procedure for the uninitialized superclass. If the initialization of the direct superclass completes abruptly because of a thrown exception, then lock this Class object, label it erroneous, notify all waiting threads, release the lock, and complete abruptly, throwing the same exception that resulted from the initializing the superclass.Next, execute either the class variable initializers and static initializers of the class or the field initializers of the interface, in textual order, as though they were a single block, except that final static variables and fields of interfaces whose values are compile-time constants are initialized first.If the execution of the initializers completes normally, then lock this Class object, label it fully initialized, notify all waiting threads, release the lock, and complete this procedure normally.Otherwise, the initializers must have completed abruptly by throwing some exception E. If the class of E is not Error or one of its subclasses, then create a new instance of the class ExceptionInInitializerError, with E as the argument, and use this object in place of E in the following step. But if a new instance of ExceptionInInitializerError cannot be created because an OutOfMemoryError occurs, then instead use an OutOfMemoryError object in place of E in the following step.Lock the Class object, label it erroneous, notify all waiting threads, release the lock, and complete this procedure abruptly with reason E or its replacement as determined in the previous step. In some early implementations of the Java virtual machine, an exception during class initialization was ignored rather than allowing it to cause an ExceptionInInitializerError as described here. 2.17.6 Creation of New Class InstancesA new class instance is explicitly created when one of the following situations occurs: Evaluation of a class instance creation expression creates a new instance of the class whose name appears in the expression.Invocation of the newInstance method of class Class creates a new instance of the class represented by the Class object for which the method was invoked. A new class instance may be implicitly created in the following situations: Loading of a class or interface that contains a String literal may create a new String object (§2.4.8) to represent that literal. This may not occur if the a String object has already been created to represent a previous occurrence of that literal, or if the String.intern method has been invoked on a String object representing the same string as the literal.Execution of a string concatenation operator that is not part of a constant expression sometimes creates a new String object to represent the result. String concatenation operators may also create temporary wrapper objects for a value of a primitive type (§2.4.1). Each of these situations identifies a particular constructor to be called with specified arguments (possibly none) as part of the class instance creation process. Whenever a new class instance is created, memory space is allocated for it with room for all the instance variables declared in the class type and all the instance variables declared in each superclass of the class type, including all the instance variables that may be hidden. If there is not sufficient space available to allocate memory for the object, then creation of the class instance completes abruptly with an OutOfMemoryError. Otherwise, all the instance variables in the new object, including those declared in superclasses, are initialized to their default values (§2.5.1).Just before a reference to the newly created object is returned as the result, the indicated constructor is processed to initialize the new object using the following procedure:Assign the arguments for the constructor to newly created parameter variables for this constructor invocation.If this constructor begins with an explicit constructor invocation of another constructor in the same class (using this), then evaluate the arguments and process that constructor i
標簽: Java
相關文章:
主站蜘蛛池模板: 欧美成人高清视频 | 欧美亚洲专区 | 手机看片亚洲 | 国内精品国产成人国产三级粉色 | 国产一区二区成人 | 午夜免费剧场 | 中文在线一区二区 | 狠狠做深爱婷婷综合一区 | 亚洲成人久久久 | 毛片免费观看 | 91久久久久久久久久久久久久 | 国产女人网 | 国产成人av在线 | 特黄视频| 亚洲国产高清在线 | 成人激情视频 | 欧美久久久久久久久久久久久久 | 色综合久 | 草草视频在线免费观看 | 日韩精品在线视频 | 99久久99| 国产中文一区二区三区 | 成人精品一区二区三区中文字幕 | 欧美日韩中文在线观看 | 日韩在线视频观看 | 中文字幕在线永久 | 日本一区二区三区免费观看 | 亚洲综合一区二区三区 | 91视频国产网站 | 欧美free性| 中文字幕亚洲一区 | 中文字幕日韩一区二区不卡 | 超碰在线国产 | 福利视频一 | 9uu在线观看| 日韩精品免费 | 自拍一区视频 | 欧美一级爆毛片 | 91社区在线高清 | 欧美日韩视频在线 | 成人性视频在线播放 | 久久伊人精品视频 | 日本爱爱| 免费观看av毛片 | 免费观看一级特黄欧美大片 | 久久久99久久久国产自输拍 | 国产伊人99 | 国产精品亚欧美一区二区 | 国产一区二区视频免费看 | 成人精品一区二区三区中文字幕 | 免费亚洲视频 | 欧美性一区 | 亚洲视频一区二区 | 综合国产 | 欧洲精品在线视频 | 亚洲精品久久久一区二区三区 | 成人欧美一区二区 | 久久都是精品 | 国产成人精品一区二区三区四区 | 成人精品视频 | 中文一区 | 久久成人综合 | 黄色成人在线 | 成人不卡 | 中国大陆高清aⅴ毛片 | av一区二区三区四区 | 国产一区精品视频 | www.久久久 | 啪啪网站免费 | youjizz欧美| 久久久精品影院 | www.狠狠干| 国产免费av网站 | 三级色黄| 四虎最新入口 | 一级黄色片网站 | 久久久蜜桃一区二区人 | 免费色在线| 亚洲一级黄色 | 国产精品日本一区二区在线播放 | 91丨九色丨国产在线 | 久久久久无码国产精品一区 | 成人av网站在线观看 | 国产在线一区二区三区 | 蜜臀久久99精品久久久无需会员 | 亚洲精品久久久久久久久久久 | 成人免费视频视频在线观看 免费 | 国产美女精品一区二区三区 | 男人的天堂中文字幕 | 国产黄色av| 成人精品网站在线观看 | 国产成人精品久久二区二区 | 涩涩视频大全 | 91性高湖久久久久久久久_久久99 | 国产成人高清 | 麻豆精品久久久 | 久久综合一区二区 | 成人精品在线观看 | 午夜精品一区二区三区在线观看 | 中文字幕在线三区 | 日本成人午夜影院 | 国产一区二区免费 | 午夜小视频在线观看 | 国产中文在线 | 国产精品中文字幕在线 | 国产欧美精品一区二区 | 在线精品亚洲欧美日韩国产 | 国产成人精品一区二区三区 | 午夜私人影院 | 日本午夜在线 | 成人在线免费观看 | 日韩中文视频 | 日韩高清不卡一区二区三区 | 91精品国产91综合久久蜜臀 | 国产高清在线 | 国产一区二区三区久久 | 黄色毛片观看 | 在线色网站 | 九九香蕉视频 | 极情综合网 | 久久久精品免费看 | 国产成人精品一区二区三区四区 | 国产精品无码专区在线观看 | 99热精品在线 | 国产a免费| 免费一区二区三区 | 国产精品国产精品国产 | 日本久久久久久久久 | 国产精品久久久 | 天天看天天操 | av在线一区二区三区 | 久久久久久久精 | 大桥未久亚洲精品久久久强制中出 | 国产黄色免费小视频 | 国产精国产精品 | 国产视频网 | 91欧美在线 | 亚洲精品九九 | 亚洲二区在线 | 久久久成人精品 | 午夜老湿影院 | 日韩欧美在线一区 | japan23xxxxhd乱| 欧美成人a | 精品久久久久久久久久久 | 国产在线视频一区 | 久久久久久久91 | 中文字幕一级毛片 | 在线视频 中文字幕 | 日日干日日操 | 亚洲精品乱码久久久久久蜜糖图片 | 中文字幕自拍偷拍 | 久久亚洲精品视频 | 久久一区二区三区四区 | 午夜窝窝| 亚洲国产成人在线 | 免费av一区二区三区 | 黄色片网站 | 一区二区三区精品 | 一色视频 | 日本狠狠操 | 2018自拍偷拍 | 亚洲黄色免费 | 国产一区二区三区视频 | 亚洲www视频 | 久久99精品视频在线观看 | 每日更新av | 国产ts余喵喵和直男多体位 | 亚洲精品久久久久久下一站 | 精品国产一区二区三区久久久蜜月 | 久久99久久99精品免观看粉嫩 | 亚洲欧美精品一区二区三区 | 欧美精品二区中文乱码字幕高清 | 精品1区| 欧美精品中文字幕久久二区 | 欧美综合视频 | 久久毛片 | 国产成人 综合 亚洲 | 久久精品久久久久电影 | 中文字幕在线精品 | 欧美日韩精品一区二区在线播放 | 国产精品视频一区二区三区 | 天天天天综合 | 亚洲第一国产精品 | 国产毛片aaa | www久久精品| 国产成人av在线 | 亚洲国产成人一区二区精品区 | 中文在线一区 | 伊人网在线视频观看 | 国产精品久久久久久久久久久久久 | 日本不卡一区二区三区在线观看 | 日韩在线视频资源 | 国产精品久久久久影院色老大 | 精品一区二区视频 | 黄篇网址| 日韩三区在线 | 久久伊人精品视频 | 免费99视频| 成人av小说 | 久久国产精品99久久久久久老狼 | 黄色大片网站 | 免费黄色在线视频 | 亚洲啊v在线 | 精品国产乱码一区二区三区 | 久久小视频| 一区二区三区在线播放 | 久久久国产一区二区三区 | 亚洲精品二区 | 午夜视频网站 | 欧美xxxⅹ性欧美大片 | 日本高清中文字幕 | 亚洲精品乱码久久久久久麻豆不卡 | 欧美aaa视频 | 亚洲一区二区在线视频 | 成人国产一区二区 | 日本在线黄色 | 国产午夜精品久久久久久久 | 国产一区二区视频在线观看 | 日韩成人视屏 | 黄色一级片黄色一级片 | 色婷婷久久久swag精品 | 专干老肥女人88av | 国产中文在线 | 国产精品11 | 婷婷色国产偷v国产偷v小说 | 污片在线免费看 | 综合久久99 | 久久精品久久久 | 久久久久久久久综合 | 久久久天天 | 国产日韩欧美一区 | 老司机福利在线观看 | 国产在线中文字幕 | ririsao久久精品一区 | 中国电影黄色一级片免费观看 | 欧美极品一区二区三区 | 成人午夜精品一区二区三区 | 国产精品久久精品久久 | 日韩中文字幕在线观看 | 亚洲精品久久久 | 在线免费成人 | 日本久久久久久久久久 | 亚洲成人在线视频观看 | 香蕉av777xxx色综合一区 | 精品99在线 | 欧美日韩一区免费 | 国产在线1 | 欧美日本韩国一区二区三区 | 国产一区二区三区四区在线观看 | 91精品国产综合久久久久久丝袜 | www国产成人免费观看视频,深夜成人网 | 日韩国产在线观看 | 亚洲aⅴ网站 | 97在线播放| 国产综合久久久 | 三级特黄特色视频 | 久久久精品一区二区三区 | 天天干人人 | 97av| 一区二区三区国产精品 | 国产91网址 | 999精品一区 | 国产精品久久久久久网站 | 日本一区二区三区在线视频 | 国产小视频在线看 | 国产成人综合视频 | 日韩3级在线观看 | 久久在线播放 | 欧美成人免费网站 | 91久久精品日日躁夜夜躁欧美 | 玖玖视频在线 | 中文字幕国产视频 | 黄网免费看 | 精品国偷自产在线 | 天堂网色 | 亚洲午夜激情网 | 欧美精品中文字幕久久二区 | 吴梦梦到粉丝家实战华中在线观看 | 成人免费xxxxx在线视频软件 | 亚洲免费网址 | 国产精品777一区二区 | 成人激情在线 | 天天干干 | 亚洲精品免费视频 | 久久国内精品 | 看毛片网站 | 亚洲欧美在线免费 | 卡通动漫第一页 | 涩涩视频在线看 | 黄色一级影视 | 亚洲午夜性视频 | 久久久亚洲精品视频 | 天天操免费 | 成人h动漫免费观看网站 | 亚洲精品在线视频 | 一区二区在线免费观看 | 先锋资源中文字幕 | 国产成人精品久久 | 三级成人在线 | 成人久久| 国产精品视频一区二区三区 | 成人亚洲一区 | 成人国产精品久久 | 久久久影院 | 一级电影免费看 | 日韩欧美国产电影 | 大香一网| 国产在线精品一区二区三区 | 日韩视频一区二区三区四区 | 日韩一区二区精品视频 | 亚洲精品福利在线 | 日韩理伦在线 | 西西做爰免费视频 | 91精品视频在线播放 | 精品国产免费久久久久久尖叫 | 日韩av在线不卡 | 久久国产精品久久久久久 | 夜夜艹日日艹 | 欧美色综合一区二区三区 | 久久精品黄 | 国产成人精品电影 | 欧美v片| 欧美日韩一区二区三区不卡视频 | 夜夜操av| 麻豆专区一区二区三区四区五区 | 国产一区二区精品丝袜 | 久久久精品国产 | 视频在线一区 | 久久综合九色综合欧美狠狠 | 九九亚洲| 国产激情一区二区三区成人免费 | 九九精品视频在线观看 | 福利二区| 一区二区三区精品视频 | 狠狠躁夜夜躁人人爽天天高潮 | 国产一区二区三区在线免费观看 | 国产精品7| 午夜成人在线视频 | 日韩视频在线免费播放 | 精品国产一区二区国模嫣然 | 国产视频福利一区 | 久久国产精品久久久久久 | 精品国产一区二区三区久久久蜜月 | 99re热精品视频 | 免费福利网站 | 亚洲天堂一区 | 一区二区三区国产 | 亚洲国产视频网站 | 久久久久久久久一区 | 久久久免费精品 | 久草热8精品视频在线观看 黄色片网站视频 | 99re在线视频 | 日韩不卡一区二区三区 | 神马久久精品 | 一区二区三区在线观看视频 | 久久成人在线 | 精品亚洲一区二区三区 | 日韩在线不卡 | 国产精品欧美一区二区三区 | 一区二区三区在线免费 | 免费成人高清 | 欧美一区免费 | 久久精品一区二区三区四区 | www.亚洲 | av综合在线观看 | 中文字幕日韩一区二区三区 | zzzzyyyy精品国产 | 精品久久久久久久久久久久久久久久久久 | 在线观看免费视频91 | 国产精品久久久久久久久久久久冷 | 亚洲精品一区二区网址 | 国产精品中文字幕在线播放 | 成年人网站在线免费看 | 91黄在线观看 | 亚洲视频 欧美视频 | 中文字幕在线欧美 | 亚洲a人 | 精品国偷自产国产一区 | 国产一级特黄aaa大片评分 | 国产精品1区2区3区 欧美 中文字幕 | 黄色网页在线观看 | 一区二区国产在线观看 | 欧美激情网站 | 六月丁香啪啪 | 国产精品久久久久久久久久久小说 | 亚洲国产精品一区 | 日韩在线国产 | 激情在线观看视频 | 精品成人佐山爱一区二区 | 日韩成人视屏 | 91高清视频 | 精品视频在线免费观看 | 欧美中文字幕一区二区 | 99久久精品免费看国产一区二区三区 | 久久亚洲欧美日韩精品专区 | 国产在线一级片 | 一级黄色片视频 | 欧美在线 | 亚洲 | 妞干网av| 欧美日韩亚洲一区二区 | 色欧美日韩 | 欧美激情啪啪 | 一区二区视频在线观看 | 日本黄色片免费看 | 九一视频在线观看 | 久久精品久久综合 | 成人午夜免费视频 | 久久精品123 | 久久久久久久久中文字幕 | 欧美久久久久久久久久久久久久 | 欧美日韩在线第一页 | www.操.com | 久久久久亚洲精品 | 亚洲一区二区三区观看 | 视频一区二区三区中文字幕 | 久久久久久午夜 | 男女免费在线观看视频 | 韩日av在线 | 一区二区三区无码高清视频 | 欧美成人精品一区二区男人看 | 在线永久免费观看日韩a | 亚洲v在线 | 国产成人免费视频 | 亚洲精品影院在线 | 欧州一区二区三区 | 精品伦精品一区二区三区视频 | 久久久久一区二区 | 久久久国产一区二区三区 | 成人在线国产 | 亚洲高清av在线 | 久久久精品欧美一区二区免费 | 超碰在线播 | 国产三级网站 | 亚洲精品一区二三区 | 男人的天堂在线视频 | 91久久久www播放日本观看 | 欧美一区二区在线观看 | 日韩精品免费在线视频 | 久久久久久香蕉 | 一级免费黄色免费片 | 欧美国产在线观看 | 亚洲一区电影 | 成人在线网址 | 日韩在线一区二区 | 日韩精品在线观看视频 | 免费在线h | 亚洲高清视频一区二区三区 | 精品99免费 | 国产视频一区二区三区四区 | 人人干天天干 | 精品美女在线观看视频在线观看 | 午夜精品久久久 | 日韩中文在线 | 久久不色 | 国产浪潮av色综合久久超碰 | 天天操天天拍 | 国产精品日韩欧美一区二区三区 | 成人在线| 亚洲一区二区三区高清 | 91在线免费看 | 精品视频在线观看一区二区 | 在线观看精品视频网站 | 欧美精品影院 | 希岛爱理在线 | www色婷婷 | 国产美女在线观看 | 天天干人人 | 国产精品久久久久久亚洲调教 | 久久久久网站 | 国产精品网站在线观看 | 久久久www成人免费精品 | 美女午夜影院 | 精品久久影院 | 午夜影视剧场 | 久久免费精品视频 | 中文字幕一区二区三区乱码图片 | 九七超碰在线 | a视频在线 | 91精品久久久久久久久久 | 断背山在线 | 2020国产在线 | 成人在线播放网站 | 精品国精品国产自在久不卡 | 99精品欧美一区二区三区 | 午夜激情视频免费 | 这里只有精品在线视频观看 | 第一色网站 | 欧美国产精品一区二区 | 日韩爱爱网址 | 亚洲 欧美日韩 国产 中文 | 亚洲热在线视频 | 亚洲一区二区三区四区五区中文 | 免费日韩| 成人a在线视频免费观看 | 欧美一区二区三区在线观看视频 | 午夜影院免费 | 自拍小电影| 精品久久久久久久久久久久久 | 一区二区三区国产在线 | 国产成人影院在线观看 | 国产精品久久久久久久久污网站 | 亚洲中出| 国产成人aⅴ | 丁香五月网久久综合 | 女同理伦片在线观看禁男之园 | 欧美1级| 国产精品一区二区三区在线播放 | 超黄视频在线观看 | 中文字幕在线免费观看 | 在线中文字幕视频 | 亚州精品天堂中文字幕 | 一区二区三区观看视频 | 在线视频 中文字幕 | 成人亚洲黄色 | 美女久久久久 | 91tv亚洲精品香蕉国产一区 | av黄色在线观看 | 午夜成年人 | 亚洲精品一二三四五区 | 欧美激情精品久久久久久免费 | 欧美极品欧美精品欧美视频 | 久久成人在线 | 伊人网址| 亚洲中午字幕 | 一区二区在线看 | 国产主播福利 | 精品一区二区在线观看 | 欧美极品一区二区三区 | 激情欧美一区二区三区中文字幕 | 午夜激情福利视频 | 精品久久久久久久久久久久 | 日韩精品在线观看视频 | 欧美日韩一区二区三 | 免费的污网站 | 午夜在线视频 | 一级一片免费视频 | 成人免费一区二区三区视频网站 | 伊人久久精品久久亚洲一区 | 午夜免费福利电影 | 亚洲成人日本 | 99国产精品99久久久久久 | 亚洲第一色片 | 久在线视频 | 黄色片网站在线免费观看 | 麻豆精品一区二区 | 欧美日韩久久 | 日韩国产一区二区三区 | 国产精品一区二区三区四区五区 | 日韩精品一区在线 | av电影一区二区 | 欧美日韩在线精品 | 日本亚洲国产一区二区三区 | 日日人人 | 国产色视频在线观看免费 | av毛片在线免费看 | v片网站 | 国产综合视频 | 日韩精品视频在线 | 天堂在线一区二区 | 国产精品一区一区三区 | 亚洲第一成年免费网站 | 欧美日韩综合视频 | 亚洲一区二区三区四区五区中文 | 一区二区视频 | av综合在线观看 | 欧美一二三| 黄色免费av | 国产不卡在线 | 亚洲欧美中文日韩在线v日本 | 欧美白人做受xxxx视频 | 视频一区久久 | 国产精品久久久久久久久大全 | 日韩精品一区二区三区中文字幕 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 成人免费一区二区三区视频软件 | 香港三级日本三级a视频 | 国产一区91 | 黄色拍拍视频 | 欧美激情网址 | 色玖玖综合 | 亚洲精品在线视频观看 | 国产一区二区三区高清 | 噜噜噜噜狠狠狠7777视频 | 亚洲1级片 | 欧美理论片在线 | 亚洲一区视频在线 | 成人午夜影院 | 99色视频| 欧美综合成人网 | 欧美一区免费 | 久草视频在线看 | 国产精品九九九 | 色噜噜视频在线观看 | 精品成人国产 | av一区二区三区 | 这里只有精品视频 | 国产区区 | 性色av一区二区三区 | 国产精品国产三级国产aⅴ中文 | 日韩精品在线观看免费 | 亚洲国产精品久久人人爱 | 久久国产精品一区二区 | 大象视频成人在线观看 | k8久久久一区二区三区 | 成人午夜在线 | 亚洲影视一区二区 | 性色av一区二区三区 | 久久综合九色综合欧美狠狠 | av片在线观看 | 色鲁97精品国产亚洲 | 99国产视频 | 亚洲午夜精品片久久www慈禧 | 亚洲国产精品t66y | 女同久久另类99精品国产 |