Title: Clases y objetos
1Clases y objetos
2Clases y objetos
- La unidad fundamental del lenguaje Java es la
clase, que proporciona la estructura de los
objetos y mecanismos para fabricarlos, a partir
de su definición - Las clases definen métodos colecciones de código
ejecutable que es el foco de la computación y que
manejan los datos almacenados en los objetos. - Los métodos proporcionan el comportamiento de los
objetos de una clase.
3Clases y objetos
- La programación orientada a objetos separa
estrictamente la noción de qué se va a hacer de
cómo se va a hacer - El qué está descripto por un conjunto de
métodos y su semántica asociada - Esta combinación se describe generalmente como un
contrato entre el diseñador de la clase y el
programador que la utiliza, porque dice lo que
ocurre cuando se invocan ciertos métodos sobre un
objeto - Este contrato define un tipo, de forma que todos
los objetos que sean instancias de ese tipo
respetan el contrato
4Clases y objetos
- El contrato del método, que incluye su signatura
y su semántica (aunque sólo se describa en la
documentación), define lo que significa - El cómo de un objeto está definido por su
clase, que define la implementación de los
métodos que tiene el objeto.
5Clases y objetos
- Cada objeto es una instancia de una clase.
- Cuando se invoca a un método sobre un objeto, se
examina la clase para obtener el código a
ejecutar. - Un objeto puede utilizar a otros objetos para
realizar su trabajo
6Una clase simple
- Para declarar una clase se usa la palabra class.
7Una clase simple
- Una declaración de clase crea un nombre de tipo,
por lo que las referencias a objetos de ese tipo
pueden declararse simplemente como - // declara referencia a puntos 3D
- Point3D pt1, pt2, pt3
- Esta declaración indica que pt1, pt2 y pt3 son
variables que pueden almacenar una referencia a
un objeto de tipo Point3D
8Una clase simple
- La declaración no crea un objeto, sino que
declara sólo una referencia a la que le está
permitido referirse a un objeto Point3D, durante
su existencia la misma puede referirse a
distintos objetos Point3D. - Esos objetos deben crearse explícitamente
9Miembros de una clase
- Por ahora, una clase puede tener 2 clases de
miembros - Los campos son variables de datos asociadas con
una clase y sus objetos. Almacenan el estado de
una clase u objeto. - Los métodos contienen el código ejecutable de una
clase y definen el comportamiento de los objetos
10Modificadores de clase
- Una declaración de clase puede estar precedida de
modificadores de clase que le otorgan ciertas
propiedades, por ahora veremos - public la clase es accesible públicamente,
cualquier clase puede declarar referencias a
objetos de ella o acceder a sus miembros
públicos. Sin este modificador la clase es sólo
accesible dentro de su propio paquete.
11Modificadores de clase
- La mayoría de las herramientas de desarrollo Java
requieren que se declare una clase public en un
archivo con el mismo nombre que la clase y, por
tanto, sólo puede haber una clase public
declarada por archivo
12Campos
- Las variables de una clase se llaman campos. Ej.
Las variables x, y y z de la clase Point3D. Cada
objeto de esta clase tiene sus instancias
específicas de los 3 campos - La declaración de un campo consiste en un nombre
de tipo seguido del nombre del campo y
opcionalmente de una cláusula de inicialización,
para dar al campo un valor inicial. - Al dar a cada objeto diferente una instancia
diferente de sus campos, cada uno tiene su propio
estado único (variables de instancia). Al cambiar
el campo x de un objeto Point3D no se afecta al
campo x de cualquier otro Point3D.
13Campos
- Las declaraciones de los campos pueden precederse
también con modificadores que controlan ciertas
propiedades de los mismos. Por ahora veremos los
siguientes y se recomienda al aplicar varios
seguir este orden - Modificadores de acceso
- static
- final
14Inicialización de los campos
- Cuando se declara un campo, puede inicializarse
asignando un valor del tipo correspondiente - El inicializador (o expresión de inicialización)
puede ser una constante, otro campo, una
invocación a un método, o una expresión que
involucre las 3 cosas. El único requisito es que
sea del tipo correcto. - Aunque los inicializadores proporcionan una gran
flexibilidad en la forma de inicializar los
campos, sólo son adecuados en esquemas simples de
inicialización, en esquemas más complejos son
necesarias herramientas adicionales
15Inicialización de los campos
double cero0.0//constante double suma 4.5
3.7 //expresión constante double copiaCero
cero //campo double raizDos Math.sqrt(2)//
invocación a un método double algunVal sum
2Math.sqrt(raizDos) //mezcla
16Inicialización de los campos
- Si un campo no se inicializa, se le asigna un
valor inicial por defecto, en función del tipo
17Campos estáticos
- Algunas veces se desea tener sólo una instancia
de un campo, compartida por todos los objetos de
una clase. Esos campos ( campos estáticos o
variables de clase) se declaran como static. - Cuando se declaran sólo existe una copia del
mismo, independientemente del número de
instancias de la clase que se creen. - Ejemplo static int sigID0
18Campos estáticos
- El campo se inicializa con un valor 0 cuando se
inicializa la clase, después de cargarla. Cada
objeto que se crea tiene asignado como
identificador el valor en curso sigID - Puede ser referido directamente dentro de la
clase pero cuando se accede externamente a él,
hay que usar el nombre de la clase. Ej - System.out.println(Point3D.sigID)
- Es el tipo de la referencia, el que determina la
clase en que hay que buscar la variable estática
19Campos final
- Es aquél cuyo valor no se puede cambiar después
de ser inicializado. En general, se usan para
definir propiedades inmutables de una clase u
objeto, es decir aquéllas que no cambian durante
el tiempo de vida de la clase u objeto
20Campos final
- Si el campo no tiene un inicializador se llama
final en blanco. Es útil cuando no se puede
inicializar el campo en forma simple. Se deben
inicializar una vez que la clase se ha
inicializado (en el caso de campos final
estáticos), o una vez que el objeto de la clase
se ha construido completamente (caso no estáticos)
21Campos final
- El compilador se asegura de esto y rechaza
compilar una clase si determina que un campo
final no queda inicializado. - Si una propiedad cambia poco frecuentemente, en
vez de ser verdaderamente inmutable no es
apropiado un campo de este tipo. - Sino se conoce el valor de un campo cuando se
crea el objeto tampoco (incluso aunque sea
lógicamente inmutable)
22Campos final
- Si la inicialización del campo es costosa y el
valor no se necesita frecuentemente puede ser más
práctico retrasar la inicialización del campo
hasta que se necesite su valor (inicialización
perezosa), que no se puede aplicar a un campo de
este tipo. Puede reducir la sobrecarga en
situaciones en las que no es necesario crear
siempre el objeto
23Control de acceso
- Si cualquier miembro de una clase fuese accesible
para cualquier clase u objeto la comprensión,
depuración y mantenimiento de los programas sería
una tarea casi imposible, sería imposible fiarse
de los contratos presentados por las clases
cualquier segmento de código podría acceder a un
campo y cambiarlo de forma que se violara un
contrato.
24Control de acceso
- Uno de los puntos más fuertes de la programación
orientada a objetos es que proporciona soporte
para el encapsulamiento y la ocultación de datos.
Se necesita una forma de controlar quien accede a
qué miembros de una clase, incluso quién accede a
la propia clase. Este control se especifica
usando modificadores de acceso en las
declaraciones de clases y miembros.
25Control de acceso
- Todos los miembros de una clase son siempre
accesibles al código de la propia clase. Para
controlar el acceso desde otras clases, los
miembros de una clase tienen, por ahora, los
siguientes modificadores de acceso - private los miembros son sólo accesibles en la
propia clase
26Control de acceso
- package los miembros declarados sin modificador
de acceso son accesibles en todas las clases del
mismo paquete, así como en la propia clase - public los miembros son accesibles en cualquier
parte donde la clase sea accesible - El modificador private sólo se aplican a
miembros, no a las propias clases. Para que un
miembro sea accesible desde una sección de código
de alguna clase, primero dicha clase debe ser
accesible a ese código
27Control de acceso
- Es importante tener en cuenta que el control de
acceso se realiza al nivel de clase, no al nivel
de objeto. Esto significa que los miembros de una
clase son siempre accesibles desde todo el código
escrito en esa clase, independientemente de qué
instancia del código está siendo aplicada.
28Control de acceso
- Los miembros públicos se deben ver como
contractuales ya que, código que no controlamos
se puede fiar de ellos. Cambiarlos puede ser
imposible después que exista dicho código que se
base en su funcionalidad pública. - El acceso privado y de paquete son parte de
nuestra implementación, oculta del exterior - Las clases de un mismo paquete deberían estar
relacionadas
29Creación de objetos
- La construcción mediante new es con mucho la
forma más común de crear objetos, se especifica
el tipo de objeto que se desea crear y los
parámetros que se utilizarán para su
construcción. - El sistema en tiempo de ejecución reserva espacio
suficiente para almacenar los campos del objeto y
lo inicializa como se verá - Cuando la inicialización se completa el sistema
en tiempo de ejecución devuelve una referencia al
nuevo objeto
30Creación de objetos
- Si el sistema no puede encontrar espacio
suficiente para crear el objeto, puede usar el
recolector de basura para intentar obtener
espacio. Si a pesar de todo no se consigue se
muestra un mensaje OutOfMemoryError - Una vez creado un nuevo objeto se inicializan sus
variables
31Creación de objetos
- Los objetos creados nunca se borran
explícitamente. La máquina virtual gestiona la
memoria por nosotros, usando recogida de basura,
ella puede reclamar espacio de objetos que
posiblemente no se van a usar más sin nuestra
intervención. - Si un objeto no se necesita más, dejaremos de
referirnos a él. En el caso de variables locales
dentro de métodos esto puede ser tan simple como
retornar del mismo (cuando el método no se
ejecuta, posiblemente ninguna de sus variables se
utilizará). En el caso de campos, se los puede
poner a null.
32Construcción e inicialización
- Un objeto de nueva creación recibe un estado
inicial. Los campos pueden inicializarse dándoles
un valor cuando se declaran o pueden aceptar su
valor por defecto, lo que algunas veces es
suficiente para asegurar un valor inicial
correcto. - Con frecuencia es necesario algo más que una
inicialización simple para crear el estado
inicial. El código de creación de un objeto puede
necesitar suministrar datos iniciales o realizar
operaciones que no pueden expresarse mediante una
simple asignación
33Constructores
- Para realizar cometidos más complejos que la
simple inicialización, las clases pueden tener
constructores bloques de sentencias que pueden
usarse para inicializar un objeto antes de que se
devuelva una referencia a dicho objeto mediante
new. - Los constructores tienen el mismo nombre de la
clase que inicializan. Como los métodos pueden
admitir 0 o más parámetros. Si los hay se
proporcionan entre los () que siguen al nombre
del tipo cuando se crea el objeto con new.
34Constructores
- Los constructores se invocan después de que las
variables de instancia del objeto de nueva
creación tengan asignados sus valores iniciales
por defecto y después de que sus inicializadores
explícitos se hayan ejecutado
35Constructores
36Constructores
- La declaración de un constructor consiste en el
nombre de la clase seguido por una lista de
parámetros (puede estar vacía) entre () y un
cuerpo de sentencias encerradas entre . - Pueden tener cualquier modificador de acceso como
miembros de una clase, pero no son miembros de
una clase
37Constructores
- Cuando el constructor vuelve de las invocaciones,
todos los campos de datos del nuevo objeto tienen
asignado algún valor inicial razonable.
int a1 10, b1 -5, c1 4 // para
constructor // declara referencia a puntos 3D
Point3D pt2 // instancia pt2 new
Point3D(a1, b1, c1)
38Constructores
- No son métodos y por tanto no tienen tipo de
retorno - Se puede proporcionar más de un constructor que
invoque a otro de la misma clase usando la
invocación (explícita a un constructor) this()
como su primera sentencia ejecutable
(obligatorio) - Si el constructor que se desea invocar tiene
parámetros, se pueden pasar a la invocación al
constructor. El tipo y número de ellos están
determinados por el constructor que se invoca.
39Constructores
40Constructores
- La lista de parámetros determina a qué versión
del constructor se invoca como parte de la
expresión new - Cualquier expresión que se use como parámetros en
la invocación explícita a un constructor no debe
referirse a campos o métodos del objeto actual. A
todos los efectos, no hay objeto actual en este
estado de construcción
41Constructores
- Razones típicas para proporcionar constructores
especializados - Algunas clases no tienen un estado inicial
razonable sin parámetros - Proporcionar un estado inicial resulta
conveniente y razonable cuando se construyen
ciertas clases de objetos
42Constructores
- La construcción de un objeto puede ser una
operación potencialmente costosa, por lo que es
conveniente que los objetos tengan un estado
inicial correcto cuando se crean. Ej. cada
objeto de una clase tiene una tabla disponer un
constructor para especificar el tamaño inicial de
ella es más eficiente que crearla con tamaño por
defecto
43Constructores
- Un constructor que no es público impone
restricciones sobre quién puede crear objetos
utilizándolos. Ej evitar que programadores usen
nuestro paquete para crear instancias de una
clase haciendo sus constructores sólo accesibles
desde el interior del paquete
44Constructores
- Aquéllos sin parámetros son tan habituales que se
los llama no-arg (de no argumentos (parámetros)) - Sino proporcionamos constructores de algún tipo
para una clase, el lenguaje proporciona un
constructor de este tipo que no hace nada
(constructor por defecto), sólo se proporciona
automáticamente sino existen otros constructores,
puesto que hay clases para las que un
construrctor no-arg sería incorrecto.
45Constructores
- Si se desea tener simultáneamente un constructor
no-arg y uno o más constructores con parámetros,
hay que proporcionar explícitamente un
constructor no-arg. - El constructor por defecto tiene la misma
accesibilidad que la clase en la que se define
46Constructores
- Existe otro constructor que se denomina
constructor de copia que toma un parámetro del
tipo del objeto actual y construye un nuevo
objeto como una copia del objeto que se pasa. - Generalmente esto es una forma de asignar los
mismos valores a todos los campos pero algunas
veces la semántica de una clase dicta acciones
más sofisticadas
47Constructores
- public Point3D(Point3D otro)
- this.xotro.x
- this.yotro.y
- this.zotro.z
-
- public Point3D(int low, int high)
- //random x,y,z generado en el rango low..high
- x (int) (low Math.random() (high - low))
- y (int) (low Math.random() (high - low))
- z (int) (low Math.random() (high - low))
48Bloques de inicialización
- Otra forma de realizar inicializaciones más
complejas de campos es utilizar estos bloques - Son bloques de sentencias que aparecen dentro de
la declaración de la clase y fuera de la
declaración de cualquier miembro o constructor, y
que inicializa los campos del objeto
49Bloques de inicialización
- Se ejecuta como si estuviese situado al principio
de cada constructor de la clase - Si hay múltiples bloques se ejecutan en el orden
en que aparecen en la clase
50Bloques de inicialización
- public Point3D
- private int x, y, z
- private int numId
- private static int sigID0
-
- numIdsigID
-
- public Point3D(int x1, int y1, int z1)
- xx1
- yy1
- zz1
51Bloques de inicialización
- En la práctica, los bloques de inicialización
tienden a ser utilizados en inicializaciones no
triviales, cuando no se necesitan parámetros de
construcción - Se usan para la inicialización pero en la
práctica pueden servir para cualquier cosa, ya
que el compilador no comprueba lo que hacen
52Inicialización estática
- Los campos estáticos de una clase pueden tener
inicializadores pero además se pueden realizar
una inicialización estática más compleja usando
un bloque de inicialización estática. - Son muy parecidos a los no estáticos excepto
porque se declaran static, sólo pueden referirse
a miembros estáticos de la clase.
53Inicialización estática
- Ej. La creación de un array estático y la
inicialización de sus elementos se puede hacer
algunas veces con sentencias ejecutables. - El orden de inicialización dentro de una clase es
desde el primero al último. Cada inicializador de
un campo o bloque de inicialización se ejecuta
antes que el siguiente, desde el inicio del
código hasta el final. - Se ejecutan cuando se carga la clase
54Inicialización estática
- class Primos
- static int primosConocidosnew int4
- //se crea antes de ejecutar el bloque
- static
- primosConocidos02
- for(int i1 iltprimosConocidos.lengthi)
- primosConocidosisigPrimo()
- //el campo static ha sido inicializado
- //declaración de sigPrimo()
-
55Métodos
- Contienen el código que entiende y maneja el
estado de un objeto. - Algunas clases tienen campos públicos para que
los programadores los manejen directamente, esto
no es muy buena idea en la mayor parte de los
casos. Muchos objetos tienen tareas que no pueden
representarse como la lectura o modificación de
un simple valor, sino que requieren cómputo
56Métodos
- La declaración de un método consta de 2 partes
la cabecera y el cuerpo - La cabecera consta de una serie de modificadores,
el tipo de retorno del método y la signatura - La signatura consta del nombre del método y la
lista de parámetros (que puede estar vacía) entre
(). - Todos los métodos deben tener un tipo de retorno
y una signatura, los modificadores son opcionales
57Métodos
- El cuerpo consta de las sentencias encerradas
entre llaves - Por ahora, los modificadores de un método pueden
ser - Modificadores de acceso
- static
- Cuando se usan varios se recomienda seguir este
orden
58Métodos estáticos
- Se invoca en nombre de una clase completa, no
sobre un objeto específico instanciado a partir
de esa clase. - Se conocen como métodos de clase
- Podrían realizar una tarea general para todos los
objetos de la clase, ejemplo devolver el
siguiente número de serie
59Métodos estáticos
- Pueden acceder sólo a campos estáticos o a otros
métodos estáticos de la clase. Los miembros no
estáticos deben accederse mediante una referencia
a un objeto y no hay ninguna referencia a un
objeto disponible dentro de un método estático.
No hay referencia this
60Invocaciones de métodos
- Los métodos se invocan como operaciones sobre
objetos, mediante referencias usando el operador
punto (.) - referencia.método(parámetros)
- Cada método se declara con un número específico
de parámetros, cada uno de ellos de un tipo
específico un tipo primitivo o un tipo de
referencia.
61Invocaciones de métodos
- No pueden declararse métodos con un número
variable de parámetros, aunque es posible
declarar un método con un array de objetos como
parámetro. - Cuando se invoca a un método, el que lo invoca
debe proporcionar un parámetro del tipo apropiado
para cada uno de los parámetros declarados en el
método - Los métodos también tienen un tipo de retorno,
primitivo o de referencia. Si un método no
devuelve ningún valor se pone void
62Invocaciones de métodos
- En lugar de acceder y preguntar por todos los
campos del objeto (estado), una clase puede
definir un método que devuelva una representación
en cadena de texto del estado del mismo
63Invocaciones de métodos
64Invocaciones de métodos
- El método construye una cadena y la resultante se
devuelve al que invoca mediante la sentencia
return - El método toString de un objeto es especial. Se
invoca para obtener un String cuando se utiliza
un objeto en una concatenación de cadenas de
texto con el operador .
65Invocaciones de métodos
- System.out.println("Punto 2 ahora es " pt2)
- Los métodos toString se invocan implícitamente
- Todos los objetos tienen este método, tanto si su
clase define uno explícitamente o no, es porque
todas las clases extienden de Object que define
este método
66Ejecución de un método y retorno
- Cuando se invoca a un método, el flujo de control
pasa del método que invoca al método invocado y,
se ejecutan las sentencias del mismo en
secuencia, de acuerdo con la semántica de dichas
sentencias. Un método completa su ejecución y
retorna al que lo llama cuando sucede una de
estas 3 cosas se ejecuta una sentencia return,
se alcanza el final del método o se lanza una
excepción no capturada
67Ejecución de un método y retorno
- Si un método devuelve algún resultado, este debe
ser único, o un valor primitivo o una referencia
a un objeto. - Si necesita devolver más de un resultado pueden
conseguir este efecto de varias formas devolver
referencias a objetos que almacenan los
resultados como campos, tomar uno o más
parámetros que se refieran a objetos en los que
almacenar los resultados o, devolver un array que
contenga los resultados.
68Ejecución de un método y retorno
// mueve pt1 de nuevo y chequea si es igual a
pt2 Point3D pt4 pt1.translate(shift2X,
shift2Y, shift2Z)
69Ejecución de un método y retorno
- En métodos que devuelvan un valor cualquier vía
de ejecución del método debe, o bien retornar un
valor que sea asignable a una variable del tipo
de retorno declarado o bien lanzar una excepción.
70Valores de parámetros
- Todos los parámetros de métodos se pasan por
valor. Los valores de las variables parámetro en
un método son copias de los valores que el que lo
invoca especificó como parámetros. - Si se pasa un double a un método, su parámetro es
una copia del valor que se pasa como parámetro y,
un método puede cambiar el valor de su parámetro
sin afectar los valores en el código que lo invocó
71Valores de parámetros
- public class PasaPorValor
- public static void main(String args)
- double uno1.0
- System.out.println("antes uno "uno)
- calculaMitad(uno)
- System.out.println("después uno "uno)
-
- public static void calculaMitad(double arg)
- arg/2.0//divide arg por 2
- System.out.println("mitad arg "arg)
-
72Valores de parámetros
antes uno 1.0 mitad arg 0.5 después uno 1.0
73Valores de parámetros
- Cuando el parámetro es una referencia a un
objeto, la referencia al objeto es lo que se pasa
por valor (no el objeto mismo). Por tanto se
puede cambiar a qué objeto se refiere un
parámetro dentro de un método sin afectar la
referencia que se pasó. Pero si se cambian campos
del objeto o se invocan métodos que cambian el
estado del objeto, el objeto quedará modificado
en cualquier parte del programa que se refiera a
él (ambos apuntan al mismo área de memoria)
74Valores de parámetros
75Valores de parámetros
76Valores de parámetros
77Valores de parámetros
- Si origen y destino son las mismas cuentas pueden
anularse sus saldos
78Valores de parámetros
79Valores de parámetros
80Valores de parámetros
- Los parámetros de los métodos pueden declararse
final, lo que significa que el valor del
parámetro no cambiará mientras el método se
ejecuta, el compilador chequea este hecho - Esta declaración puede ayudar además al
compilador o a la máquina virtual a optimizar
algunas expresiones que utilicen el parámetro,
dado que se sabe que no se va a modificar
81Valores de parámetros
- Un modificador final sobre un parámetro es un
detalle de implementación que afecta sólo al
código del método, no al código de quien invoca
al método. Por tanto se puede cambiar la
condición de final de un método sin afectar a
cualquier posible código que invoque al método
82Uso de métodos para control de acceso
- Para forzar que el acceso a un campo sea de sólo
lectura durante el tiempo de vida del objeto se
lo puede ocultar haciéndolo private y
proporcionar un nuevo método de forma que el
código externo a la clase pueda leer su valor
utilizando ese método (métodos accesores)
83Uso de métodos para control de acceso
- Incluso aunque una aplicación no requiera que los
campos sean de sólo lectura, hacer los campos
privados y añadir métodos para leer y escribir
dichos datos nos permite añadir acciones que se
pueden necesitar en el futuro. - Si los programadores pueden acceder a los campos
de una clase directamente, no tenemos control
sobre los valores que usarán o sobre lo que
sucede cuando los valores se modifican
84Uso de métodos para control de acceso
- Al hacer un campo parte del contrato de una clase
se bloquea en la implementación de esa clase. No
se puede cambiar la implementación sin forzar la
recompilación de todos los clientes
85Uso de métodos para control de acceso
86Uso de métodos para control de acceso
87Uso de métodos para control de acceso
- Hacer que un campo sea final es a veces una
alternativa que evita modificaciones no deseadas
de dicho campo, pero no se deben confundir
inmutabilidad con accesibilidad. Si un campo es
inmutable se debe declarar final
independientemente de su accesibilidad. Por el
contrario sino se desea que un campo forme parte
del contrato de una clase se debe ocultar tras un
método, independientemente de si el campo es de
sólo lectura o modificable
88Uso de métodos para control de acceso
- Si se usan todos los campos private el control de
acceso se realiza por clase y no por objeto - public void cambiax(Point3D victima)
- victima.xthis.x
-
89Uso de métodos para control de acceso
- Si el control de acceso se realizara por objeto
el método cuando se invocara sobre un objeto no
podría acceder al campo privado x de víctima para
modificarlo pero, como el control de acceso se
realiza por clase, el código de un método de una
clase tiene acceso a todos los campos de esa
clase.
90Uso de métodos para control de acceso
- Algunos lenguajes orientados a objetos son
partidarios del control de acceso por objeto,
Java no es uno de ellos
91this
- Se puede usar la invocación explícita a un
constructor para invocar a otro de los
constructores de nuestra clase al principio de un
constructor. - Se puede usar también la referencia especial a un
objeto this dentro de un método no estático, que
se refiere al objeto actual sobre el que se
invocó al método. No existe la referencia this en
un método estático porque no se está operando
sobre ningún objeto específico
92this
- La referencia this se usa comúnmente como una
forma de pasar una referencia al objeto actual
como parámetro para otros métodos. - Suponga que un método requiera añadir el objeto
actual a una lista de objetos que esperan recibir
algún servicio
93this
- servicio. captura(this)
- Se puede añadir un this explícito al principio de
cualquier acceso a un campo o invocación del
método del objeto actual.
94this
95this
- Convencionalmente usaremos this sólo cuando sea
necesario cuando el nombre del campo al que se
necesita acceder esté oculto por una variable
local o una declaración de parámetro.
96this
- public void shiftX(int x)
- this.x this.x x
-
- Se usa this para especificar que el nombre es del
campo perteneciente a este (this) objeto - La ocultación deliberada de identificadores
realizada de esta forma se considera una práctica
de programación aceptable sólo en este uso
idiomático en constructores y métodos de
establecimiento
97Sobrecarga de métodos
- Todos los métodos tienen una signatura, que
consiste en su nombre junto con el número y tipo
de parámetros. - Dos métodos pueden tener el mismo nombre si
tienen diferente número o tipo de parámetros y
por tanto, diferente signatura (sobrecarga)
porque el nombre simple del método tiene un
significado sobrecargado (tiene más de un
significado)
98Sobrecarga de métodos
- Cuando se invoca un método el compilador compara
el número y tipo de parámetros para encontrar el
método que mejor se ajusta entre las signaturas
posibles. - Si la invocación no se ajusta a ninguna de las
signaturas de los métodos sobrecargados, el
código no compila
99Sobrecarga de métodos
- La signatura no incluye el tipo de retorno y no
se pueden sobrecargar métodos basándose en ello. - Los constructores se pueden sobrecargar de la
misma forma que los métodos
100Sobrecarga de métodos
101Sobrecarga de métodos
- System.out.println("Es pt1 igual a pt2? gt "
pt1.equals(pt2)) - System.out.println(
- "Es este nuevo punto transladado pt4 igual a
pt2? gt " - pt4.equals(pt2.getX(), pt2.getY(),
pt2.getZ()))
102El método main()
- Los detalles para invocar a una aplicación varían
de un sistema a otro, pero independientemente de
los detalles, siempre debemos proporcionar el
nombre de una clase que conduzca la aplicación.
Cuando ejecutamos un programa el sistema localiza
y ejecuta el método main de esa clase.
103El método main()
- El método debe ser public, static y void (no
devuelve nada) y debe aceptar un único parámetro
de tipo String
104El método main()
- public class Eco
- public static void main(String args)
- for (int i0 iltargs.length i)
- System.out.print(args i " ")
- System.out.println()
-
105El método main()
- Sale por pantalla estamos aquí
- Una aplicación puede tener cualquier número de
métodos main ya que cada clase de la aplicación
puede tener uno. Sólo se usará un main cada vez
que se ejecuta un programa. El main que se
utiliza en concreto se especifica cuando se
ejecuta el programa