Clases y objetos - PowerPoint PPT Presentation

1 / 105
About This Presentation
Title:

Clases y objetos

Description:

Clases y objetos Clases y objetos La unidad fundamental del lenguaje Java es la clase, que proporciona la estructura de los objetos y mecanismos para fabricarlos, a ... – PowerPoint PPT presentation

Number of Views:119
Avg rating:3.0/5.0
Slides: 106
Provided by: dsi66
Category:
Tags: clase | clases | objetos

less

Transcript and Presenter's Notes

Title: Clases y objetos


1
Clases y objetos
2
Clases 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.

3
Clases 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

4
Clases 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.

5
Clases 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

6
Una clase simple
  • Para declarar una clase se usa la palabra class.

7
Una 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

8
Una 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

9
Miembros 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

10
Modificadores 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.

11
Modificadores 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

12
Campos
  • 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.

13
Campos
  • 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

14
Inicializació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

15
Inicialización de los campos
  • Ejemplo

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
16
Inicialización de los campos
  • Si un campo no se inicializa, se le asigna un
    valor inicial por defecto, en función del tipo

17
Campos 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

18
Campos 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

19
Campos 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

20
Campos 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)

21
Campos 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)

22
Campos 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

23
Control 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.

24
Control 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.

25
Control 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

26
Control 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

27
Control 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.

28
Control 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

29
Creació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

30
Creació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

31
Creació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.

32
Construcció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

33
Constructores
  • 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.

34
Constructores
  • 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

35
Constructores
36
Constructores
  • 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

37
Constructores
  • 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)
38
Constructores
  • 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.

39
Constructores
40
Constructores
  • 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

41
Constructores
  • 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

42
Constructores
  • 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

43
Constructores
  • 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

44
Constructores
  • 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.

45
Constructores
  • 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

46
Constructores
  • 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

47
Constructores
  • 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))

48
Bloques 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

49
Bloques 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

50
Bloques 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

51
Bloques 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

52
Inicializació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.

53
Inicializació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

54
Inicializació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()

55
Mé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

56
Mé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

57
Mé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

58
Mé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

59
Mé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

60
Invocaciones 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.

61
Invocaciones 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

62
Invocaciones 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

63
Invocaciones de métodos
64
Invocaciones 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 .

65
Invocaciones 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

66
Ejecució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

67
Ejecució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.

68
Ejecució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)
69
Ejecució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.

70
Valores 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ó

71
Valores 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)

72
Valores de parámetros
  • Salida por pantalla

antes uno 1.0 mitad arg 0.5 después uno 1.0
73
Valores 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)

74
Valores de parámetros
75
Valores de parámetros
76
Valores de parámetros
77
Valores de parámetros
  • Si origen y destino son las mismas cuentas pueden
    anularse sus saldos

78
Valores de parámetros
79
Valores de parámetros
80
Valores 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

81
Valores 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

82
Uso 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)

83
Uso 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

84
Uso 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

85
Uso de métodos para control de acceso
86
Uso de métodos para control de acceso
87
Uso 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

88
Uso 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

89
Uso 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.

90
Uso 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

91
this
  • 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

92
this
  • 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

93
this
  • 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.

94
this
95
this
  • 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.

96
this
  • 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

97
Sobrecarga 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)

98
Sobrecarga 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

99
Sobrecarga 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

100
Sobrecarga de métodos
101
Sobrecarga 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()))

102
El 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.

103
El 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

104
El 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()

105
El 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
Write a Comment
User Comments (0)
About PowerShow.com