En C ++, marcar una función miembro const
significa que puede llamarse en const
instancias. Java no tiene un equivalente a esto. P.ej:
class Foo {
public:
void bar();
void foo() const;
};
void test(const Foo& i) {
i.foo(); //fine
i.bar(); //error
}
Los valores se pueden asignar, una vez, más tarde en Java solo, por ejemplo:
public class Foo {
void bar() {
final int a;
a = 10;
}
}
es legal en Java, pero no en C ++ mientras que:
public class Foo {
void bar() {
final int a;
a = 10;
a = 11; // Not legal, even in Java: a has already been assigned a value.
}
}
Tanto en Java como en C ++, las variables miembro pueden ser final
/ const
respectivamente. Es necesario darles un valor para cuando se termine de construir una instancia de la clase.
En Java se deben configurar antes de que el constructor haya terminado, esto se puede lograr de una de dos maneras:
public class Foo {
private final int a;
private final int b = 11;
public Foo() {
a = 10;
}
}
En C ++ necesitará usar listas de inicialización para dar a los const
miembros un valor:
class Foo {
const int a;
public:
Foo() : a(10) {
// Assignment here with = would not be legal
}
};
En Java final se puede usar para marcar cosas como no reemplazables. C ++ (pre-C ++ 11) no hace esto. P.ej:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Pero en C ++:
class Bar {
public:
virtual void foo() const {
}
};
class Error: public Bar {
public:
// Fine in C++
virtual void foo() const {
}
};
Esto está bien, porque la semántica de marcar una función miembro const
es diferente. (También puede sobrecargar al tener solo const
una de las funciones miembro. (Tenga en cuenta también que C ++ 11 permite que las funciones miembro se marquen como finales, consulte la sección de actualización de C ++ 11)
Actualización de C ++ 11:
De hecho, C ++ 11 le permite marcar tanto las clases como las funciones miembro como final
, con semántica idéntica a la misma característica en Java, por ejemplo en Java:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Ahora se puede escribir exactamente en C ++ 11 como:
class Bar {
public:
virtual void foo() final;
};
class Error : public Bar {
public:
virtual void foo() final;
};
Tuve que compilar este ejemplo con un prelanzamiento de G ++ 4.7. Tenga en cuenta que esto no reemplaza const
en este caso, sino que lo aumenta, proporcionando el comportamiento similar a Java que no se vio con la palabra clave C ++ equivalente más cercana. Entonces, si quisieras que una función miembro fuera ambas final
y const
harías:
class Bar {
public:
virtual void foo() const final;
};
(Se requiere el orden const
y final
aquí).
Anteriormente no había un equivalente directo de las const
funciones miembro, aunque hacer que las funciones no virtual
fueran una opción potencial, aunque sin causar un error en el momento de la compilación.
Asimismo el Java:
public final class Bar {
}
public class Error extends Bar {
}
se convierte en C ++ 11:
class Bar final {
};
class Error : public Bar {
};
(Anteriormente, los private
constructores eran probablemente lo más cercano a esto en C ++)
Curiosamente, para mantener la compatibilidad con el código anterior a C ++ 11 final
no es una palabra clave de la manera habitual. (Tome el ejemplo trivial y legal de C ++ 98 struct final;
para ver por qué convertirlo en una palabra clave rompería el código)
final int a; a = 10; a = 11;
no lo es (ese es el propósito definal
un modificador variable). Además, los miembros finales de una clase solo se pueden establecer en el momento de la declaración, o una vez en un constructor .final
decorador de funciones miembro para este propósito exacto. VC ++ 2005, 2008 y 2010 ya lo tienen implementado, utilizando la palabra clave contextual ensealed
lugar definal
.En Java, la palabra clave final se puede usar para cuatro cosas:
Una cosa importante es: ¡una variable miembro final de Java debe establecerse exactamente una vez! Por ejemplo, en un constructor, declaración de campo o intializador. (Pero no puede establecer una variable miembro final en un método).
Otra consecuencia de hacer que una variable miembro sea final se relaciona con el modelo de memoria, que es importante si trabaja en un entorno roscado.
fuente
Un
const
objeto solo puede llamarconst
métodos, y generalmente se considera inmutable.Un
final
objeto no se puede establecer en un nuevo objeto, pero no es inmutable: no hay nada que impida que alguien llame a ningúnset
método.Java no tiene una forma inherente de declarar objetos inmutables; necesita diseñar la clase como inmutable usted mismo.
Cuando la variable es un tipo primitivo,
final
/const
trabajar de la misma.fuente
Java final es equivalente a C ++ const en tipos de valores primitivos.
Con los tipos de referencia de Java, la palabra clave final es equivalente a un puntero constante ... es decir
fuente
Ya tiene algunas respuestas excelentes aquí, pero un punto que parecía valioso agregar:
const
en C ++ se usa comúnmente para evitar que otras partes del programa cambien el estado de los objetos. Como se ha señalado,final
en Java no se puede hacer esto (excepto para las primitivas), solo evita que la referencia se cambie a un objeto diferente. Pero si está utilizando aCollection
, puede evitar cambios en sus objetos utilizando el método estáticoEsto devuelve una
Collection
referencia que da acceso de lectura a los elementos, pero arroja una excepción si se intentan modificaciones, lo que lo hace un poco comoconst
en C ++fuente
De Java
final
funciona solo en tipos y referencias primitivas, nunca en instancias de objetos en las que la palabra clave const funcione en nada.Comparar
const list<int> melist;
confinal List<Integer> melist;
el primero hace que sea imposible modificar la lista, mientras que el último solo le impide asignar una nueva lista amelist
.fuente
¡Además de tener ciertas y sutiles propiedades de subprocesos múltiples , las variables declaradas
final
no necesitan inicializarse en la declaración!es decir, esto es válido en Java:
Esto no sería válido si se escribiera con C ++
const
.fuente
De acuerdo con wikipedia :
fuente
Supongo que dice "aproximadamente" porque el significado de
const
en C ++ se complica cuando se habla de punteros, es decir, punteros constantes frente a punteros a objetos constantes. Como no hay punteros "explícitos" en Java,final
no tiene estos problemas.fuente
Permítanme explicar lo que entendí con un ejemplo de cambio / declaración de caso.
Los valores en cada declaración de caso deben ser valores constantes en tiempo de compilación del mismo tipo de datos que el valor del interruptor.
declare algo como a continuación (ya sea en su método como instancias locales, o en su clase como variable estática (agregue estática entonces) o una variable de instancia.
y
Este código no se compilará si
color1
es una variable de clase / instancia y no una variable local. Esto se compilará sicolor1
se define como estático final (entonces se convierte en variable estática final).Cuando no se compila, recibirá el siguiente error
fuente
La palabra clave "const" significa que su variable se guarda en ROM (con microprocesador). en la computadora, su variable se guarda en el área RAM para el código de ensamblaje (solo lectura RAM). significa que su variable no está en la memoria RAM grabable incluye: memoria estática, memoria de pila y memoria de montón.
La palabra clave "final" significa que su variable se guarda en la memoria RAM que se puede escribir, pero observa al compilador que su variable solo cambia una vez.
Creo que "const" es malo en rendimiento, por lo que Java no lo usa.
fuente