2010-03-08 12 views
6

Como usamos la palabra clave "predeterminada" como un especificador de acceso, y también se puede usar en declaraciones de cambio con un propósito completamente diferente, así que tuve curiosidad de que haya otras palabras clave en Java que se puedan usar en más de un propósito¿La misma palabra clave para dos propósitos en java?

+10

No puede usar 'default' como especificador de acceso. Simplemente no usa ningún especificador para obtener acceso predeterminado. –

+0

Dupe de http://stackoverflow.com/questions/2402468/same-keyword-for-two-purposes-in-java –

+4

Este es el original: se crearon dos engaños adicionales. –

Respuesta

4
  • default se puede utilizar tanto en un interruptor y como valor predeterminado en una anotación (como lo señala Bozho)
  • final significa "no se puede derivar de/anulados" y "es de sólo lectura" que son dos diferentes - pero relacionados - significados (como se ha señalado por Jon)
  • extends puede ser utilizado tanto para especificar el supertipo de una clase y se puede utilizar en comodines y variables de tipo para poner una restricción (relacionado, pero no exactamente igual) (List<? extends Foo>)
  • super puede usarse para especificar a algo en una superclase de la corriente clase, o en un comodín para poner una restricción (List<? super Foo>)
  • static significa tanto "parte de la clase, no una instancia" (para los métodos, atributos o inicializadores) y como static import
  • class declarar una clase (class Foo {}), o para referirse a una clase literal (Foo.class) (como respondidas por ILMTitan)
  • (for se puede utilizar en una normal para bucle y la "mejorado" para, pero eso es más como una sobrecarga (como Bozho pone tan bien) que realmente tiene dos significados)
7

No se puede usar default como especificador de acceso, por lo que no creo que ni siquiera eso cuente. (EDITAR: Como señaló Bozho, se puede usar en anotaciones).

final significa "no se puede derivar/sobreescribir" y "es de solo lectura", que son dos significados diferentes, pero relacionados.

2

La palabra clave default no se utiliza como especificador de acceso. La ausencia de private, protected y public significa el uso de default.

Ejemplo:

class Test { // default access for class. 

int A; // default access for the class member. 
} 

Algunos ejemplos de palabras clave de Java que encuentran uso diferente son:

  • final: Un finalclass no puede tener subclases, un método final no puede ser cambiada, y una final variable puede ocurrir a lo sumo una vez como una expresión de la mano izquierda.

  • Super: Se utiliza para acceder a los miembros de una clase heredada por la clase en la que aparece, también se utiliza para reenviar una llamada de un constructor a un constructor en la superclase.

  • Static: Se utiliza para crear bloques de inicialización static, también staticstatic miembros y las importaciones.

  • for: Se utiliza para la for bucle convencional y el bucle más reciente de Java 1.5 enhanced for.

+0

Esta es una buena agregación de todas las demás respuestas –

+0

Si considera super para tener dos propósitos, entonces debe considerar 'this' tener al menos dos propósitos. – Yishai

13

El "default" en el caso de modificador de acceso no es una palabra clave - no se escribe:
default void doSomething()

Sin embargo, cuando se especifica el valor por defecto de un atributo de anotaciones - se es.

switch (a) { 
    default: something(); 
} 

y

public @interface MyAnnotation { 
    boolean bool() default true; 
} 

Eso, junto con final como se ha señalado por Jon Skeet parece cubrir todo. Tal vez, salvo la "sobrecarga" for palabra clave:

for (initializer; condition; step) y for (Type element : collection)

0

me dio un vistazo a java keywords pero parece que las palabras clave son únicos .. se puede comprobar usted mismo.

Por cierto default no se puede utilizar como un especificador de acceso, se hereda cuando no se especifica ninguno.

2

Los static métodos asociados de palabras clave y campos con una clase en lugar de las instancias de esa clase, sino que también se usa para significar secciones de inicialización estáticas como en:

public class MyClass 
{ 
    private static int a; 

    static 
    { 
     a = 1; 
    } 

    public static void doSomethingCool() 
    { 
     ... 
    } 
} 

comentario de Pascal me recordaba a las importaciones estáticas:

import static MyClass.doSomethingCool; 

public class MyOtherClass 
{ 
    public void foo() 
    { 
     // Use the static method from MyClass 
     doSomethingCool(); 
    } 
} 
+0

Plus static import (http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html) –

+0

@Pascal ooo, gracias, ¡Acabo de enterarme de eso recientemente! –

2

La palabra clave final puede significar cosas diferentes.

  • Cuando se modifica classes significa que la clase no se puede subclasificar.
  • Al modificar un method, significa que el método no puede ser anulado.
  • Al modificar un variable, significa que la variable no puede apuntar a ninguna otra variable.
0

¿Realmente utilizamos default como especificador de acceso? Ningún especificador en absoluto es "predeterminado". Pero no usa la palabra clave de esa manera.

0

última tiene diferentes usos:

  • en una declaración de variables que significa una variable no se puede cambiar.
  • En una firma de método, significa que un método no puede ser anulado
  • En una lista de parámetros, significa que una variable no puede ser alterada en un método.
+0

En una lista de parámetros parecería ser lo mismo que una declaración de variable local. – Yishai

0

La palabra clave "extends" puede ser para herencia simple (implementación o "clase abstracta pura" también conocida como "herencia de interfaz" en Java).

La palabra clave "extends" también se puede usar para la herencia múltiple (interfaz).

Los que siempre argumentan que Java no es compatible con herencia múltiple tendrán, por lo tanto, dificultades para argumentar que "se extiende" en esos dos casos está haciendo exactamente lo mismo.

Ahora estoy en el otro campo: considero que la herencia de múltiples interfaces es herencia múltiple y esa herencia de implementación es solo un detalle de OOP (que no existe en el nivel OOA/OOD) y por lo tanto considero que " se extiende" que realmente está haciendo lo mismo en ambos casos y que, por tanto, mi respuesta no responder a la pregunta :)

pero es una palabra clave interesante de todas formas :)

3

Algo que nadie más ha mencionado aún: la palabra clave clase tiene dos usos diferentes.

La declaración de una clase:

class Test{}; 

e indicando una clase literal:

Class<Test> testClass = Test.class; 
0

Se puede pensar en las siguientes cosas

  1. defecto
  2. finales
  3. súper
  4. ":" (colon) que se utiliza en diferentes lugares, lo cual tiene un significado diferente en diferentes lugares
0

Como todas las otras respuestas han dicho, hay muchas palabras clave que los propósitos múltiples servidores en función de contexto.Solo quería agregar que hay una razón para esto: hay una fuerte aversión a agregar palabras clave porque esas adiciones rompen el código existente, por lo que cuando se agregan nuevas características, las palabras clave existentes se usan si se ajustan razonablemente, como super y extends para genéricos y predeterminados para anotaciones, o simplemente se saltan como en los dos puntos usados ​​en el bucle for mejorado.

Así que mi punto es esperar que a medida que el lenguaje continúa evolucionando, se encuentran aún más usos para las palabras clave existentes en lugar de introducir palabras nuevas.

0

BTW no existe un especificador de acceso en Java. El término en el JLS es 'modificador de acceso'.

Cuestiones relacionadas