Saltar al contenido

Creación de clases

AP Ciencias de la Computación A · Tema 3

Entrenar
Lección de video para este tema Abrir la página de video
7:26

Creación de clases

Aquí hay un estudiante, almacenado como tres variables sueltas: un nombre, un año y una calificación. Eso funciona. Ahora añade mil estudiantes. Necesitarás tres mil variables…

Narración en inglés · Subtítulos en inglés + 中文 quemados en pantalla

3.1

Abstracción y diseño de programas

Syllabus

Objetivo de aprendizaje 3.1.A: Representar el diseño de un programa utilizando lenguaje natural o creando diagramas que indiquen las clases del programa y las abstracciones de datos y procedimentales presentes en cada clase, incluyendo todos los atributos y comportamientos.

  • 3.1.A.1 La abstracción es el proceso de reducir la complejidad centrándose en la idea principal. Al ocultar detalles irrelevantes para la pregunta actual y agrupar detalles relacionados y útiles, la abstracción reduce la complejidad y permite centrarse en la idea.
  • 3.1.A.2 La abstracción de datos proporciona una separación entre las propiedades abstractas de un tipo de datos y los detalles concretos de su representación. La abstracción de datos gestiona la complejidad al asignar un nombre a los datos sin referenciar los detalles específicos de la representación. Los datos pueden adoptar la forma de una variable única o una colección de datos, como en una clase o un conjunto de datos.
  • 3.1.A.3 Un atributo es un tipo de abstracción de datos definido en una clase fuera de cualquier método o constructor. Una variable de instancia es un atributo cuyo valor es único para cada instancia de la clase. Una variable de clase es un atributo compartido por todas las instancias de la clase.
  • 3.1.A.4 La abstracción procedural proporciona un nombre para un proceso y permite utilizar un método conociendo únicamente lo que hace, no cómo lo hace. A través de la descomposición de métodos, un programador divide los comportamientos más grandes de la clase en comportamientos más pequeños creando métodos para representar cada comportamiento individual pequeño. Una abstracción procedural puede extraer características compartidas para generalizar la funcionalidad en lugar de duplicar código. Esto permite la reutilización de código, lo cual ayuda a gestionar la complejidad.
  • 3.1.A.5 El uso de parámetros permite generalizar los procedimientos, habilitando la reutilización de los procedimientos con una gama de valores de entrada o argumentos.
  • 3.1.A.6 El uso de la abstracción procedural en un programa permite a los programadores cambiar los internals de un método (para hacerlo más rápido, más eficiente, usar menos almacenamiento, etc.) sin necesidad de notificar a los usuarios del método sobre el cambio, siempre que se preserven la firma del método y lo que el método hace.
  • 3.1.A.7 Antes de implementar una clase, es útil dedicarse tiempo a diseñar cada clase, incluidos sus atributos y comportamientos. Este diseño puede representarse mediante lenguaje natural o diagramas.

Fuente: College Board AP Course and Exam Description

Un rompecabezas en progreso: las clases y métodos son piezas modulares de un diseño de programa más grande
Un rompecabezas en progreso: las clases y métodos son piezas modulares de un diseño de programa más grande

Abstracción 抽象 significa ocultar detalles detrás de una interfaz simple – usas un String sin saber cómo almacena caracteres. Un buen diseño divide un problema en clases, cada una responsable de una idea. Este tema trata sobre escribir tus propias clases.

Descomponer un programa en módulos y sub-módulos
Descomponer un programa en módulos y submódulos
3.2

El impacto del diseño de programas

Syllabus

Objetivo de Aprendizaje 3.2.A: Explicar las implicaciones sociales y éticas de los sistemas informáticos.

  • 3.2.A.1 La fiabilidad del sistema se refiere a la capacidad del programa para realizar sus tareas según lo esperado bajo condiciones especificadas sin fallas. Los programadores deben esforzarse por maximizar la fiabilidad del sistema probando el programa con una variedad de condiciones.
  • 3.2.A.2 La creación de programas tiene impactos en la sociedad, la economía y la cultura. Estos impactos pueden ser tanto beneficiosos como perjudiciales. Los programas diseñados para satisfacer una necesidad o resolver un problema pueden tener efectos nocivos no intencionados más allá de su uso previsto.
  • 3.2.A.3 Surgen problemas legales y preocupaciones sobre la propiedad intelectual al crear programas. Los programadores suelen reutilizar código escrito por otros y publicado como código abierto y gratuito. La incorporación de código que no está publicado como código abierto requiere que el programador obtenga permiso y, a menudo, adquiera el código antes de integrarlo en su programa.

Fuente: College Board AP Course and Exam Description

Las decisiones de diseño afectan si el código es correcto, legible y reutilizable. Encapsulamiento 封装 – mantener los datos privados y exponerlo solo a través de métodos – protege el estado de un objeto de mal uso y te permite cambiar el interior sin romper a los usuarios de la clase. Nombres reflexivos, métodos de un solo propósito y pruebas reducen errores.

El diseño también conlleva responsabilidad más allá del código. Confiabilidad del sistema 系统可靠性 - un programa realizando sus tareas según lo esperado, sin fallos - es algo que los programadores deben maximizar mediante un diseño cuidadoso y pruebas. Los programas tienen impactos reales en la sociedad, la economía y la cultura que pueden ser beneficiosos y dañinos. Y crear programas plantea preocupaciones legales e de propiedad intelectual 知识产权: los programadores a menudo reutilizan código publicado como código abierto 开源 y libre de usar, pero deben respetar su licencia y dar crédito en lugar de copiar el trabajo de otros como propio.

3.3

Anatomía de una clase

Syllabus

Objetivo de aprendizaje 3.3.A: Desarrollar código para designar restricciones de acceso y visibilidad a clases, datos, constructores y métodos.

  • 3.3.A.1 La encapsulación de datos es una técnica mediante la cual los detalles de implementación de una clase se mantienen ocultos para las clases externas. Las palabras clave public y private afectan el acceso de las clases, los datos, los constructores y los métodos. La palabra clave private restringe el acceso a la clase declarante, mientras que la palabra clave public permite el acceso desde clases fuera de la clase declarante.
  • 3.3.A.2 En este curso, las clases siempre se designan como public y se declaran con la palabra clave class.
  • 3.3.A.3 En este curso, los constructores siempre se designan como public.
  • 3.3.A.4 Las variables de instancia pertenecen al objeto, y cada objeto tiene su propia copia de la variable.
  • 3.3.A.5 El acceso a los atributos debe mantenerse interno en la clase para lograr la encapsulación. Por lo tanto, es una buena práctica de programación designar las variables de instancia para estos atributos como private, a menos que la especificación de la clase indique lo contrario.
  • 3.3.A.6 El acceso a los comportamientos puede ser interno o externo a la clase. Los métodos designados como public pueden ser accedidos interna o externamente a una clase, mientras que los métodos designados como private solo pueden ser accedidos internamente a la clase.

Fuente: College Board AP Course and Exam Description

Una clase tiene tres partes: variables de instancia 实例变量 (campos – los datos del objeto), constructores (construyen objetos) y métodos (comportamiento). Los campos suelen ser private; los métodos suelen ser public:

Un diagrama de clases: atributos privados y métodos públicos
Un diagrama de clases: atributos privados y métodos públicos
public class Student {
    private String name;      // instance variable
    private int score;

    public Student(String n, int s) {   // constructor
        name = n;
        score = s;
    }
    public int getScore() { return score; }   // accessor
}
Un plano: una clase es una plantilla que define cómo se construyen los objetos de ese tipo
Un plano: una clase es una plantilla que define cómo se construyen los objetos de ese tipo
Explorar

Ver los campos de un objeto como cajas

Una clase agrupa datos relacionados (sus campos) y métodos. Cada objeto obtiene su propio conjunto de cajas de campo; asignar a una cambia solo ese objeto.

Vocabulario Entrenar
Inglés Chino Pinyin
accessor (getter)/əkˈsesə/ 访问器 fǎng wèn qì
3.4

Constructores

Syllabus

Objetivo de aprendizaje 3.4.A: Desarrollar código para declarar variables de instancia para los atributos que se inicializarán en el cuerpo de los constructores de una clase.

  • 3.4.A.1 El estado de un objeto se refiere a sus atributos y sus valores en un momento dado, y está definido por las variables de instancia pertenecientes al objeto. Esto define una relación de tiene-un entre el objeto y sus variables de instancia.
  • 3.4.A.2 Un constructor se utiliza para establecer el estado inicial de un objeto, lo cual debe incluir valores iniciales para todas las variables de instancia. Cuando se llama a un constructor, se asigna memoria para el objeto y se devuelve la referencia asociada al objeto. Los parámetros del constructor, si están especificados, proporcionan datos para inicializar las variables de instancia.
  • 3.4.A.3 Cuando un objeto mutable es un parámetro de constructor, la variable de instancia debe inicializarse con una copia del objeto referenciado. De esta manera, la variable de instancia no mantiene una referencia al objeto original y se impide que los métodos modifiquen el estado del objeto original.
  • 3.4.A.4 Cuando no se escribe ningún constructor, Java proporciona un constructor sin parámetros, y las variables de instancia se establecen en valores predeterminados según el tipo de dato del atributo. Este constructor se denomina constructor por defecto.
  • 3.4.A.5 El valor predeterminado para un atributo de tipo int es 0. El valor predeterminado de un atributo de tipo double es 0.0. El valor predeterminado de un atributo de tipo boolean es false. El valor predeterminado de un tipo de referencia es null.

Fuente: College Board AP Course and Exam Description

Un constructor 构造函数 tiene el mismo nombre que la clase y ningún tipo de retorno. Se ejecuta cuando escribes new, y su trabajo es inicializar los campos. Una clase puede tener varios constructores con diferentes listas de parámetros (sobrecarga 重载); un constructor sin argumentos establece valores predeterminados.

Vocabulario Entrenar
Inglés Chino Pinyin
Abstraction/əbˈstrækʃn/ 抽象 chōu xiàng
Encapsulation/ɪnˌkæpsjʊˈleɪʃn/ 封装 fēng zhuāng
System reliability/ˈsɪstəm rɪˌlaɪəˈbɪlɪti/ 系统可靠性 xì tǒng kě kào xìng
legal and intellectual-property/ˈliːɡl ænd ˌɪntəˈlektʃuːəl ˈprɒpəti/ 知识产权 zhī shí chǎn quán
open source/ˈəʊpən sɔːs/ 开源 kāi yuán
instance variables/ˈɪnstəns ˈveərɪəblz/ 实例变量 shí lì biàn liàng
constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
overloading/ˌəʊvəˈləʊdɪŋ/ 重载 zhòng zài
3.5

Métodos: Cómo escribirlos

Syllabus

Objetivo de aprendizaje 3.5.A: Desarrollar código para definir comportamientos de un objeto mediante métodos escritos en una clase utilizando valores primitivos y determinar el resultado de llamar a estos métodos.

  • 3.5.A.1 Un método void no devuelve un valor. Su cabecera contiene la palabra clave void antes del nombre del método.
  • 3.5.A.2 Un método no void devuelve un único valor. Su cabecera incluye el tipo de retorno en lugar de la palabra clave void.
  • 3.5.A.3 En los métodos no void, se evalúa una expresión de retorno compatible con el tipo de retorno, y se devuelve su valor. Esto se denomina retorno por valor.
  • 3.5.A.4 La palabra clave return se utiliza para devolver el flujo de control al punto donde se llamó al método o constructor. Cualquier código que aparezca secuencialmente después de una instrucción de retorno nunca será ejecutado. Ejecutar una instrucción de retorno dentro de una selección o iteración detendrá dicha estructura y saldrá del método o constructor.
  • 3.5.A.5 Un método accesor permite a objetos de otras clases obtener una copia del valor de las variables de instancia o variables de clase. Un método accesor es un método no void.
  • 3.5.A.6 Un método mutador (modificador) es un método que cambia los valores de las variables de instancia o variables de clase. Un método mutador suele ser un método void.
  • 3.5.A.7 Los métodos con parámetros reciben valores a través de esos parámetros y utilizan dichos valores para llevar a cabo la tarea del método.
  • 3.5.A.8 Cuando un argumento es un valor primitivo, el parámetro se inicializa con una copia de ese valor. Los cambios realizados al parámetro no tienen efecto sobre el argumento correspondiente.

Fuente: College Board AP Course and Exam Description

Un método tiene una firma, un tipo de retorno y un cuerpo. Un accesor (getter) 访问器 devuelve información sin cambiar el objeto; un mutador (setter) 修改器 cambia un campo. Un método que devuelve un valor debe tener un return del tipo correcto en cada camino; un método void no devuelve nada.

public void setScore(int s) { score = s; }   // mutator
public String toString() { return name + ": " + score; }
Explorar

Seguir una llamada a método y su retorno

Llamar a un método empuja un marco con sus parámetros; cuando alcanza return, el marco se elimina y el valor regresa al llamador.

Vocabulario Entrenar
Inglés Chino Pinyin
mutator (setter)/mjuːˈteɪtə/ 修改器 xiū gǎi qì
static (class) variable/ˈstætɪk ˈveərɪəbl/ 类变量 lèi biàn liàng
3.6

Pasar y devolver referencias de un objeto

Syllabus

Objetivo de aprendizaje 3.6.A: Desarrollar código para definir comportamientos de un objeto mediante métodos escritos en una clase utilizando referencias de objetos y determinar el resultado de llamar a estos métodos.

  • 3.6.A.1 Cuando un argumento es una referencia de objeto, el parámetro se inicializa con una copia de esa referencia; no se crea una nueva copia independiente del objeto. Si el parámetro hace referencia a un objeto mutable, el método o constructor puede usar esta referencia para alterar el estado del objeto. Es una buena práctica de programación no modificar objetos mutables que se pasan como parámetros a menos que así lo exija la especificación.
  • 3.6.A.2 Cuando la expresión de retorno evalúa a una referencia de objeto, se retorna la referencia, no una referencia a una nueva copia del objeto.
  • 3.6.A.3 Los métodos no pueden acceder a los datos privados ni a los métodos de un parámetro que contiene una referencia a un objeto, a menos que el parámetro sea del mismo tipo que la clase contenedora del método.

Fuente: College Board AP Course and Exam Description

= copia la referencia, no el objeto

Cuando pasas un objeto a un método, Java copia la referencia, por lo que el método actúa sobre el mismo objeto – los cambios en sus campos son visibles para el llamador. (Los primitivos se copian por valor, por lo que los cambios en ellos no lo son.) Un método también puede devolver una referencia a un objeto. Porque un String es inmutable, pasar uno es seguro; pasar un objeto mutable permite que un método lo cambie.

Java pasa por valor: el método obtiene una copia; el verdadero pase por referencia, que Java carece, le permitiría reasignar la variable del llamador
Java siempre pasa por valor (izquierda): el método obtiene una copia de la referencia. El verdadero pase por referencia (derecha) — que Java no tiene — le permitiría a un método reasignar la propia variable del llamador.

Habilidad de examen: sabe que mutar los campos de un objeto dentro de un método afecta al original, pero reasignar el parámetro (param = new...) no afecta al llamador.

Ejemplo resuelto. Supongamos que s es un Student con puntuación 50, y llamamos a tweak(s):

public static void tweak(Student a) {
    a.setScore(100);          // (1) mutates the shared object
    a = new Student("Z", 0);  // (2) repoints the local copy only
    a.setScore(5);            // (3) changes only the new local object
}

La línea (1) cambia el objeto al que apunta s, por lo que el llamador ahora ve 100. La línea (2) hace que la propia copia del método de la referencia apunte a un nuevo objeto – el s del llamador permanece intacto – y la línea (3) afecta solo a ese nuevo objeto. Después de la llamada, s.getScore() es 100: la mutación persistió, la reasignación no.

3.7

Variables de clase y métodos de clase

Syllabus

Objetivo de Aprendizaje 3.7.A: Desarrollar código para definir comportamientos de una clase mediante métodos de clase.

  • 3.7.A.1 Los métodos de clase no pueden acceder ni modificar los valores de variables de instancia ni llamar a métodos de instancia sin recibir como parámetro una instancia de la clase.
  • 3.7.A.2 Los métodos de clase pueden acceder o modificar los valores de las variables de clase y pueden llamar a otros métodos de clase.

Objetivo de Aprendizaje 3.7.B: Desarrollar código para declarar las variables de clase que pertenecen a la clase.

  • 3.7.B.1 Las variables de clase pertenecen a la clase, por lo que todos los objetos de una clase comparten una única copia de la variable de clase. Las variables de clase se designan con la palabra clave static antes del tipo de variable.
  • 3.7.B.2 Las variables de clase designadas como public se acceden fuera de la clase utilizando el nombre de la clase y el operador punto, ya que están asociadas con una clase y no con objetos de la clase.
  • 3.7.B.3 Cuando se declara una variable como final, su valor no puede ser modificado.

Fuente: College Board AP Course and Exam Description

estáticos vs campos de instancia

Una variable estática (de clase) 类变量, marcada static, es compartida por todos los objetos de la clase – una sola copia total (por ejemplo, un contador de cuántos objetos existen). Un método estático pertenece a la clase y no puede usar campos de instancia directamente. Accede a ellos por nombre de clase: Student.getCount().

3.8

Alcance y acceso

Syllabus

Objetivo de aprendizaje 3.8.A: Explicar dónde pueden utilizarse las variables en el código.

  • 3.8.A.1 Las variables locales son variables declaradas en los encabezados o cuerpos de bloques de código. Las variables locales solo pueden ser accedidas dentro del bloque en el que se declaran. Dado que los constructores y métodos son bloques de código, los parámetros de los constructores o métodos también se consideran variables locales. Estas variables solo pueden utilizarse dentro del constructor o método y no pueden declararse como public o private.
  • 3.8.A.2 Cuando existe una variable local o un parámetro con el mismo nombre que una variable de instancia, el nombre de la variable se referirá a la variable local en lugar de a la variable de instancia dentro del cuerpo del constructor o método.

Fuente: College Board AP Course and Exam Description

Alcance 作用域 es donde un nombre es visible. Una variable local declarada en un método existe solo dentro de él; un parámetro existe solo en su método; una variable de instancia es visible en todo el objeto. Los modificadores de acceso controlan la visibilidad entre clases: private (solo esta clase) versus public (en cualquier lugar). Las variables locales ocultan campos del mismo nombre – una fuente de errores.

Una variable global es visible en todas partes; una variable local solo dentro de su bloque
Una variable global es visible en todas partes; una variable local solo dentro de su bloque
Vocabulario Entrenar
Inglés Chino Pinyin
Scope/skəʊp/ 作用域 zuò yòng yù
3.9

La palabra clave this

Syllabus

Objetivo de aprendizaje 3.9.A: Desarrollar código para expresiones que se refieran a sí mismas y determinar el resultado de estas expresiones.

  • 3.9.A.1 Dentro de un método de instancia o un constructor, la palabra clave this actúa como una variable especial que contiene una referencia al objeto actual: el objeto cuyo método o constructor se está invocando.
  • 3.9.A.2 La palabra clave this puede utilizarse para pasar el objeto actual como argumento en una llamada a método.
  • 3.9.A.3 Los métodos de clase no tienen una referencia this.

Fuente: College Board AP Course and Exam Description

this es una referencia al objeto actual. Úsalo para distinguir un campo de un parámetro con el mismo nombre, o para llamar a otro método del mismo objeto:

public Student(String name, int score) {
    this.name = name;      // this.name is the field; name is the parameter
    this.score = score;
}

Habilidad de examen: cuando el parámetro de un constructor o setter tiene el mismo nombre que un campo, debes escribir this.field = param – sin this, la asignación no hace nada útil.

3.9

Consejos para el examen

  • Diseña con métodos y clases: encapsula datos como campos private y expone comportamiento a través de métodos públicos.
  • Conoce la diferencia entre un objeto y su clase, y que los objetos se pasan por valor — el parámetro obtiene una copia de la referencia, por lo que un método puede cambiar el estado del objeto, pero reasignar el parámetro no afecta al llamador (Java no tiene pase por referencia).
  • Recorre arrays y ArrayLists de forma segura — el tamaño es length vs .size(), y eliminar durante un bucle desplaza índices.
  • Rastrea un método recursivo para determinar su resultado: encuentra primero el caso base, luego sigue cada llamada recursiva hasta su valor de retorno (escribir código recursivo está fuera del alcance del examen).
  • Reconoce el vocabulario de herencia — superclase, subclase, sobrescritura de métodos, y que cada clase es una subclase de Object (diseñar e implementar herencia está fuera del alcance del examen).

Lecciones interactivas sobre este tema

Trátalo paso a paso, con ejercicios de verificación instantánea.

Exámenes Anteriores

Más temas en AP Ciencias de la Computación A

Iniciar sesión o crear cuenta

IGCSE, A-Level & AP