Head First Java Traducido
Head First Java Traducido
Kathy Sierra
Bert Bates
Editor:
Diseñador de la portada:
Diseñadores de interiores:
Historial de impresión:
Machine Translated by Google
Machine Translated by Google
Kathy Sierra
Bert Bates
Aunque Kathy y Bert intentan responder tantos correos electrónicos como pueden, el volumen de correo y su agenda de viajes lo hacen
difícil. La mejor forma (más rápida) de obtener ayuda técnica con el libro es en el muy activo foro para principiantes de Java en [Link].
Machine Translated by Google
4 Cómo se comportan los objetos: el estado del objeto afecta el comportamiento del método 71
6 Usando la biblioteca Java: para que no tengas que escribirlo todo tú mismo 125
12 Una historia muy gráfica: introducción a la GUI, manejo de eventos y clases internas 353
18 Computación distribuida: RMI con una pizca de servlets, EJB y Jini 607
B Apéndice B: Diez cosas principales que no se incluyeron en el resto del libro 659
Índice 677
yo introducción
Tu cerebro en Java.
Metacognición xxvi
Agradecimientos xxxi
ix
Machine Translated by Google
1 Rompiendo la superficie
Java te lleva a nuevos lugares.
El método principal() 9
Método Partido() 11
Bucle
0 carga_0
Ramificación condicional (si hay pruebas) 13
1 invokespe
cial #1 <Método
Codificando la aplicación “99 botellas de cerveza” 14
[Link]()>
Fraseomatic dieciséis
4 regreso
Dispararme
Ejercicios y rompecabezas 20
bytes compilado
Un viaje a Objectville
2 Me dijeron que habría objetos.
main() 38
Ejercicios y rompecabezas 42
X
Machine Translated by Google
3
Conozca sus variables
Las variables vienen en dos tipos: primitivas y de referencia.
Ct
mi 55
Doh gramo bj
oh
Declaración y asignación de objetos.
Ejercicios y rompecabezas 63
Referencia de perro
4
Cómo se comportan los objetos
El estado afecta el comportamiento, el comportamiento afecta al estado.
pasar por copia Pasar por valor (la variable siempre se copia) 77
Captadores y definidores 79
X z
En t En t
xi
Machine Translated by Google
5 métodos extrafuertes
Pongamos algo de fuerza en nuestros métodos.
vamos a construir el
Hundir un juego Dot Com
Construyendo el juego Sink a Dot Com 96
Comenzando con el juego Simple Dot Com (una versión más simple) 98
Código listo para obtener la entrada del usuario desde la línea de comandos. Bucles 112
xiii
Machine Translated by Google
Reglas para anular (¡no toque esos argumentos y tipos de retorno!) 190
Sobrecarga de métodos (nada más que reutilización del nombre del método) 191
Polimorfismo grave
oh
Doh bj mi
gramo
oh
Connecticut El compilador verifica el tipo de referencia (antes de permitirle llamar a un método) 213
215
Objeto devolver el objeto
Referencias polimórficas
Convertir una referencia de objeto (moviéndose hacia abajo en el árbol de herencia) 216
d a un perro que
sabemos que está allí. 223
Diamante mortal de la muerte (problema de herencia múltiple)
Perro
Usando interfaces (¡la mejor solución!) 224
xiii
Machine Translated by Google
243
d Inicializando el estado de un nuevo pato
variable
estática: helado
Clase de matemáticas (¿realmente necesitas una instancia de ella?) 274
niño instancia dos
niño ejemplo uno métodos estáticos 275
Formato de 289
xiv
Machine Translated by Google
Comportamiento riesgoso
htr
pag
oh
baC 320
norte
}
[Link]();
llama al método arriesgado El bloque final (pase lo que pase, ¡apaga el horno!) 327
}
12 UnaAcéptalo,
historia muy
necesitas gráfica
crear GUI.
clase MiExterior {
xvi
Machine Translated by Google
Trabaja en tu swing
13 El swing es fácil.
401
Los componentes Administradores de diseño (controlan el tamaño y la ubicación)
del este y del Tres administradores de diseño (borde, flujo, cuadro) 403
oeste obtienen
BorderLayout (se preocupa por cinco regiones) 404
su ancho preferido.
FlowLayout (se preocupa por el orden y el tamaño preferido) 408
Code Kitchen (The Big One: creación del cliente de chat BeatBox) 418
14 objetos deseahorro
Los objetos pueden aplanar e inflar.
deserializado 441
Deserializar un objeto
[Link] 452
CódigoCocina 462
xvi
Machine Translated by Google
Conexión de socket
al puerto 5000
en Descripción general del programa de chat 473
del servidor en
[Link] Conexión, envío y recepción 474
xvii
Machine Translated by Google
Estructuras de datos
dieciséis Ordenar es muy sencillo en Java.
Colecciones 533
HashMap 567
clases
xviii
Machine Translated by Google
18 Computación distribuida
Ser remoto no tiene por qué ser algo malo.
Cliente Servidor Invocación de método remoto de Java (RMI), práctica, muy detallada 614
El fin 648
Un Apéndice A
El proyecto final de Code Kitchen.
B apéndice B
Las diez cosas principales que no aparecieron en el libro.
i índice 677
xix
Machine Translated by Google
Machine Translated by Google
xxi
Machine Translated by Google
XXII introducción
Machine Translated by Google
la introducción
su
El cerebro piensa
Excelente. Sólo
637 páginas más, aburridas,
secas y aburridas.
introducción xxiv
Machine Translated by Google
la introducción
HACER
Entonces, ¿cómo consigues que tu cerebro trate a Java como si fuera un tigre hambriento?
tamaño
En t
fido Ct
D
oh gramo bj mi
oh
Perro
Perro
PuzzleVille Esto es
PUNTOS DE VIÑETA
Barra cerebral
cerebro
con barra
xxvi introducción
Machine Translated by Google
la introducción
8 Escuche a su cerebro.
3 Lea “No hay preguntas tontas”
CONFIGURAR JAVA
Si aún no tiene un SDK (kit de desarrollo de software) de Java 2 Standard Edition 1.5 o superior , lo
necesita. Si utiliza Linux, Windows o Solaris, puede obtenerlo de forma gratuita en [Link] (el sitio web de
Sun para desarrolladores de Java). Por lo general, no se necesitan más de dos clics desde la página principal para
llegar a la página de descargas de J2SE. Obtenga la última versión no beta publicada.
El SDK incluye todo lo necesario para compilar y ejecutar Java.
Si está ejecutando Mac OS X 10.4, el SDK de Java ya está instalado. Es parte de OS X y no tienes que hacer nada
más. Si tiene una versión anterior de OS X, tiene una versión anterior de Java que funcionará para el 95% del
código de este libro.
Nota: Este libro está basado en Java 1.5, pero por razones de marketing sorprendentemente poco claras, poco
antes de su lanzamiento, Sun le cambió el nombre a Java 5, manteniendo “1.5” como número de versión del kit del
desarrollador. Entonces, si ve Java 1.5 o Java 5 o Java 5.0, o "Tiger" (el nombre en clave original de la versión
5), todos significan lo mismo. Nunca hubo un Java 3.0 o 4.0; saltó de la versión 1.4 a la 5.0, pero aún encontrarás
lugares donde se llama 1.5 en lugar de 5. No preguntes.
(Ah, y solo para hacerlo más entretenido, Java 5 y Mac OS X 10.4 recibieron el mismo nombre en clave de "Tiger", y
dado que OS X 10.4 es la versión de Mac OS que necesitas para ejecutar Java 5 , oirás a la gente hablar de "Tiger
on Tiger". Simplemente significa Java 5 en OS X 10.4).
Necesitas un editor de texto. Prácticamente cualquier editor de texto servirá (vi, emacs, pico), incluidos los GUI que
vienen con la mayoría de los sistemas operativos. El Bloc de notas, Wordpad, TextEdit, etc. funcionan, siempre y
cuando se asegure de que no agreguen un ".txt" al final de su código fuente.
Una vez que haya descargado y descomprimido/comprimido/lo que sea (depende de qué versión y para qué
sistema operativo), debe agregar una entrada a su variable de entorno PATH que apunte al directorio /bin dentro del
directorio principal de Java. Por ejemplo, si J2SDK coloca un directorio en su disco llamado “j2sdk1.5.0”, busque
dentro de ese directorio y encontrará el directorio “bin” donde se encuentran los binarios de Java (las herramientas).
El directorio bin es al que necesita una RUTA, de modo que cuando escriba: % javac
Nota: gran parte del código de este libro está disponible en [Link]
introducción xxviii
Machine Translated by Google
la introducción
tamaño
ladrar()
comer()
perseguirgato()
No nos preocupamos por organizar y empaquetar su propio código hasta el final del libro.
Debes realizar
TODAS las
actividades de “Afila tu lápiz”
Afila tu lápiz
Los ejercicios de final de capítulo son obligatorios; Los rompecabezas son
opcionales. Las respuestas para ambos se encuentran al final de cada capítulo.
Editores técnicos
Valentin Crettaz
El MINI de Jessica
Jessica Sant
corbata de valentin
introducción xxx
Machine Translated by Google
la introducción
crédito
Otras personas a las que culpar: Algunos de nuestros
revisores expertos en Java...
Jef Cumps
Corey McGlone
Juan de Jong
Jason Ménard
Tomás Pablo
Marilym de
Queiroz
Rodney J.
aspa
*La gran cantidad de reconocimientos se debe a que estamos probando la teoría de que todos los mencionados
en el reconocimiento de un libro comprarán al menos una copia, probablemente más, con familiares y todo. Si
te gustaría estar en el reconocimiento de nuestro próximo libro y tienes una familia numerosa, escríbenos.
introducción xxxii
Machine Translated by Google
B r eak i ng t h mi S turFa C mi
¡Vamos, el agua está genial!
Nos sumergiremos y escribiremos algo
de código, luego lo compilaremos y lo
ejecutaremos. Estamos hablando de sintaxis,
bucles y ramificaciones, y de un vistazo a lo
que hace que Java sea tan genial.
Estarás codificando en poco tiempo.
en cualquier lugar
tienes suerte
mas poderoso
Método Partido()
código fuente para
0 carga_0
el interactivo
1 invokespe
invitación de fiesta. cial #1 <Método
[Link]()>
4 regreso
Fuente Producción
usted apuesta
(código) Dispararme
1 Compilador Virtual
Máquinas
3
2
4
2 Capítulo 1
Machine Translated by Google
Solicitud de ayuda de la ventana de edición de archivos Ventana de edición de archivos Ayuda Jurar
1 Salida
(código)
3000
2500
2000
1500
1000
500
0
Java 1.02 Java 1.1 Java 2 Java 5.0
(versiones 1.2 – 1.4) (versiones 1.5 y superiores)
Machine Translated by Google
historia de java
4 capitulo 1
Machine Translated by Google
Afila tu lápiz
Mira lo fácil que
es escribir Java.
tamaño entero = 27; declara una variable entera llamada 'tamaño' y dale el valor 27
x = tamaño 5;
mientras (x > 3) {
[Link]();
[Link](“Hola”);
[Link](“Perro: “ + nombre);
int z = [Link](núm);
intentar {
leerElArchivo(“[Link]”);
atrapar(FileNotFoundException ex) {
[Link](“Archivo no encontrado.”);
Afila tu lápiz
tamaño entero = 27; declarar una variable entera llamada 'tamaño' y darle el valor 27
declarar una variable de cadena de caracteres llamada 'nombre' y darle el valor "Fido"
Nombre de cadena = "Fido";
Perro miPerro = nuevo Perro(nombre, tamaño); declarar una nueva variable Perro 'miPerro' y crear el nuevo Perro usando 'nombre' y
x = tamaño 5; 'tamaño' resta 5 a 27 (valor de 'tamaño') y asígnalo a una variable llamada 'x' si
if (x < 15) [Link](8); x (valor de 22) es menor que 15, dile al perro que ladre 8 veces
[Link](); que 3... dígale al perro que juegue (lo que sea que ESO
} signifique para un perro...) esto parece el final del bucle: todo en { } se hace en el bucle
int[] listaNúm = {2,4,6,8}; declare una lista de variables enteras 'numList' y coloque 2,4,6,8 en la lista.
[Link](“Perro: “ + nombre); comando imprima "Hola Fido" (el valor de 'nombre' es "Fido") en la línea de
Número de cadena = “8”; comando declare una variable de cadena de caracteres 'num' y asígnele
int z = [Link](núm); el valor de “8” convierte la cadena de caracteres “8” en un valor numérico real 8
intentar { intentar hacer algo... tal vez no se garantiza que lo que estamos intentando
} leer el archivo...) debe ser el final de las “cosas para probar”, así que supongo que
atrapar(FileNotFoundException ex) { puedes probar muchas cosas... aquí debe ser donde descubrirás si lo que
[Link](“Archivo no encontrado.”); intentaste no funcionó... si lo que intentamos falló, imprime “Archivo no encontrado
} "En la línea de comando parece que todo en {} es qué hacer si el 'intento' no funcionó...
6 Capítulo 1
Machine Translated by Google
} clase
Coloque una clase en un archivo fuente. ¿Qué pasa en una perro de clase pública {
clase?
corteza vacía() {
Poner métodos en una clase.
método
declaración1;
declaración2;
declaraciones
// tu código va aquí
}
esto es un el nombre de
llave de apertura de
público para que todos clase (duh) esta clase la clase
puedan acceder a él
del método
}
llave de cierre de la clase MyFirstApp
8 Capítulo 1
Machine Translated by Google
Hola principal()
}
}
javac MiPrimeraAplicació[Link]
MiPrimeraAplicació[Link]
compilador
3 Correr
Grito de ayuda de la ventana de edición de archivos
¡Yo mando!
4 regreso
Método void
main([Link][]) El mundo
0 getstatic #2 <Campo
MiPrimeraAplicació[Link]
bucles
¿Qué puedes decir en el método principal?
declaraciones
derivación
1 hacer algo
entero x = 3;
Nombre de cadena = "Dirk"; * 17;
x=x
[Link](“x es” double d = +x);
[Link](); // esto es un comentario Sintaxis
Divertido
x = x + 1;
for (int x = 0; x < 10; x = x + 1) { [Link](“x ahora es +
"
x);
}
x = 22;
3 hacer algo bajo esta condición
// esta línea me molesta
si (x == 10) {
[Link](“x debe ser 10”); X = 3;
} demás {
[Link](“x no es 10”);
}
10 capitulo 1
Machine Translated by Google
entero x = 4; // asigna 4 a x
mientras (x > 3) {
// el código del bucle se ejecutará porque // x es
mayor que 3 x = x 1; // o haríamos
un bucle para siempre
}
int z = 27; //
mientras (z == 17) {
// el código del bucle no se ejecutará porque // z no es
igual a 17
}
no existen
Preguntas tontas Ejemplo de un bucle while
clase pública Loopy {
público estático vacío principal (String[] args) {
entero x = 1;
[Link](“Antes del bucle”);
mientras (x < 4) {
[Link](“En el bucle”);
[Link](“El valor de x es” +x);
x = x + 1;
}
En el lazo
El valor de x es 2.
En el lazo
El valor de x es 3.
PUNTOS DE VIÑETA
Un bucle while ejecuta todo lo que está dentro de su bloque (definido por
llaves) siempre que la prueba condicional sea verdadera.
12 capitulo 1
Machine Translated by Google
[Link]
clase IfTest {
si (x == 3) {
% javaDooBee
DooBeeDooBeeDo
clase IfTest2 {
si (x == 3) {
} demás {
[Link](“x NO es 3”);
nueva salida
% java IfTest2 x NO
es 3
Esto funciona pase lo que pase
if (númcerveza == 1) {
""
[Link](cervezaNum + + palabra + “de cerveza en la pared”);
""
[Link](cervezaNum + + palabra + “de cerveza.”);
[Link](“Derriba uno.”);
[Link](“Pasarlo.”);
númerocerveza = númerocerveza 1;
si (númcerveza > 0) {
""
[Link](cervezaNum + + palabra + “de cerveza en la pared”);
} demás {
} // fin de lo contrario
} // finaliza el ciclo while
14 capitulo 1
Machine Translated by Google
El despertador de Bob suena a las 8:30 de la mañana del lunes, como cualquier otro día de la semana. Java dentro
Pero Bob tuvo un fin de semana loco y presiona el botón DORMIR.
Y ahí es cuando comienza la acción y los dispositivos habilitados para Java
cobran vida.
Primero, el despertador envía un mensaje a la cafetera* "Oye, el geek se está durmiendo hasta
tarde otra vez, retrasa el café 12 minutos".
Su café humea.
Su artículo espera.
Puede tener una casa habilitada para Java. Quédese con una solución sensata que utilice tecnología
Java, Ethernet y Jini. Tenga cuidado con las imitaciones que utilizan otras plataformas denominadas
“plug and play” (que en realidad significa “conéctelo y juegue durante los próximos tres días tratando
de que funcione”) o plataformas “portátiles”. Betty, la hermana de Bob, probó uno de esos otros y los
COMO SI ENCENDIDO
resultados, bueno, no fueron muy atractivos ni seguros.
También es una pena lo de su perro...
TELEVISOR
escribamos un programa
Pruebe mi
nueva fraseomatic
y será un conversador
hábil como el jefe o
esos tipos de marketing.
5 //imprime la frase
“
[Link](“Lo que necesitamos es un } + frase);
16 capítulo 1
Machine Translated by Google
FraseOMatic
Cómo funciona.
Lo que necesitamos
aquí es un...
punto de inflexión
dinámico e innovador
aleatorio()
competencia central
distribuida inteligente
+
Visión beneficiosa para todos de
30.000 pies
el compilador y la JVM
18 capítulo 1
Machine Translated by Google
if (x == 1)
X
{ [Link](“d”);
=x1;
}
si (x == 2) {
[Link](“bc”);
clase aleatoria1 {
si (x > 2) {
[Link](“a”);
}
entero x = 3;
X
=x1;
[Link](“”);
mientras (x > 0) {
20 capitulo 1
Machine Translated by Google
B
público estático vacío principal (String [] argumentos) {
entero x = 5;
mientras ( x > 1 ) {
x = x 1;
si (x < 3) {
[Link](“x pequeña”);
Cada uno de los archivos Java en esta
}
página representa un archivo fuente completo.
}
Su trabajo es jugar al compilador y
determinar si cada uno de estos archivos }
se compilará. Si no se compilan,
¿cómo los solucionarías?
C
A
clase Ejercicio1b {
clase Ejercicio1b {
entero x = 5;
público estático vacío principal (String [] argumentos) {
mientras ( x > 1 ) {
entero x = 1;
x = x 1;
mientras (x < 10) {
si (x < 3) {
si (x > 3) {
[Link](“x pequeña”);
[Link](“x grande”);
}
}
}
}
}
}
rompecabezas: crucigrama
JavaCross 7.0
22 capitulo 1
Machine Translated by Google
prueba de clase {
público estático vacío principal (String [] argumentos) {
int x = 0;
int y = 0; mientras
(x<5) {
el candidato
código
va aquí
““
[Link](x + x = x + 1; + y +“ “);
}
}
}
y = x y; 22 46
Relacionar
cada candidato
y = y + x;
con uno de 11 34 59
los posibles resultados.
y = y + 2;
si( y > 4 ) { 02 14 26 38
y = y 1;
} 02 14 36 48
x = x + 1;
00 11 21 32 42
y = y + x;
11 21 32 42 53
si ( y < 5 ) {
x = x + 1;
si ( y < 3 ) { 00 11 23 36 410
x = x 1;
} 02 14 25 36 47
}
y = y + 2;
clase PoolPuzzleOne {
público estático vacío principal (String [] argumentos) {
int x = 0;
Rompecabezas de piscina
mientras ( __________ ){
_____________________________
si ( x < 1 ) {
___________________________
}
_____________________________
si ( __________ ){
____________________________
___________
} si (x == 1) {
Truco de ayuda de la ventana de edición de archivos
____________
}
}
}
24 capitulo 1
Machine Translated by Google
si (x > 3) {
A
[Link](“x grande”);
}
Imanes de código:
}
clase aleatoria1 {
} Esto se compilará y ejecutará (sin salida),
público estático vacío principal (String [] argumentos) {
} pero sin agregar una línea al programa, ¡se
entero x = 3; ejecutará para siempre en un bucle infinito ' while'!
mientras (x > 0) {
si (x > 2) {
[Link](“a”);
clase Foo
}
{ public static void main(String [] args) {
x = x 1; entero x = 5;
F V PAG
JAVA l OP oh Ud.
R W. oh I B
B R ANCHO A D C V l
A I Nuevo Testamento oh A I
Y l METRO R CI
S YTEOUTPRINT
S METRO
clase PoolPuzzleOne { t A I A
público estático vacío principal (String [] argumentos) { A I l B METRO
int x = 0;
S t PLATAFORMA norte DECLARAR
mientras ( X < 4 ) { I R mi t
C j h
[Link](“a”); si
(x<1) V oh
} si (x == 1) { [Link](x + x = x + 1;
““
+ y +“ “);
}
[Link](“noys”);
}
}
} si ( X < 1 ) {
y = x y; 22 46
[Link](“oise”);
} y = y + x; 11 34 59
[Link](““);
y = y + 2;
02 14 26 38
Truco de ayuda de la ventana de edición de archivos si( y > 4 ) {
X = X + 1; }
%java PoolPuzzleOne y = y 1;
un ruido } 02 14 36 48
}
molesta
} x = x + 1; 00 11 21 32 42
una ostra y = y + x;
11 21 32 42 53
si ( y < 5 ) {
x = x + 1; si ( y
< 3 ) { x = x 1; 00 11 23 36 410
} 02 14 25 36 47
}
y = y + 2;
26 capítulo 1
Machine Translated by Google
2 clases y objetos
Un viaje a Objectville
¡Nos vamos a
Objectville! Dejaremos
esta vieja y polvorienta
ciudad procesal para siempre.
Te enviaré una postal.
Guerras de sillas
la especificación
oh
la silla
reproducirSonido(numeroforma) {
// usa ShapeNum para buscar cuál }
// sonido AIF para reproducir y reproducirlo
}
}
}
28 capítulo 2
Machine Translated by Google
clases y objetos
Larry pensó que lo había logrado. Casi podía sentir el acero laminado del Aeron debajo
de él...
reproducirSonido(numeroforma) {
// si la forma no es una ameba,
// usa shapeNum para buscar qué // sonido AIF
Ameba
reproducir y reprodúcelo // de lo contrario // reproduce rotar() { //
el sonido código para rotar una ameba }
ameba .hif
}
playSound() { //
código para reproducir el
nuevo // archivo .hif para una
ameba }
rotación de la ameba:
30 capitulo 2
Machine Translated by Google
clases y objetos
1
Cuadrado Círculo Triángulo Ameba
Miré lo que los cuatro
girar() girar() girar() girar() las clases tienen en común.
reproducir sonido() reproducir sonido() reproducir sonido() reproducir sonido()
2
Forma
Son formas y todas giran y
reproducir sonido. Así que abstraje el
características comunes y ponerlas en un
girar()
reproducir sonido()
3
nueva clase llamada Forma. Forma Luego vinculé las otras
cuatro clases de forma
superclase girar()
reproducir sonido() a la nueva clase Forma,
en una relación llamada
herencia.
Puede leer esto como "El cuadrado hereda de la forma",
"El círculo hereda de la forma", etc. Eliminé rotar() y subclases
reproducirSound() de las otras formas, por lo que ahora
solo hay una copia que mantener.
Cuadrado Círculo Triángulo Ameba
La clase Shape se denomina superclase de las otras cuatro
clases. Las otras cuatro son las subclases de Shape. Las
subclases heredan los métodos de la superclase. En otras
palabras, si la clase Shape tiene la funcionalidad, entonces
las subclases obtienen automáticamente esa misma funcionalidad.
mir r
i d mi
ohv
norte
oh
w
Ask w
METRO
mi h oh
superclase
(más abstracto)
Forma
4
girar() Hicelalaanulación
Hice anulaciónde delalaclase
claseAmoeba
Amoeba
reproducir sonido()
elelmétodo
métodorotar()
rotar()del
y playSound()
métodos
Forma de de la superclase Shape.
superclase.
subclases Anular sólo significa que un
Anular sólo significa que un
(mas especifico) subclase redefine uno de sus
subclase redefine uno de sus
métodos heredados cuando necesita
métodos heredados cuando necesita
Ameba
Cuadrado Círculo Triángulo cambiar o ampliar el comportamiento
cambiar o ampliar el comportamiento
de ese método.
girar() { de ese método.
// específico de ameba {
// rotar código
Métodos primordiales
reproducir sonido() {
{
// específico de ameba
// código de sonido
Puedo
hacerme cargo de mí misma.
Sé cómo una ameba
se supone que gira y reproduce
Sé cómo se supone que debe
un sonido.
comportarse una Forma. Tu trabajo
es decirme que haga, yqué
mi trabajo
es hacer que suceda.
No preocupes a tu pequeña cabeza de
programador porque yocómo
lo hago.
32 capitulo 2
Machine Translated by Google
clases y objetos
“Me ayuda a diseñar de una manera más natural. Las cosas tienen una
forma de evolucionar”.
Joy, 27 años, arquitecto de software
"Me gusta que los datos y los métodos que operan con esos datos estén
juntos en una clase".
Josh, 22 años, bebedor de cerveza.
“No puedo creer que Chris haya dicho eso. No ha escrito una línea de
código en 5 años”.
Daryl, 44 años, trabaja para Chris. consejo metacognitivo
Si estás estancado en un ejercicio, intenta hablar sobre
“¿Además de la silla?”
en voz alta. Hablar (y oír) activa
Amy, 34 años, programadora
una parte diferente de tu cerebro. A pesar de esto
funciona mejor si tienes otra persona para
Discútelo, las mascotas también funcionan. Así es como
Nuestro perro aprendió el polimorfismo.
pensando en objetos
alarma Hora
sabe
color de
carritoContenido sabe la etiqueta
sabe alarma Modo
setColor() setAlarmTime()
addToCart() hace setLabel()
hace getAlarmTime()
setAlarm() lo
hace
removeFromCart() isAlarmSet()
dePress()
retirar() posponer()
unDepress()
setTitle()
son llamados
Cosas que un objeto puede hacer
instancia (estado)setArtist() hace
(comportamiento) reproducir()
métodos
Afila tu lápiz
34 capítulo 2
Machine Translated by Google
clases y objetos
JVM
clase
haciendo objetos
Prueba de conducción
1 Escribe tu clase
clase perro {
PERRO
variables
de instancia
tamaño entero; tamaño
criar
Raza de cuerda;
nombre
Nombre de cadena;
un método ladrar()
corteza vacía() {
[Link](“¡Ruff! ¡Ruff!”);
}
} 2 Escriba una clase de probador (TestDrive)
clase DogTestDrive {
público estático vacío principal (String[] args) {
solo un método principal
// El código de prueba del perro va aquí
(Vamos a ponerle código
en el siguiente paso) }
}
36 capítulo 2
Machine Translated by Google
clases y objetos
void playIt()
{ [Link](“Reproduciendo la película”);
}
}
}
}
Afila tu lápiz
título
PELÍCULA
objeto 1 género
título
clasificación
objeto 2 género
clasificación
título
objeto 3 género
clasificación
sal de la principal
Lanzador de juegos
hace un
Objeto
principal (cadena [] argumentos)
GuessGame
y le dice
que inicieGame
variables
p1 de instancia
p2
p3
para los tres
jugadores
empezar juego()
[Link] [Link].
el número de
Jugador
este jugador
adivinado
número
adivinar() método
para
hacer a
conjeturas
38 capítulo 2
Machine Translated by Google
clases y objetos
int conjeturap1 = 0;
declarar tres variables para mantener las
int conjeturap2 = 0;
tres conjeturas que hacen los jugadores
int conjeturap3 = 0;
int númerodestino = (int) ([Link]() * 10); Crea un número 'objetivo' que los jugadores
[Link](“Estoy pensando en un número entre 0 y 9...”); tienen que adivinar.
mientras (verdadero) {
[Link](“El número a adivinar es” + número de destino);
[Link]();
llamar al método adivinar() de cada jugador
[Link]();
[Link]();
adivinap1 = p1.número;
[Link](“El jugador uno adivinó” + adivinap1);
if (guessp1 == númerodestino) {
p1isRight = verdadero;
} verifique la suposición de cada jugador para ver si coincide con
if (guessp2 == númerodestino) { el número objetivo. Si un jugador tiene razón, entonces
p2isRight = verdadero; configure la variable de ese jugador como verdadera
}
(recuerde, la configuramos como falsa de forma predeterminada)
if (guessp3 == númerodestino) {
p3isRight = verdadero;
}
si (p1isDerecha || p2isDerecha || p3isDerecha) { si el jugador uno O el jugador dos O el jugador tres tiene razón... (el operador
|| significa O)
[Link](“¡Tenemos un ganador!”);
[Link](“¿El jugador uno lo hizo bien? “ + p1isRight);
[Link](“¿El jugador dos lo hizo bien? “ + p2isRight);
[Link](“¿El jugador tres lo hizo bien? “ [Link](“El juego + p3isDerecha);
ha terminado.”);
romper; // se acabó el juego, así que sal del circuito
} demás {
// ¡Debemos seguir adelante porque nadie lo hizo bien! de lo contrario, manténgase informado y pida a
los jugadores que adivinen otra vez.
[Link](“Los jugadores tendrán que intentarlo de nuevo.”);
} // terminar si/si no
} // finalizar bucle
} // método final
} // finalizar clase
Juego de adivinanzas
40 capitulo 2
Machine Translated by Google
clases y objetos
no existen
Preguntas tontas
hazlo pegado
aleatorio()
público
estático
PUNTOS DE VIÑETA
A
clase TapeDeck {
anular reproducircinta() {
[Link](“reproducción de cinta”); booleano canRecord = falso;
}
anular registroDVD() {
cinta de registro vacía() { [Link](“grabación de DVD”);
[Link](“grabación en cinta”); }
} }
}
clase DVDPlayerTestDrive {
clase TapeDeckTestDrive {public público estático vacío principal (String [] argumentos) {
static void main(String [] args) {
Reproductor de DVD d = nuevo reproductor
[Link] = verdadero; de DVD(); [Link] =
} }
} }
} }
42 capitulo 2
Machine Translated by Google
clases y objetos
[Link]();
void playSnare()
if ([Link]
== verdadero)
{ [Link]();
}
[Link] = falso;
clase DrumKitTestDrive {
[Link]();
clase DrumKit {
void playTopHat ()
Ventana de edición de archivos Ayuda Dance
} { [Link](“ding ding dading”);
% java DrumKitTestDrive bang bang
babang ding ding dading
[Link]();
__________________________
si ( ____________ ) {
[Link] = [Link] + 1;
}
si ( ____________ ) {
[Link] = [Link] + [Link];
44 capítulo 2
Machine Translated by Google
clases y objetos
¿Quién soy?
Represento al "estado".
Tengo comportamientos.
Vivo en el montón.
Declaro métodos.
soluciones de ejercicio
Sea el compilador:
clase TapeDeck
{ booleano canRecord = false;
anular reproducircinta() {
[Link](“reproducción de cinta”);
A
} cinta de registro nula() {
[Link](“grabación en cinta”);
}
}
if ([Link] == verdadero)
clase DVDPlayerTestDrive { public
{ [Link]();
static void main(String [] args) { DVDPlayer d = new
}
DVDPlayer(); [Link] = verdadero;
}
B [Link](); if
}
([Link]
== verdadero) { [Link]();
Ventana de edición de archivos Ayuda Dance
46 capítulo 2
Machine Translated by Google
clases y objetos
Rompecabezas de piscina
vacío ( ) {
[Link](“holaaaa... “); Nota: se dice que tanto las clases como los objetos tienen estado y comportamiento.
} Están definidos en la clase, pero también se dice que el objeto los "tiene". En
} este momento, no nos importa dónde técnicamente vivir.
%java EchoTestDrive
holaaa...
holaaa...
holaaa...
holaaa...
10
3 primitivas y referencias
argumentos
tipos de devolución
primitivo En t
más a la vida
brincar()
recuento int;
nombre
tipo
50 capitulo 3
Machine Translated by Google
primitivos y referencias
"Me gustaría un moca doble, no, que sea un int". Tipos primitivos
Tipo Profundidad de bits Rango de valores
booleano y char
entero
punto flotante
asignación primitiva
entero x = 24;
byte b = x;
//¡¡no funcionará!!
[Link] = 34,5;
2. booleano boo = x;
3. int g = 17;
4. int y = gramo;
5. y = y + 10;
6. s cortas;
tamaño entero = 32; declara un tamaño int llamado , asígnale el valor 32 7.s = y;
carácter inicial = 'j'; declara un carácter llamado inicial, asígnale el valor 'j'
8. byte b = 3;
doble d = 456,709; declara un doble llamado d, asígnale el valor 456.709
9. byte v = b;
booleano es loco; declarar un booleano llamado isCrazy (sin asignación)
10. corto n = 12;
está loco = verdadero; asignar el valor verdadero al isCrazy previamente declarado
11. v = norte;
int y = x + 456; declara un int llamado y, asígnale el valor que es la suma
de lo que sea x ahora más 456
[Link] k = 128;
52 capítulo 3
Machine Translated by Google
primitivos y referencias
hazlo pegado
Debe comenzar con una letra, un guión bajo (_) o un signo de dólar ($). No
puedes empezar un nombre con un número.
Puede ser lo que quieras, sujeto a esas dos reglas, siempre y cuando no sea una
de las palabras reservadas de Java.
No importa lo que
escuches, no, repito, no me
no uses ninguno dejes ingerir otro perro
para tus de
estos
propio peludo de gran tamaño.
vacío público estático
nombres.
protegido resumen de bytes final nativo estático estrictofp transitorio sincronizado largo volátil si
más hacer mientras cambiar caso predeterminado para pausa continuar afirmar
clase se extiende implementa el lanzamiento de en vez de interfaz nuevo paquete súper este
Palabras clave de Java y otras palabras reservadas (sin ningún orden útil). Si los usa para nombres, el compilador se enojará mucho, mucho .
referencias de objetos
Piense en una
variable de referencia de
métodos).
[Link]();
54 capítulo 3
Machine Translated by Google
primitivos y referencias
1 2
3
referencia Perro miPerro = nuevo Perro();
byte corto int 16 32 largo
8 64 (la profundidad de bits no es relevante)
Mi perro
Variable primitiva
00000111
byte x = 7;
primitivo Perro
valor
byte
referencia
valor
Perro Objeto de perro
variable es... bits que representan una forma de perro mi perro = nuevo Perro();
llegar a un objeto específico.
No nos importa cuántos unos y ceros haya en una variable de referencia. Depende de
cada JVM y de la fase de la luna.
Perro
referencias de objetos
no existen
Preguntas tontas
Referencia de objeto
Referencia: Bastante simple, de verdad. Soy un control remoto y puedo programarlo para controlar
diferentes objetos.
HeadFirst: ¿Te refieres a diferentes objetos incluso mientras estás corriendo? Por ejemplo, ¿puedes
referirte a un perro y luego, cinco minutos después, referirte a un automóvil?
Referencia: Por supuesto que no. Una vez que me declaren, eso es todo. Si soy el control remoto de un perro,
entonces nunca podré señalar (ups, qué pena, se supone que no debemos decir señalar) , es decir, referirme a
cualquier cosa que no sea un perro.
Referencia: No. Puedo referirme a un Perro y luego, cinco minutos después, puedo referirme a otro Perro.
Siempre que sea un perro, puedo ser redirigido (como reprogramar el control remoto a un televisor diferente)
hacia él. A menos... no, no importa.
Referencia: No creo que quieras entrar en esto ahora, pero solo te daré la versión corta: si estoy marcado
como final, una vez que se me asigne un Perro, nunca podré ser reprogramado para cualquier otra cosa
menos ese único Perro. En otras palabras, no se me puede asignar ningún otro objeto.
HeadFirst: Tienes razón, no queremos hablar de eso ahora. Bien, a menos que seas definitivo, entonces
puedes referirte a un Perro y luego referirte a otro Perro diferente más tarde. ¿Alguna vez puedes referirte a
nada en absoluto? ¿Es posible no estar programado para nada?
Referencia: Oh, nulo es un valor. Sigo siendo un control remoto, pero es como si trajeras a casa un nuevo
control remoto universal y no tuvieras televisor. No estoy programado para controlar nada. Pueden presionar
mis botones todo el día, pero no pasa nada bueno. Me siento tan... inútil. Un desperdicio de bits. Por
supuesto, no tantos bits, pero aún así. Y esa no es la peor parte. Si soy la única referencia a un objeto en
particular y luego se me establece en nulo (desprogramado), significa que ahora nadie puede acceder a ese
objeto al que me estaba refiriendo.
Referencia: ¿Tienes que preguntar? Aquí he desarrollado una relación con este objeto, una conexión
íntima, y luego el vínculo se corta repentina y cruelmente. Y nunca volveré a ver ese objeto, porque ahora
es elegible para la recolección de basura [del productor, cue de música trágica].
Oler. ¿Pero crees que los programadores alguna vez consideran eso? Olfatear. ¿ Por qué no puedo ser
primitivo? Odio ser un referente. La responsabilidad, todos los apegos rotos...
56 capítulo 3
Machine Translated by Google
primitivos y referencias
b Bohohk bj miCt
oh
Libro
Libro
Libro d = c;
1
Bohohk bj miCt
oh
2
b t
Ambos C y d referirse a lo mismo Bohohk bj miC
oh
objeto.
Las variables
C d
y contienen dos copias
Libro
diferentes del mismo valor. Dos controles
remotos programados para un televisor. C
Libro
d
Libro
c = segundo;
mi Ct 2
Bohohk ohbj
b t
Tanto b como c se refieren al mismo
objeto.
Bohohk bj miC
oh
Libro
d
usted está aquí 57
Machine Translated by Google
objetos en el montón
b Bohohk bj miCt
oh
Libro
Libro
segundo = c;
Este tipo está
1 acabado. cebo recolector de basura.
Bohohk bj miCtoh 2
Tanto b como c se refieren al mismo objeto. El
objeto 1 está abandonado y es elegible para la
recolección de basura (GC).
b t
Bohohk bj miC oh
Libro
Libro
c = nulo;
Todavía tostadas
nulo 1
Aún no tostado
(seguro siempre que
Bohohk bj miCt
oh
2 b se refiera a él)
Libro
referencia nula
C
(no programado para nada)
Libro
58 capítulo 3
Machine Translated by Google
primitivos y referencias
7 variables internas
Asigne a cada elemento de la matriz
3 un valor int.
Recuerde, los elementos en un int
formación son solo int variables .
números[0] = 6; En t En t En t En t En t En t En t
números[1] = 19;
7 variables internas
números[2] = 44;
números[3] = 42;
objeto de matriz int (int [])
números[4] = 10; números
números[5] = 20;
números[6] = 1; En t[] Observe que la matriz en sí es un objeto, aunque los 7
elementos sean primitivos.
Doh
gramo
Afila tu lápiz
mascotas
60 capitulo 3
Machine Translated by Google
primitivos y referencias
Cadena
Ct
mi
Doh ohbj
gramo
fido
Perro
[Link]();
Java se preocupa por el tipo. [Link]();
Una vez que haya declarado una matriz, no
podrá poner nada en ella excepto cosas que ¿Qué sucede si el Perro está en una
sean del tipo de matriz declarada.
matriz de Perros?
Por ejemplo, no puedes poner un gato en un
grupo de perros (sería bastante horrible si
alguien pensara que solo hay perros en el
grupo, entonces le pide a cada uno que ladre y
luego, para su horror, descubre que hay un
gato al acecho). ) Y no puedes insertar un doble
en una matriz int (derrame, ¿recuerdas?).
Sin embargo, puedes poner un byte en una
matriz int, porque un byte siempre cabe en una taza de tamaño int.
Esto se conoce como ampliación implícita.
Entraremos en detalles más adelante, por
ahora solo recuerde que el compilador no le
Perro[] misPerros = nuevo Perro[3];
permitirá colocar algo incorrecto en una matriz, según
el tipo declarado de la matriz. misPerros[0] = nuevo Perro();
misPerros[0].nombre = “Fido”;
misPerros[0].bark();
usando referencias
clase perro {
Un ejemplo de perro
Nombre de cadena;
[Link](); ladrar()
comer()
[Link] = “Bart”;
perseguirgato()
persecución pública vacía () { } que la matriz contiene primitivas. No existe una matriz
primitiva, solo una matriz que contiene primitivas.
}
62 capítulo 3
Machine Translated by Google
primitivos y referencias
A B
libros de clase { clase Hobbits {
Título de cadena;
Autor de cadena; Nombre de cadena;
}
público estático vacío principal (String [] argumentos) {
clase BooksTestDrive {public
static void main(String [] args) { Hobbits [] h = nuevos Hobbits[3]; int z =
0;
Libros [] misLibros = nuevos Libros[3]; int x
= 0; mientras (z < 4) {
myBooks[0].title = “Las uvas de Java”; misLibros[1].title z = z + 1;
= “El Gatsby de Java”; myBooks[2].title = “El libro h[z] = nuevos Hobbits();
de cocina de Java”; misLibros[0].autor = “bob”; h[z].nombre = “bilbo”; if (z
misLibros[1].autor = “demandar”; == 1) { h[z].nombre
misLibros[2].autor = “ian”; = “frodo”;
} if (z == 2)
while (x < 3) { h[z].nombre = “sam”;
{ [Link](misLibros[x].título); }
[Link](“ por “); [Link](h[z].nombre + “es un”);
[Link](misLibros[x].autor); x = x + 1; [Link](“buen nombre Hobbit”);
}
} }
} }
}
int y = 0;
ref = índice[y];
islas[0]
= “Bermudas”;
islas[1]
= “Fiyi”;
islas[2]
= “Azores”;
islas[3]
= “Cozumel”;
referencia interna;
mientras (y < 4) {
[Link](islas[ref]);
índice[0] = 1;
índice[1] = 3;
índice[2] = 0;
índice[3] = 2;
[Link](“isla = “);
64 capítulo 3
Machine Translated by Google
primitivos y referencias
clase MontónQuiz {
identificación interna = 0;
} hq[3] = hq[1];
hq[4] = hq[1];
hq[3] = nulo;
hq[4] = hq[0];
hq[0] = hq[3];
hq[3] = hq[2];
hq[2] = hq[0];
// hacer cosas
}
}
identificación = 0
hq[0]
unir cada variable de
referencia con objeto(s)
coincidente(s)
sede[1]
Quizás no sea necesario
utilizar todas las referencias. identificación = 1
sede[2]
sede[3]
identificación = 2
sede[4]
66 capítulo 3
Machine Translated by Google
primitivos y referencias
Era una noche oscura y tormentosa. Tawny entró en el bullpen de los programadores como si fuera
la dueña del lugar. Sabía que todos los programadores seguirían trabajando duro y quería ayuda.
Necesitaba agregar un nuevo método a la clase fundamental que se iba a cargar en el nuevo teléfono celular
ultrasecreto habilitado para Java del cliente. El espacio en la memoria del teléfono móvil era tan reducido
como el de la camiseta de Tawny, y todo el mundo lo sabía. El normalmente estridente zumbido en el bullpen
se calló cuando Tawny se dirigió hacia el pizarrón blanco. Esbozó una rápida descripción general de la
funcionalidad del nuevo método y escaneó lentamente la habitación. “Bueno, muchachos, es hora de decidirse”, ronroneó.
"Quien cree la versión más eficiente en memoria de este método vendrá conmigo mañana a la fiesta de
Cinco minutos lanzamiento del cliente en Maui... para ayudarme a instalar el nuevo software".
Misterio A la mañana siguiente, Tawny entró en el bullpen con su vestido corto Aloha.
“Señores”, sonrió, “el avión sale en unas horas, ¡muéstrenme lo que tienen!”. Bob fue primero;
Mientras comenzaba a esbozar su diseño en la pizarra, Tawny dijo: "Vayamos al grano, Bob,
muéstrame cómo manejaste la actualización de la lista de objetos de contacto". Bob rápidamente
dibujó un fragmento de código en la pizarra:
"Tawny, sé que tenemos poca memoria, pero tu especificación decía que teníamos que poder acceder
a la información de contacto individual de los diez contactos permitidos; este fue el mejor esquema que
pude idear", dijo Bob. Kent fue el siguiente, ya imaginando cócteles de coco con Tawny. "Bob", dijo, "tu
solución es un poco torpe, ¿no crees?" Kent sonrió, "Echa un vistazo a este bebé":
Contacto refc;
mientras (x<10) { // crea 10 objetos de contacto
refc = nuevo contacto();
x = x + 1;
}
“Guardé un montón de variables de referencia en memoria, Boborino, así que guarda tu protector
solar”, se burló Kent. “¡No tan rápido Kent!”, dijo Tawny, “has guardado un poco de memoria, pero Bob viene
conmigo”.
¿Por qué Tawny eligió el método de Bob en lugar del de Kent, cuando Kent usaba menos memoria?
soluciones de ejercicio
libros de clase {
Soluciones de ejercicio
Título de cadena;
Autor de cadena;
} clase BooksTestDrive
{ public static void main(String [] args) { Libros []
myBooks = new Books[3]; int x = 0;
misLibros[0]
A = nuevos Libros(); Recuerde: tenemos que myBooks[1] =
new Books(); en realidad crea los Libros myBooks[2] = new
Imanes de código:
Books(); objetos ! myBooks[0].title = “Las
clase matrices de prueba { uvas de Java”; misLibros[1].title = “El Gatsby de Java”;
myBooks[2].title = “El libro de cocina de Java”;
público estático vacío principal (String [] argumentos) {
misLibros[0].autor = “bob”; misLibros[1].autor =
int [] índice = nuevo int[4];
“demandar”; misLibros[2].autor =
índice[0] = 1;
“ian”; while (x < 3)
índice[1] = 3; { [Link](misLibros[x].título);
índice[2] = 0; [Link](“ por
índice[3] = 2; “); [Link](misLibros[x].autor); x = x
+ 1;
String [] islas = new String[4];
islas[0] = “Bermuda”;
islas[1] = “Fiji”;
}
islas[2] = “Azores”; islas[3] = }
“Cozumel”; }
int y = 0;
clase Hobbits
referencia interna;
{ nombre de
mientras (y < 4) {
cadena; public static void main(String [] args) { Hobbits
ref = índice[y]; [] h = nuevos Hobbits[3]; int z = 1;
[Link](“isla = “); Recuerde: las matrices comienzan con while (z < 2)
[Link](islas[ref]); { elemento 0 ! z = z + 1; h[z] =
y = y + 1; nuevos
Hobbits(); h[z].nombre =
}
“bilbo”; if (z == 1)
} B
{ h[z].nombre =
} Ventana de edición de archivos Ayuda Bikini
“frodo”;
68 capítulo 3
Machine Translated by Google
primitivos y referencias
Soluciones de rompecabezas
Triángulo
clase Triángulo
{ área{doble;
clase
interna;
doble zona;
altura
altura
interna; longitud
vacío
interna;
estático
principal
público
args) { int
(String
x = 0;[]int
args)
x = {0;principal vacío estático público (String []
ta[x]
= nuevo
= nuevo
Triángulo();
Triángulo(); ta[x]
ta[x].altura
1) * 2; ta[x].longitud
= (x + 1) =
* 2;
x +ta[x].altura
4; ta[x].longitud
= (x +
=
ta[x].setArea();
x + 4; ta[x].setArea(); (El software fue un gran éxito y el cliente les dio a Tawny y Bob una semana adicional en
Hawaii. Nos gustaría decirles que al terminar este libro usted también obtendrá cosas como esas).
[Link](“triángulo
“+x+”, área”); “+x+”, área”); [Link](“triángulo
““
[Link](“ = x = x + 1; x = + ta[x].área); +
ta[x].área);
x + 1;
}int} int
y =yx;= xx;=
27; x = 27;
identificación = 0
Triángulo t5 = ta[2];
ta[2].área
= 343; = 343; ta[2].área hq[0]
““
[Link](“y = +y); +y);
[Link](“,
= “+ área t5); área t5 = “+ área t5); [Link](“, área t5
}} sede[1]
void
setArea()
setArea()
{ área
{ void
= (alto *
identificación = 1
%java Triángulo
triángulo 0, área = 4,0 triángulo
1, área = 10,0 sede[3]
triángulo 2, área = 18.0 triángulo identificación = 2
cinco instancias
de la clase Song
política
A mi manera
Coldplay
Sinatra
pistolas sexuales
Agradecido
Muerto
Cantar
travis
juego nulo() {
[Link](título);
}
s3
t2
Canción
72 capítulo 4
Machine Translated by Google
Perro
clase perro {
tamaño
tamaño entero;
nombre
Nombre de cadena;
ladrar()
corteza vacía() {
[Link](“¡Guau! ¡Guau!”);
[Link](“¡Ruff! ¡Ruff!”);
} demás {
[Link](“¡Ay! ¡Ay!”);
clase DogTestDrive {
[Link]ño = 8;
[Link]ño = 35;
Ayuda de la ventana de edición de archivos Playdead
[Link](3);
74 capítulo 4
Machine Translated by Google
vacío
ir vacío() {
} Lindo...
00101010
En t
múltiples argumentos
[Link](12, 34);
} Los argumentos
orden en que los que pasas aterrizan en el mismo
pasó. Primer argumento tierras
en el primer parámetro, el segundo argumento en el
segundo parámetro,
etcétera.
int z = x + y;
ir vacío() {
Los valores de foo y bar aterrizan en
int foo = 7; los parámetros xey. Entonces ahora
los bits en x son idénticos a los bits en
barra interna = 3;
foo (el patrón de bits para el entero '7') y
[Link](foo, barra); los bits en y son idénticos a los bits en bar.
}
76 capítulo 4
Machine Translated by Google
00000111
copia de x
no existen
Preguntas tontas
Recordatorio: Java
¡Se preocupa por el tipo!
No puedes devolver una jirafa cuando el tipo de
devolución se declara como conejo. Lo
mismo con los parámetros. No puedes pasar
un
Jirafa en un método que requiere un
Conejo.
PUNTOS DE VIÑETA
Los métodos pueden utilizar variables de instancia para que los objetos
78 capítulo 4
Machine Translated by Google
Guitarra electrica
marca
numOfPickups
rockStarUsesIt
getNumOfPickups() ¡Importante
estándar Java!
setNumOfPickups()
getRockStarUsesIt()
setRockStarUsesIt()
clase Guitarra eléctrica {
Marca de cuerdas;
int numOfPickups; roca
booleanaStarUsesIt;
}
}
Encapsulación
Hazlo o corre el riesgo de ser humillado y
ridiculizado.
Jen dice que
estás bien encapsulado...
la altura del gato = 0; permitir que esto suceda! cambios de tamaño inaceptables.
80 capitulo 4
Machine Translated by Google
Objeto: Bueno, ¿conoces ese sueño en el que estás dando una charla ante 500 personas y de repente te
das cuenta de que estás desnudo?
HeadFirst: Sí, ya lo hemos tenido. Está a la altura del de la máquina Pilates y... no, no iremos allí. Bien,
entonces te sientes desnudo. Pero además de estar un poco expuesto, ¿existe algún peligro?
público privado
Objeto: ¿Existe algún peligro? ¿Hay algún peligro? [empieza a reír] Oye, ¿todos los demás casos
público
escucharon eso: "¿Hay algún peligro?" ¿él pide? [cae al suelo riendo]
Objeto: Está bien, lo explicaré. Es [se echa a reír de nuevo, sin control]
Objeto: ¡Uf! Oh chico. No, estoy bien, de verdad. Lo haré en serio. Respiracion profunda. OK adelante.
Objeto: La encapsulación coloca un campo de fuerza alrededor de mis variables de instancia, para que nadie
pueda configurarlas, digamos, en algo inapropiado.
Objeto: Aquí no se requiere un doctorado. La mayoría de los valores de las variables de instancia están
codificados con ciertas suposiciones sobre los límites de los valores. Piense en todas las cosas que se
estropearían si se permitieran números negativos. Número de baños en una oficina. Velocidad de un avión.
Cumpleaños. Peso con barra. Números de teléfonos móviles. Potencia del horno microondas.
Marcar las variables HeadFirst: Ya veo lo que quieres decir. Entonces, ¿cómo te permite la encapsulación establecer límites?
de instancia como privadas.
Objeto: obligando a otro código a pasar por métodos de establecimiento. De esa manera, el método de
establecimiento puede validar el parámetro y decidir si es factible. Tal vez el método lo rechace y no haga
nada, o tal vez arroje una excepción (como si fuera un número de seguro social nulo para una solicitud
Marcar captadores y de tarjeta de crédito), o tal vez el método redondeará el parámetro enviado al valor aceptable más
definidores públicos. cercano. El punto es que puedes hacer lo que quieras en el método de establecimiento, mientras que no
puedes hacer nada si tus variables de instancia son públicas.
HeadFirst: Pero a veces veo métodos de establecimiento que simplemente establecen el valor sin verificar
nada. Si tiene una variable de instancia que no tiene un límite, ¿ese método de establecimiento no crea
una sobrecarga innecesaria? ¿Un éxito en el rendimiento?
"Lamentablemente, Bill se
olvidó de resumir su clase de Gato Objeto: El objetivo de los establecedores (y también de los captadores) es que puedes cambiar de opinión
y terminó con un gato plano". más tarde, ¡sin romper el código de nadie más! Imagínese si la mitad de las personas de su empresa
(escuchado en el enfriador de agua). usaran su clase con variables de instancia públicas y un día de repente se diera cuenta: "Ups, hay algo
que no planeé con ese valor, voy a tener que cambiar a una método de establecimiento ". Rompes el código
de todos. Lo bueno de la encapsulación es que puedes cambiar de opinión. Y nadie sale herido. La ganancia
de rendimiento derivada del uso directo de variables es minúscula y rara vez (o nunca) valdría la pena.
clase BuenPerro {
Encapsulando el
Buen perro
Clase GoodDog tamaño int privado;
tamaño
} establecerTamaño( )
ladrar( )
corteza vacía() {
[Link](“¡Ay! ¡Ay!”);
}
Cualquier lugar donde se
pueda utilizar un valor particular,
clase GoodDogTestDrive {
un llamada al
método que devuelve ese tipo
público estático vacío principal (String[] args) {
poder ser usado. BuenPerro uno = nuevo BuenPerro();
[Link](70);
[Link]();
82 capítulo 4
Machine Translated by Google
Perro[] mascotas;
mascotas = nuevo Perro[7];
mascotas
Doh
gramo
elementos de la matriz. 30
8
mascotas[0] = nuevo Perro();
mascotas[1] = nuevo Perro(); tamaño
tamaño
mascotas[0].setSize(30);
int x = mascotas[0].getSize();
mascotas[1].setSize(8);
mascotas
Declarar e inicializar
variables de instancia
Las variables de instancia
siempre obtienen
tamaño entero; un valor predeterminado.
Nombre de cadena;
Si no asigna explícitamente
un valor a una variable
de instancia, o no
tamaño entero = 420;
Nombre de cadena = "Donny"; llama a un método de
establecimiento, la variable
de instancia
84 capítulo 4
Machine Translated by Google
clase Foo {
¡¡No se compilará!!
vacío público ir () {
Puedes declarar x sin un
intx ;
valor, pero tan pronto
int z = x + 3; como intentas USArlo, el
} compilador se asusta.
}
% javac [Link]
int z = x + 3;
1 error ^
igualdad de objetos
00000011 00000011
int a = 3; (hay más ceros en el
lado izquierdo del int,
byte b = 3; pero no nos importa a == segundo
Para ver si dos referencias son iguales (lo que significa que se refieren al mismo objeto
en el montón), use el operador ==
mismo
los patrones de bits son para
igualesausando
y c, por lo==
que son
86 capítulo 4
Machine Translated by Google
Siempre
mantengo mis variables
privadas. Si quieres verlos,
tienes que hablar con mis
métodos.
hazlo pegado
privado
Afila tu lápiz
int a = áreacalc(7, 12);
¿Qué es legal? corta c = 7;
Dado el método siguiente, ¿cuáles de
las llamadas a métodos enumeradas a la calcÁrea(c,15);
int g = áreacalc();
A B
void setTime(String t) {
origen int = 42;
tiempo = t;
devolver argumento;
Reloj c = nuevo Reloj();
}
}
[Link](“1245”);
Cadena tod = [Link]();
[Link](“hora: “ + tod);
}
}
88 capítulo 4
Machine Translated by Google
¿Quién soy?
mientras ( ) {
índice < 5 si ( ) {
95
Mezcla4 m4 = nueva Mezcla4();
[Link] = [Link] + 1;
x<20 19 1
devolver 1;
índice < 5
14 1
} devolver 0;
}
x<7 25 1
}
índice < 7 77
x<19 20 1
índice < 1 20 5
90 capitulo 4
Machine Translated by Google
___________________________
___________________________
y=y * 10;
_________________
} x = 6;
mientras (x > 0) {
_________________
resultado = resultado + ___________________
}
Ventana de edición de archivos Ayuda BellyFlop [Link](“resultado” + resultado);
}
%java rompecabezas4
}
resultado 543345
clase ___________ {
int ívar;
Cuando Buchanan clavó su arma de contracción en el costado de Jai, Jai se quedó helado. Jai sabía que
Buchanan era tan estúpido como feo y no quería asustar al grandullón. Buchanan ordenó a Jai que fuera a la oficina
de su jefe, pero Jai no había hecho nada malo (últimamente), por lo que pensó que una pequeña charla con el
jefe de Buchanan, Leveler, no podía ser tan mala. Últimamente había estado moviendo muchos estimuladores
neuronales en el lado oeste y supuso que Leveler estaría contento. Los estimuladores del mercado negro no eran la
mejor bomba de dinero que existía, pero eran bastante inofensivos. La mayoría de los adictos a los estimulantes
que había visto dejaron de funcionar después de un tiempo y volvieron a la vida, tal vez un poco menos concentrados que antes.
Cinco minutos La 'oficina' de Leveler era un skimmer de aspecto asqueroso, pero una vez que Buchanan lo empujó, Jai pudo
ver que había sido modificada para proporcionar toda la velocidad y armadura extra que un jefe local como Leveler
Misterio podía esperar. “Jai, muchacho”, siseó Leveler, “un placer verte de nuevo”. "Del mismo modo, estoy seguro...", dijo Jai,
sintiendo la malicia detrás del saludo de Leveler, "Deberíamos ser honestos, Leveler, ¿me he perdido algo?"
"¡Ja! Lo estás haciendo lucir bastante bien Jai, tu volumen está alto, pero he estado experimentando, digamos, una
pequeña 'brecha' últimamente…” dijo Leveler.
Jai hizo una mueca de dolor involuntariamente, había sido un pirata informático de primer nivel en su época. cada vez que alguien
Cuando descubrió cómo romper la seguridad de un guardia callejero, la atención no deseada se volvió hacia Jai.
“De ninguna manera soy yo”, dijo Jai, “no vale la pena el inconveniente. Estoy retirado del hacking, solo me muevo
mis cosas y ocuparme de mis propios asuntos”. "Sí, sí", se rió Leveler, "Estoy seguro de que estás limpio en
este caso, ¡pero perderé grandes márgenes hasta que excluyan a este nuevo pirata informático!"
"Bueno, mucha suerte, Nivelador, tal vez podrías dejarme aquí e iré a mover algunas 'unidades' más
para ti antes de terminar hoy", dijo Jai.
"Me temo que no es tan fácil Jai, aquí Buchanan me dice que estás al día en J37NE", insinuó
Leveler. “¿Edición neuronal? Seguro que juego un poco, ¿y qué?”, respondió Jai sintiéndose un poco
mareado. "La edición neuronal es la forma en que les hago saber a los adictos a los estímulos dónde estará la
próxima gota", explicó Leveler. El problema es que algunos adictos a los estimulantes se mantuvieron el tiempo
suficiente como para descubrir cómo hackear mi base de datos de WareHousing. “Necesito que un pensador
rápido como tú, Jai, eche un vistazo a mi clase de StimDrop J37NE; métodos, variables de instancia, toda la
enchilada, y descubrir cómo entran. Debería…”, “¡HEY!”, exclamó Buchanan, “¡No quiero que ningún hacker
escoria como Jai husmee en mi código! " “Tranquilo, grandullón”, Jai vio su oportunidad, “Estoy seguro de que
hiciste un trabajo de primer nivel con tu modo de acceso... “¡No me digas, un poco tonto!”, gritó Buchanan, “Dejé a
todos esos drogadictos. Los métodos de nivel son públicos, para que puedan acceder a los datos del sitio de
entrega, pero marqué todos los métodos críticos de WareHousing como privados. ¡Nadie en el exterior puede
acceder a esos métodos amigo, nadie!
"Creo que puedo detectar tu fuga, Nivelador, ¿qué tal si dejamos a Buchanan aquí en la esquina y damos
una vuelta alrededor de la cuadra?", sugirió Jai. Buchanan tomó su pistola de contracción pero el aturdidor de
Leveler ya estaba en el cuello de Buchanan, "Déjalo Buchanan", se burló Leveler, "Suelta el twitcher y sal afuera,
creo que Jai y yo tenemos algunos planes que hacer".
92 capítulo 4
Machine Translated by Google
reloj de clase {
Soluciones de ejercicio
tiempo de
cadena; void setTime(String t)
{ tiempo = t;
B }
String getTime() { tiempo
de retorno;
}
}
¡Una clase 'XCopy' se compila y ejecuta tal como está! El retorno por definición.
resultado es: '42 84'. Recuerde que Java se pasa por valor (lo
que significa pasar por copia), la variable 'orig' no se cambia
con el método go().
Una clase puede tener cualquier número de estos. variables de instancia, getter, setter, método
Un método sólo puede tener uno de estos. devolver
Soluciones de rompecabezas
y;
y=y * 10; x
= x + 1;
} x = 6;
mientras (x > 0) { x = x 1;
x<19 20 1
índice < 1 20 5
94 capítulo 4
Machine Translated by Google
5 escribiendo un programa
Métodos extrafuertes
Puedo
levantar objetos pesados.
%java DotComBust
extrañar
extrañar
extrañar
golpear
cada caja
Cuadrícula de 7 X 7 es una “celda” Ingrese una suposición D3
golpear
matar
extrañar
golpear
golpear
extrañar
Machine Translated by Google
escribiendo un programa
Un círculo significa
comenzar o terminar.
Comenzar
Se utiliza un
rectángulo para
1
representar una acción.
juego
terminado
introduce un número 3
golpear
introduce un número 4
extrañar
introduce un número 1
matar
Hiciste 4 conjeturas
98 capítulo 5
Machine Translated by Google
escribiendo un programa
Clase SimpleDotCom
código
código de preparación
de preparación código de prueba código real
código de preparación
Una forma de pseudocódigo que le ayuda a centrarse en
la lógica sin preocuparse por la sintaxis.
código de prueba
Una clase o métodos que probarán el código real.
y validar que está haciendo lo correcto.
código real
La implementación real de la clase. Aquí es donde escribimos
código Java real.
Hacer:
Clase SimpleDotCom
escribir código de preparación
SimpleDotComJuego
clase
escribir código de preparación
Clase SimpleDotCom
código de preparación código de preparación código de prueba código real
SimpleDotCom
int [] ubicaciónCeldas
int numOfHits
DECLARAR un método checkYourself() que toma una Cadena para la suposición del usuario (“1”, “3”, etc.), la verifica y devuelve un resultado
DECLARAR un método de establecimiento setLocationCells() que toma una matriz int (que tiene las tres ubicaciones de celda como ints (2,3,4, etc.).
TERMINARA SI
TERMINARA SI
FINALIZAR REPETIR
MÉTODO FINAL
MÉTODO FINAL
100 capitulo 5
Machine Translated by Google
escribiendo un programa
código de preparación código de prueba código de prueba código real
Escribir las
implementaciones del método.
¡Oh mi! Por un momento
escribamos el código pensé que no ibas a
escribir tu código de prueba
del método real ahora y hagamos
primero. ¡Vaya!
que este cachorro funcione. No me asustes así.
Clase SimpleDotCom
OBTÉN la suposición del usuario como un parámetro de cadena 2. Asígnale una ubicación (una matriz de 3 entradas, como {2,3,4}).
3. Cree una cadena para representar una suposición del usuario (“2”, “0”, etc.).
REPETIR con cada una de las celdas de ubicación en la matriz int
TERMINARA SI
TERMINARA SI
FINALIZAR REPETIR
MÉTODO FINAL
102 capítulo 5
Machine Translated by Google
escribiendo un programa
[Link](ubicaciones);
invocar el método
setter en
el punto com.
hacer que un
Cadena usuarioGuess = “2”;
usuario falso adivine
resultadodeprueba = “aprobado”;
si la suposición falsa (2) devuelve
un "acierto", está funcionando
}
[Link](resultadodeprueba);
imprimir el resultado de la prueba
(aprobado o reprobado”)
}
Afila tu lápiz
Clase SimpleDotCom
código de preparación código de prueba código real código real
El método checkYourself()
adivinar 1
int adivinar = [Link](stringGuess); convertir la cadena a un
CONVERTIR int
el usuario adivina un int
Resultado de cadena = “fallo”;
cree una variable para contener el resultado que
devolveremos. ponga "fallo" como valor
predeterminado (es decir, asumimos un "fallo")
4
romper;
salga del circuito, no es
necesario probar las otras celdas
} // terminara si
} // fin para
// DESCUBRE si fue la
última celda
if (numOfHits == ubicació[Link]) {
SI el número de visitas
es 3,
estamos fuera del circuito, pero veamos si estamos
resultado = “matar”; ahora
REGRESAR “matar” 'muerto' (golpeado 3 veces) y cambia la
como resultado
cadena de resultados a "Matar"
} // terminara si
DE LO CONTRARIO, no
VOLVER“golpear”
[Link](resultado); mostrar el resultado al usuario
104 capítulo 5
Machine Translated by Google
escribiendo un programa
Un método de la
clase Integer que
sabe cómo "analizar"
Una clase
una cadena en el int
que viene con Java. Toma una cuerda.
que representa.
1 Convertir un
1
Cadena a un int [Link](“3”)
2
2 El para bucle
para (int celda: ubicaciónCells) { }
Declare una variable que contendrá un elemento La matriz sobre la que se va a iterar en el bucle.
de la matriz. Cada vez que se realiza el ciclo, Cada vez que se realice el ciclo, el siguiente
esta variable (en este caso una variable int elemento de la matriz se asignará a la variable
llamada “celda”) contendrá un elemento diferente "celda". (Más sobre esto en el
final de este capítulo.)
de la matriz, hasta que no haya más elementos (o
el código haga una “ruptura”... ver # 4 abajo).
++ significa agregar 1 a
lo que haya allí (en otras
3 El operador post
palabras, incrementar en 1).
incremento
número de visitas++
numOfHits++ es lo mismo (en
este caso) que decir numOfHits =
numOfHits + 1, excepto que es
un poco más eficiente.
4
4 declaración de ruptura
romper;
Te saca de un bucle. Inmediatamente. Aquí mismo.
Sin iteraciones, sin pruebas booleanas, ¡sal ahora!
Clase SimpleDotCom
código de preparación código de prueba código real código real
[Link](ubicaciones);
int[] ubicaciónCeldas;
int número de visitas = 0;
si (númDeAccesos ==
ubicació[Link]) {
resultado = “matar”;
}
[Link](resultado);
resultado de devolución;
} // cerrar método } // cerrar
clase
Java SimpleDotComTestDrive
Hay un pequeño error acechando aquí. Se compila y se golpear
106 capítulo 5
Machine Translated by Google
escribiendo un programa
Afila tu lápiz
DECLARAR una variable int para contener el número de conjeturas del usuario, denominada numOfGuesses
%java SimpleDotComGame
MIENTRAS las punto com todavía están vivas:
introduce un numero 2
OBTENER información del usuario desde la línea de comando
golpear
introduce un número 3
golpear
introduce un número 4
extrañar
introduce un número 1
matar
Hiciste 4 conjeturas
Clase SimpleDotCom
código de preparación código de preparación código de prueba código real
DECLARE una variable int para contener el número de conjeturas del usuario, denominada numOfGuesses, configúrala en 0.
HAGA una matriz int con 3 ints usando el número generado aleatoriamente, ese número incrementado en 1 y ese número incrementado en 2 (ejemplo: 3,4,5)
DECLARAR una variable booleana que representa el estado del juego, denominada isAlive. Póngalo en verdadero
SI el resultado es "matar"
SET isAlive a falso (lo que significa que no volveremos a ingresar al bucle)
TERMINARA SI
TERMINAR MIENTRAS
MÉTODO FINAL No trabajes una parte del cerebro durante demasiado tiempo a la vez.
Trabajar sólo el lado izquierdo del cerebro durante más de 30 minutos es como
trabajar sólo el brazo izquierdo durante 30 minutos. Dale un descanso a cada
lado de tu cerebro cambiando de lado a intervalos regulares.
Cuando te mueves hacia un lado, el otro lado descansa y
recuperar. Las actividades del cerebro izquierdo incluyen cosas como
secuencias paso a paso, resolución de problemas lógicos y análisis, mientras
que el cerebro derecho se activa para metáforas, resolución creativa de
problemas, coincidencia de patrones y visualización.
108 capítulo 5
Machine Translated by Google
escribiendo un programa
PUNTOS DE VIÑETA
Su programa Java debería comenzar con un diseño de Elija bucles for en lugar de bucles while cuando sepa cuántas
variable (x;)
código real (Java)
Utilice [Link]() para obtener el valor int de una
El código previo debe describir qué hacer, no cómo
cadena.
para hacerlo. La implementación viene más tarde.
[Link]() funciona solo si la cadena representa un
Utilice el código de preparación para ayudar a diseñar el código
dígito (“0”, “1”, “2”, etc.)
de prueba.
Utilice break para salir de un bucle antes de tiempo (es decir, incluso
Escriba el código de prueba antes de implementar los
si la condición de prueba booleana sigue siendo verdadera).
métodos.
¿Cuántas
visitas recibiste el mes
pasado? ¿Incluidos
los visitantes habituales? 3
Sí...
Clase SimpleDotComGame
código de preparación código de prueba código real código real
público estático vacío principal (String [] argumentos) { crear una variable para rastrear
cuántas conjeturas hace el usuario
DECLARAR una variable int númeroDeGuesses = 0;
capaz de retener al usuario
conteo de conjeturas, Ayudante de GameHelper = nuevo GameHelper(); Esta es una clase especial que escribimos y que
configúrelo en 0
tiene el método para obtener la entrada del
usuario. Por ahora, finge que es parte de Java.
HACER un SimpleDot
SimpleDotCom theDotCom = nuevo SimpleDotCom(); hacer que el punto com sea un objeto
Objeto común
1
CALCULAR un int númeroaleatorio = (int) ([Link]() * 5); cree un número aleatorio para la primera
número aleatorio celda y utilícelo para crear la matriz de
entre 0 y 4
ubicaciones de celdas
HAGA una matriz int con
las ubicaciones de las 3 int[] ubicaciones = {NumAleatorio, NumAleatorio+1, NumAleatorio+2};
celdas y
[Link](ubicaciones); dale al punto com sus ubicaciones (la matriz)
INVOCAR setLoca
tionCells en el punto
booleano está vivo = verdadero;
objeto com
cree una variable booleana para rastrear si el juego todavía
DECLARAR un boolean
está activo, para usarla en la prueba del bucle while. repita
isAlive
mientras el juego aún esté vivo.
MIENTRAS el punto mientras (está vivo == verdadero) {
com sigue vivo obtener cadena de entrada del usuario
2
OBTENER entrada del usuario
Conjetura de cadena = [Link] ("ingrese un número");
// Revisalo
Resultado de cadena = [Link](guess);
pídale al punto com que verifique
INVOCAR checkYo
la suposición;
urself() en punto com númeroDeGuesses++; guardar el resultado
incrementar el conteo de conjeturas
devuelto en una cadena
INCREMENTAR
númeroDeConjeturas si ([Link](“matar”)) {
¿Fue una “muerte”? Si es así, establezca isAlive en falso (para que no volvamos a
SI el resultado es "matar"
está vivo = falso; ingresar al bucle) e imprima el recuento de conjeturas del usuario.
SET gameAlive a falso
} // cerrar mientras
} // cerrar principal
110 capitulo 5
Machine Translated by Google
escribiendo un programa
aleatorio() y getUserInput()
Este argumento
del método
toma una cadena
el usuario que utiliza.
para solicitar
en la línea de comando.
Una instancia que creamos
anteriormente, de una clase Cualquier cosa que pases aquí se
se muestra en la terminal justo antes
que creamos para ayudar con el de que el método comience a
Obtener información del
1
2 juego. Se llama GameHelper y buscar la entrada del usuario.
usuario usando la clase
aún no lo has visto (lo verás).
GameHelper
Preparé un
código para que no
tengas que hacerlo tú
mismo.
importar [Link].*;
clase pública GameHelper {
cadena pública getUserInput (solicitud de cadena) {
Cadena inputLine = nulo;
[Link](mensaje + “ “);
intentar {
112 capítulo 5
Machine Translated by Google
escribiendo un programa
Ventana de edición de archivos Ayuda Sonrisa Ayuda de la ventana de edición de archivos débil
extrañar golpear
extrañar golpear
extrañar matar
introduce un número 5
Afila tu lápiz
golpear
introduce un número 6
matar
Hiciste 6 conjeturas
para bucles
*
*
*
114 capítulo 5
Machine Translated by Google
escribiendo un programa
producción:
Viajes a través de un bucle
Repetir ayuda de la ventana de edición de archivos
++
del bucle
FALSO
imprimir el valor
de i
imprimir "hecho"
(saltar debajo del bucle)
x++;
incremento i
(la expresión
de iteración)
x = x + 1;
X;
x = x 1;
[Link](i);
nosotros
yo ++;
tener que incrementar int x = 0; intz = x++;
el contador
}
[Link](“hecho”);
mejorado para
El código a
Declare una variable de El colon (:) repetir va aquí (el
iteración que contendrá un solo medio "EN".
cuerpo).
elemento en la matriz.
116 capítulo 5
Machine Translated by Google
escribiendo un programa
Lanzamiento
largo corto
se puede lanzar a
Se
cortaron trozos
del lado
01011101 izquierdo.
pero podrías 1101
perder algo
[Link](“3”) Aún así, el punto es que el compilador te permite hacerlo. Y digamos que
tienes un número de coma flotante y solo quieres obtener la parte entera (int) :
flotador f = 3,14f;
% java Salida 12
14
clase Salida {
[Link](); o
}
Ventana de edición de archivos Ayuda Incienso
y++;
si (x > 4) {
si (y > 14) {
“ java
% java
TestArrays
Salida %13 15
[Link](“ x = +x);
x = Fiji
Isla 6 isla =
= Isla
romper; Cozumel = Isla
Bermuda = Azores
}
118 capítulo 5
Machine Translated by Google
escribiendo un programa
x++;
si (x == 1) {
““
[Link](x + +y);
clase
MultiFor {
público
% java MultiFor
04
03
14
13
34
33
rompecabezas: JavaCross
JavaCruz
120 capitulo 5
Machine Translated by Google
escribiendo un programa
clase MezclaPara5 {
público estático vacío principal (String [] argumentos) {
int x = 0; int y =
30; for (int externo
= 0; externo < 3; externo++) {
for(int interior = 4; interior > 1; interior) {
El código candidato
y = y 2; si (x == va aquí.
6) { romper;
} x = x + 3;
} y = y 2;
}
““
[Link](x + +y);
}
}
x = x + 3; 45 6 Relacionar
cada candidato
x = x + 6; 36 6 con uno de
x++; 60 10
X; 18 6
x = x + 0; 6 14
12 14
soluciones de ejercicio
público estático vacío principal (String [] argumentos) { público estático vacío principal (String [] argumentos) {
}
for(int y = 4; y > 2; y) {
ir vacío() { [Link](x +
““
+y);
int y = 7; }
si (y > 14) { }
Ventana de edición de archivos Ayuda Monopole
“
[Link](“ x = +x);
% java MultiFor 0 4
romper; 03
14
}
13
} 34
33
}
¿Afecta la salida?
%
javajava TestArrays
Salida isla = %
Fiji
isla13 15 x = 6
= Isla
Cozumel = Isla
Bermuda = Azores
122 capítulo 5
Machine Translated by Google
escribiendo un programa
IMPLEMENTAR METRO
R PARA mi
EXTREMO PAG
XLSRETURNH
PSEUDOCODEIO R
EROTCASTTD
VARIABLE EICAPIJTSTRAOSELEMENT I
A
IRMARÍ
OAEJAVA. LANGZ
NTNE
IIIINTEGEROPM
OTBOOLEAN
ALEATORIO
SUNPARSEINTH
NBREAKL
x = x + 3; 45 6
x = x + 6; 36 6
x = x + 2; 54 6
x++; 60 10
X; 18 6
x = x + 0; 6 14
12 14
Ventana de edición de archivos Ayuda Sonrisa Ayuda de la ventana de edición de archivos débil
introduce un número 5
golpear
En la versión actual, una vez
introduce un número 6
que recibes un golpe, ¡simplemente
matar puedes repetir ese golpe dos
Hiciste 6 conjeturas veces más para matar!
126 capítulo 6
Machine Translated by Google
Resultado de cadena = “fallo”; Cree una variable para contener el resultado que
Necesitamos una
forma de saber que } // fin para
cuando un
if (numOfHits == ubicació[Link]) {
usuario acierta, no Estamos fuera del ciclo, pero si lo hacemos
ha acertado previamente vamos a ver ahora (presionamos
resultado = “matar”; 'muerto'
en esa celda. Si es así,
3 veces) y cambiamos la cadena de
entonces no
} // terminara si resultados a "matar".
queremos contarlo como un éxito.
arreglando el error
¿Cómo lo arreglamos?
Necesitamos una forma de saber si una célula ya ha sido atacada. Repasemos algunas
posibilidades, pero primero, veremos lo que sabemos hasta ahora...
Tenemos una fila virtual de 7 celdas y un DotCom ocupará tres celdas consecutivas
en algún lugar de esa fila. Esta fila virtual muestra un DotCom ubicado en las
ubicaciones de las celdas 4, 5 y 6.
La fila virtual, 3
con el
ubicaciones de celdas
para el objeto DotCom.
DotCom tiene una variable de instancia (una matriz int) que contiene las ubicaciones
de las celdas de ese objeto DotCom.
La variable
de instancia de matriz que
locationCells contiene las ubicaciones de las celdas de DotCom.
(variable de instancia de 0 1 2 Este DotCom contiene los 3 valores de 4, 5 y 6.
DotCom) Esos son los números que el usuario debe
adivinar.
1 Opcion uno
Podríamos crear una segunda matriz, y cada vez que el usuario haga un acierto,
almacenaremos ese acierto en la segunda matriz y luego verificaremos esa matriz cada
vez que obtengamos un acierto, para ver si esa celda ha sido acertada antes.
128 capítulo 6
Machine Translated by Google
2 Opción dos
Podríamos simplemente mantener la matriz original, pero cambiar el valor de cualquier celda
de acierto a 1. De esa manera, solo tenemos UNA matriz para verificar y manipular.
locationCells
(variable de instancia de 0 1 2
DotCom)
La opción dos es un poco menos complicada que la opción uno, pero no es muy eficiente. Aún tendría
que recorrer las tres ranuras (posiciones de índice) de la matriz, incluso si una o más ya no son
válidas porque han sido "accesionadas" (y tienen un valor 1).
Tiene que haber algo mejor...
código de preparación
3 Opción tres
Eliminamos la ubicación de cada celda a medida que llega y luego modificamos la matriz para que sea más pequeña. Excepto que las
matrices no pueden cambiar su tamaño, por lo que tenemos que crear una nueva matriz y copiar las celdas restantes de la matriz
La opción tres sería mucho mejor si la matriz pudiera reducirse, de modo que no tuviéramos
que crear una nueva matriz más pequeña, copiar los valores restantes y reasignar la referencia.
REPETIR con cada una de las celdas de ubicación en la matriz int REPETIR con cada una de las celdas de ubicación restantes
// COMPARA la suposición del usuario con la celda de ubicación // COMPARA la suposición del usuario con la celda de ubicación
// DESCUBRE si fue la última celda de ubicación: // DESCUBRE si fue la última celda de ubicación:
SI el número de golpes es 3, REGRESAR “matar” SI la matriz ahora está vacía, DEVOLVER "matar"
DE LO CONTRARIO , no fue una muerte, así que REGRESAR “golpear” DE LO CONTRARIO , no fue una muerte, así que REGRESAR “golpear”
TERMINARA SI TERMINARA SI
ELSE la suposición del usuario no coincidió, por lo tanto DEVOLVER “miss” ELSE la suposición del usuario no coincidió, por lo tanto DEVOLVER “miss”
TERMINARA SI TERMINARA SI
130 capitulo 6
Machine Translated by Google
132 capítulo 6
Machine Translated by Google
ahora mismo; simplemente significa "hacer de esto una lista de objetos Huevo".
1 Haz uno
ArrayList<Huevo> miLista = new ArrayList<Huevo>(); Se crea un nuevo objeto
ArrayList en el montón. Es
pequeño porque está vacío.
2 Pon algo en él
Huevo s = nuevo Huevo();
Ahora ArrayList crece como un "cuadro"
para contener el objeto Egg.
[Link](s);
[Link](b);
b
s
[Link](s);
b
usted está aquí 133
Machine Translated by Google
Afila tu lápiz
Objeto o = [Link](1);
[Link](1);
134 capítulo 6
Machine Translated by Google
no existen
Preguntas tontas
La entrevista de esta semana:
ArrayList, en matrices
HeadFirst: Entonces, las ArrayLists son como matrices, ¿verdad?
HeadFirst: Si no me equivoco, las matrices también son objetos. Viven en el montón allí mismo con todos los
demás objetos.
ArrayList: Seguro que las matrices se acumulan, claro, pero una matriz sigue siendo una aspirante a
ArrayList. Un impostor. Los objetos tienen estado y comportamiento, ¿verdad? Lo tenemos claro. ¿Pero
realmente has intentado llamar a un método en una matriz?
HeadFirst: Ahora que lo mencionas, no puedo decir que sí. Pero, de todos modos, ¿qué método llamaría?
Sólo me importa llamar a métodos sobre las cosas que pongo en la matriz, no la matriz en sí. Y puedo usar
la sintaxis de matriz cuando quiero poner y sacar cosas de la matriz.
ArrayList: ¿Es así? ¿Quieres decirme que realmente eliminaste algo de una matriz? (Dios, ¿dónde los
entrenan ? ¿En McJava?)
HeadFirst: Por supuesto que saco algo del conjunto. Digo Dog d = dogArray[1] y obtengo el objeto Dog en el
índice 1 de la matriz.
ArrayList: Muy bien, intentaré hablar despacio para que puedas seguirme. No estabas , repito , no
eliminando a ese Perro de la matriz. Todo lo que hizo fue hacer una copia de la referencia al Perro y asignarla
a otra variable Perro.
HeadFirst: Oh, ya veo lo que estás diciendo. No, en realidad no eliminé el objeto Perro de la matriz.
Todavía está ahí. Pero supongo que puedo establecer su referencia en nula.
ArrayList: Pero soy un objeto de primera clase, así que tengo métodos y puedo, ya sabes, hacer cosas
como eliminar la referencia del Perro de mí mismo, no solo establecerla como nula.
Y puedo cambiar mi talla, dinámicamente (búsquelo). ¡Intenta conseguir una matriz para hacer eso!
HeadFirst: Vaya, odio mencionar esto, pero el rumor es que no eres más que un grupo glorificado pero
menos eficiente. Que, de hecho, eres solo un contenedor para una matriz, agregando métodos
adicionales para cosas como cambiar el tamaño que yo mismo habría tenido que escribir. Y ya que estamos
en eso, ¡ni siquiera puedes mantener primitivas! ¿No es eso una gran limitación?
ArrayList: No puedo creer que creas esa leyenda urbana. No, no soy sólo una matriz menos eficiente.
Admito que hay algunas situaciones extremadamente raras en las que una matriz puede ser un poco,
repito, un poco más rápida para ciertas cosas. Pero, ¿vale la pena la minúscula ganancia de rendimiento para
renunciar a todo este poder? Aún así, observe toda esta flexibilidad. Y en cuanto a las primitivas, por supuesto,
puedes poner una primitiva en una ArrayList, siempre y cuando esté envuelta en una clase contenedora
primitiva (verás mucho más sobre eso en el capítulo 10).
Y a partir de Java 5.0, ese ajuste (y desenvolvimiento cuando se vuelve a sacar la primitiva) ocurre
automáticamente. Y está bien, reconoceré que sí, si estás usando una ArrayList de primitivas, probablemente
sea más rápido con una matriz, debido a todo el empaquetado y desenvolvimiento, pero aún así... ¿quién usa
realmente primitivos hoy en día?
¡Oh, mira la hora! Llego tarde a Pilates. Tendremos que hacer esto de nuevo alguna vez.
si ([Link](elemento)) {
está en = verdadero;
romper;
136 capítulo 6
Machine Translated by Google
1 Una matriz antigua y simple debe conocer su tamaño 3 Las matrices utilizan una sintaxis de matriz que
en el momento de su creación. no se utiliza en ningún otro lugar de Java.
miLista[1]
nueva cadena[2] Necesita una talla. Los corchetes de matriz [] son una sintaxis
Necesita un índice.
La <Cadena> entre corchetes angulares es un
"parámetro de tipo". ArrayList<String> significa
simplemente "una lista de cadenas", a diferencia de
ArrayList<Dog> que significa "una lista de perros".
[Link](b);
Sin índice.
int[] ubicaciónCeldas;
int número de visitas = 0;
romper;
}
} // fuera de la lupa
if (numOfHits == ubicació[Link]) {
resultado = “matar”;
}
[Link](resultado);
resultado de devolución;
} // cerrar método
} // cerrar clase
138 capítulo 6
Machine Translated by Google
si (índice >= 0) {
cero,
Si el índice es mayor o igual a
ubicació[Link](índice); lista, así la
que él.
elimine del usuario definitivamente está en el
suposición
} // cerrar exterior si
resultado de devolución;
} // cerrar método
} // cerrar clase
haciendo el DotComBust
%java DotComBust
extrañar
extrañar
extrañar
golpear
matar
extrañar
golpear
golpear
matar
extrañar
Machine Translated by Google
a dt oh a kmi Doht Co
i nupt
metro
norte
ay r
metro yo
mi
yo oh
Ca
Fr ti
pag
oh
mis
ens
tus mis un
d lays w it
3 clases: crmiat h
pag
Más 4
ArrayLists: 1 para
DotComBust y 1
5 objetos: para cada uno de
los 3 objetos DotCom.
puntocom
DotComBusto puntocom Ayudante del juego
puntocom
instancias
Objeto
El objeto DotComBust (juego)
ayudante
GameHelper
crea una instancia de
2 GameHelper, el objeto que
ayudará al juego a hacer su
Objeto trabajo.
DotComBust
Objeto
DotComBust
142 capítulo 6
Machine Translated by Google
Objeto
células
GameHelper
ayudante dotComsList
puntoCom puntocom
puntoCom
células
0 2
1
Objeto
DotComBust Objeto ArrayList para Objetos
contener objetos DotCom
DotCom
El objeto DotComBust solicita al objeto El objeto DotComBust le da a cada uno de los objetos Dot
auxiliar una ubicación para un Com una ubicación (que DotComBust obtuvo del objeto
DotCom (hace esto 3 veces, una por cada auxiliar) como “A2”, “B2”, etc. Cada objeto DotCom coloca
DotCom) sus propias tres celdas de ubicación en un ArrayList
ohC
yo ati en
akmi
metro
aquí lo tienes
Objeto ArrayList (para
5 Objeto
GameHelper células
celúla
0
celúla
celúla contener ubicaciones
de celdas DotCom)
2
1
ayudante dotComsList
células
objeto
Objeto celúla
0
celúla
celúla
2
ArrayList
puntoCom puntocom 1
puntoCom
DotComBust 0 2
células
1
objeto
Objeto ArrayList para Objetos celúla
celúla
celúla ArrayList
0 2
DotCom
El objeto DotComBust solicita al objeto auxiliar una El objeto DotComBust recorre la lista de DotCom y pide a
suposición del usuario (el asistente solicita al cada uno que verifique la suposición del usuario para encontrar
usuario y obtiene información desde la línea de una coincidencia. DotCom comprueba sus ubicaciones ArrayList y
comandos)
uess devuelve un resultado ("acierto", "fallo", etc.)
tusmir
gramo
gramo
mit
6 aquí lo tienes
tumiss Objeto ArrayList (para
Objeto s
t hi
gramo
contener ubicaciones
GameHelper miCk
celúla celúla
celúla
células
hC
02
células
objeto
Objeto celúla
0
celúla
celúla
2
ArrayList
puntoCom puntocom 1
puntocom
DotComBust 0 2
células
1
configurarJuego()
empezar a jugar()
comprobarUserGuess()
terminarJuego()
DECLARAR y crear una instancia de un ArrayList para contener la lista de DotComs (inicialmente tres). Llámelo
dotComsList.
Variable
DECLARAR una variable int para contener el número de conjeturas del usuario (para que podamos darle al usuario una
Declaraciones puntuación al final del juego). Nómbrelo numOfGuesses y configúrelo en 0.
DECLARAR un método setUpGame() para crear e inicializar los objetos DotCom con nombres y ubicaciones. Mostrar
instrucciones breves al usuario.
Método DECLARAR un método startPlaying() que le pide al jugador que adivine y llama al método checkUserGuess()
hasta que todos los objetos DotCom sean eliminados del juego.
Declaraciones DECLARAR un método checkUserGuess() que recorre todos los objetos DotCom restantes y llama al método checkYourself()
de cada objeto DotCom.
DECLARAR un método finishGame() que imprime un mensaje sobre el rendimiento del usuario, en función de cuántas
conjeturas fueron necesarias para hundir todos los objetos DotCom.
LLAME al método placeDotCom() en el objeto auxiliar para obtener una ubicación seleccionada aleatoriamente
para este DotCom (tres celdas, alineadas vertical u horizontalmente, en una cuadrícula de 7 X 7).
FINALIZAR REPETIR
MÉTODO FINAL
144 capítulo 6
Machine Translated by Google
FINALIZAR REPETIR
MÉTODO FINAL
CONFIGURA la variable de resultado local (una cadena) en "fallo", suponiendo que la suposición del usuario será un error.
EVALUAR la suposición del usuario llamando al método checkYourself() del objeto DotCom
FINALIZAR REPETIR
MÉTODO FINAL
DEMÁS
TERMINARA SI
MÉTODO FINAL
Afila tu lápiz
146 capítulo 6
Machine Translated by Google
romper;
} } // cerrar para
[Link](resultado); 17
} // cerrar método
[Link](nuevaUbicación);
Llame al método de este
} // cerrar bucle for
establecimiento en DotCom para darle la
} // cerrar el método setUpgame ubicación que acaba de obtener del asistente.
String userGuess = [Link](“Ingrese una suposición”); checkUserGuess(usuarioGuess); Obtenga información del usuario.
Llame a nuestro
propio método checkUserGuess.
} // cerrar mientras
terminarJuego(); Llame a nuestro propio método FinishGame.
148 capítulo 6
Machine Translated by Google
[Link](puntoComToTest); romper; Este tipo está muerto, así que sácalo del
} // cerrar para
el código DotCom
importar [Link].*;
nombre = n;
si (índice >= 0) {
Usar el método remove() de ArrayList para eliminar una entrada.
ubicació[Link](índice);
+ nombre +
“ :
[Link](“¡Ay! Te hundiste” ( “);
} demás {
resultado = “golpe”;
Avisa al usuario cuando
} // cerrar si se ha hundido un DotCom.
} // cerrar si
resultado de devolución;
} // cerrar clase
150 capitulo 6
Machine Translated by Google
si (modelo! = 2000) {
// hacer cosas que no sean del modelo 2000
}
Operadores 'Y' y 'O' ( &&, || )
si () {
// hacer cosas X que no sean de marca
}
if ([Link](“A”) || [Link](“B”) ) {
// hacer cosas para marca A marca B
}
Esta es la clase auxiliar del juego. Además del método de entrada del usuario (que avisa al usuario y
lee la entrada desde la línea de comandos), el gran servicio del ayudante es crear las ubicaciones de
las celdas para los DotCom.
Si fuéramos usted, nos alejaríamos lentamente de este código, excepto para escribirlo y compilarlo.
Intentamos mantenerlo bastante pequeño para que no tuvieras que escribir tanto, pero eso significa
que no es el código más legible. Y recuerda, no podrás compilar la clase del juego DotComBust
importar [Link].*; hasta que tengas clase.
importar [Link].*; este
[Link](“IOException: “ + mi);
}
devolver [Link]();
}
152 capítulo 6
Machine Translated by Google
[Link]([Link]([Link](fila)));
x++; Esta es la declaración que le
“
// [Link](“ coord “+x+” = + [Link](x1)); indica exactamente dónde
}
se encuentra DotCom.
// [Link](“\n”);
Paquetes API
[Link]
[Link]
[Link]
154 capítulo 6
Machine Translated by Google
[Link]
A IMPORTAR
Coloque una declaración de importación en la parte superior de su archivo de código fuente:
importar [Link];
clase pública MiClase {... }
O
B TIPO
Escriba el nombre completo en todas partes de su código. Cada vez que lo uses.
Dondequiera que lo uses.
PUNTOS DE VIÑETA
156 capítulo 6
Machine Translated by Google
no existen
Preguntas tontas
importar
hazlo pegado
importar
incluye
importar
importar
importar
importar
o
conociendo la API
1 buscar un libro
158 capítulo 6
Machine Translated by Google
1 buscar un libro
Hojear un libro de
referencia es la mejor
manera de descubrir
qué hay en la biblioteca
de Java. Puedes tropezar
fácilmente con una clase
que parezca útil,
simplemente navegando por las páginas.
nombre de la clase
descripción de clase
160 capítulo 6
Machine Translated by Google
[Link](2); imprimirAL(a);
imprimirAL(a);
[Link](0,”cero”);
[Link](1,”uno”);
if ([Link](“dos”)) {
}
[Link](“2.2”);
[Link](2,”dos”);
[Link](elemento + } “ “);
[Link](“ “);
if ([Link](“tres”)) { [Link](“cuatro”);
if ([Link](“cuatro”) != 4) {
[Link](4, “4.2”);
}
} }
importar [Link].*;
}
imprimirAL(a);
rompecabezas: crucigrama
JavaCross 7.0
162 capítulo 6
Machine Translated by Google
importar [Link].*;
if ([Link](“tres”)) {
[Link](“cuatro”);
}
[Link](2);
imprimirAL(a);
if ([Link](“cuatro”) != 4) {
[Link](4, “4.2”);
}
imprimirAL(a);
if ([Link](“dos”)) {
[Link](“2.2”);
}
imprimirAL(a);
}
[Link](elemento + } “ “);
[Link](“ “);
}
}
PRIMITIVO S
D mi l h
ÍNDICE DE OBJETOS DE
JavaCruz Ud. h SEÑOR
B SI
respuestas
PAG oh hora del este C
l AGREGAR LARGO oh
k V A EN T
LISTA DE ARREGLO l S A
GRAMO
R TAMAÑO I
A LONGITUD SM norte
Afila tu lápiz
164 capítulo 6
Machine Translated by Google
7 herencia y polimorfismo
el poder de la herencia
1
Cuadrado Círculo Triángulo Ameba
Miré lo que los cuatro
girar() girar() girar() girar() las clases tienen en común.
reproducir sonido() reproducir sonido() reproducir sonido() reproducir sonido()
2
Forma
Son formas y todas giran y
reproducir sonido. Así que abstraje el
características comunes y ponerlas en un
girar()
reproducir sonido() 3
nueva clase llamada Forma. Forma Luego vinculé las otras
cuatro clases de forma
superclase girar()
reproducir sonido() a la nueva clase Forma,
en una relación llamada
herencia.
Puede leer esto como "El cuadrado hereda de la forma",
"El círculo hereda de la forma", etc. Eliminé rotar() y subclases
reproducirSound() de las otras formas, por lo que ahora
solo hay una copia que mantener.
Cuadrado Círculo Triángulo Ameba
La clase Shape se denomina superclase de las otras cuatro
clases. Las otras cuatro son las subclases de Shape. Las
subclases heredan los métodos de la superclase. En otras
palabras, si la clase Shape tiene la funcionalidad, entonces
las subclases obtienen automáticamente esa misma funcionalidad.
166 capítulo 7
Machine Translated by Google
herencia y polimorfismo
mir r
i d mi
ohv
norte
oh
w
Ask w
METRO
mi h oh
superclase
(más abstracto)
Forma
4
girar()
reproducir sonido()
HiceHice la clase
que la anulación de laanulara
Amoeba clase Amoeba
el método
rotar() del
Forma de superclase de los métodos
de larotar() y playSound()
superclase .
Forma. Anular simplemente
subclases
significa que una subclase
simplemente redefine
significa que una Anular
(mas especifico) uno de sus métodos heredados cuando la
subclase redefine uno de sus
necesita cambiar
heredados o ampliar
cuando sea los métodos
necesario
Cuadrado Círculo Triángulo Ameba
comportamiento de ese método.
cambiar o ampliar el comportamiento
girar() de ese método.
// específico de ameba
// rotar código
Métodos primordiales
reproducir sonido()
// específico de ameba
// código de sonido
Entendiendo la herencia
Cuando diseñas con herencia, pones código común en una
clase y luego le dices a otras clases más específicas que
la clase común (más abstracta) es su superclase. Cuando
una clase hereda de otra, la subclase hereda de la superclase.
superclase superhéroe
métodos
utilizarSpecialPower()
putOnSuit() (comportamiento)
subclases
(más específicas)
panterahombre
hombrehuevofrito Métodos
utilizar potencia especial()
primordiales
ponerEnTraje()
168 capítulo 7
Machine Translated by Google
herencia y polimorfismo
Un ejemplo de herencia:
Heredé mis
Doctor de clase pública { procedimientos, así que
no me molesté en estudiar medicina.
trabajos booleanos en el hospital; Relájate, esto no te dolerá nada.
(Ahora, ¿dónde puse esa
tratamiento vacíoPaciente() { sierra eléctrica...?)
// realizar un chequeo
}
}
superclase
Afila tu lápiz
Doctor
¿Cuántas variables de instancia tiene
trabajaEnElHospital
una variable de instancia
Cirujano?
170 capítulo 7
Machine Translated by Google
herencia y polimorfismo
Animal
imagen
límites
del
hambre
alimentaria ubicación
hacer ruido()
comer()
dormir() deambular()
León
tamaño
Lobo
de la imagen
de la comida tamaño
presa de la imagen
de la comida
Gato
presa
Tigre tamaño
Hipopótamo
tamaño
de la imagen
tamaño
de la imagen Perro de la comida
de la imagen
de la comida tamaño presa
de la comida
presa de la imagen
presa
de la comida
presa
En la
comunidad canina, el ladrido
es una parte importante de nuestra
Soy un herbívoro identidad cultural. Tenemos un sonido
muy malo. único y queremos que esa diversidad
sea reconocida y respetada.
Animal
imagen
alimento
hambre
límites Es mejor que anulemos estos dos métodos, eat() y
ubicación makeNoise(), para que cada tipo de animal pueda definir
su propio comportamiento específico para comer y hacer
hacer ruido() ruido. Por ahora, parece dormir() y
comer() roam() puede seguir siendo genérico.
dormir()
vagar()
172 capítulo 7
Machine Translated by Google
herencia y polimorfismo
Animal
imagen
alimento
hambre
límites
ubicación
hacer ruido()
comer()
dormir()
vagar()
Hmmm... Me pregunto tal vez y el perro son ambos caninos...
El lobo
si León, Tigre y Gato hay algo que AMBASeso
tendrían algo en común. clases podrían usar...
León
tamaño
Lobo
imagen
alimento tamaño
hacer ruido()
presa
comer() imagen
alimento
hacer ruido()
Gato
presa
comer()
Tigre tamaño
Hipopótamo
tamaño imagen
tamaño
imagen Perro alimento
imagen hacer ruido()
alimento presa
alimento hacer ruido() tamaño
comer()
hacer ruido() presa imagen
comer()
presa
comer() alimento
hacer ruido()
presa
comer()
Felino
Canino
vagar()
Hipopótamo
vagar()
tamaño
imagen comida
makeNoise() presa
comer()
León
tamaño
imagen
comida
makeNoise() presa
comer()
Perro
Gato
tamaño
Tigre
tamaño
imagen comida
imagen comida Lobo makeNoise() presa
comer()
tamaño
makeNoise() presa comer() tamaño
imagen comida
imagen
makeNoise() presa comer() comida
makeNoise() presa
comer()
174 capítulo 7
Machine Translated by Google
herencia y polimorfismo
Animal
hacer ruido()
comer()
dormir() deambular()
Hacer una nueva Lobo w = nuevo Lobo();
Objeto lobo
Canino
llama a la versión en Canine [Link]();
vagar()
llama a la versión en Wolf comer();
Lobo
tamaño
makeNoise() imagen comer() comida
presa
no existen
Preguntas tontas
176 capítulo 7
Machine Translated by Google
herencia y polimorfismo
Bañera
tamaño entero;
Baño Burbujas b;
Bañera de hidromasaje;
Burbujas
Hundirse el fregadero;
radio interno;
int colorAmt;
Lobo es un canino
Canino
El lobo es un animal
vagar()
Lobo
tamaño
makeNoise() imagen comer() comida
presa
178 capítulo 7
Machine Translated by Google
herencia y polimorfismo
hazlo pegado
dirección! uno
Persona extiende Empleado
no existen
Preguntas tontas
súper
¿Quién se queda con el Porsche y quién con la porcelana? Los niveles de acceso controlan quién ve qué y son cruciales
(cómo
(cómo saber
saber qué
qué puede
puede hacer una
heredar subclase
una a tener un código Java robusto y bien diseñado. Por ahora vamos a
subclasededesususuperclase)
heredar superclase) centrarse sólo en lo público y lo privado. Las reglas son simples para
esos dos:
180 capitulo 7
Machine Translated by Google
herencia y polimorfismo
HACER
HACER
PUNTOS DE VIÑETA
Entonces, ¿qué te
aporta realmente toda esta herencia?
2 Defines un común
Protocolo para un grupo de clases.
Um, ¿qué
diablos significa
ESO?
182 capítulo 7
Machine Translated by Google
herencia y polimorfismo
Animal
Le estás diciendo al mundo que
Y eso significa para mí...
hacer ruido() cualquier animal puede hacer estas
comer()
cuatro cosas. Eso incluye los argumentos
dormir()
vagar() del método y los tipos de retorno.
*Cuando decimos “todos los métodos” nos referimos a “todos los métodos heredables ”, que
por ahora en realidad significa “todos los métodos públicos ”, aunque más adelante refinaremos
esa definición un poco más.
Los 3 pasos de la
declaración y asignación de objetos.
1 2
Para ver cómo funciona el polimorfismo, 3
tenemos que dar un paso atrás y observar la Perro miPerro = nuevo Perro();
forma en que declaramos una
normalmente referencia.
y crear un objeto... 1
Declarar una variable de
referencia
Mi perro
Perro
2 Crea un objeto
Objeto de perro
3 Vincular el objeto y
la referencia
Objeto de perro
Mi perro
Perro
184 capítulo 7
Machine Translated by Google
herencia y polimorfismo
Mi perro
Doh bj miCt
gramo
oh
Perro
Mi perro
Doh bj miCt
gramo
oh
Animal
polimorfismo en acción
animales[yo].comer();
animales[i].vagar(); el método eat() del Perro. Cuando 'i' es 1, obtienes el método eat() del gato
}
Lo mismo con deambular().
186 capítulo 7
Machine Translated by Google
herencia y polimorfismo
a
clase veterinaria {
métodos
todavía trabajo... (el único inconveniente es que sólo estoy haciendo la vida
188 capítulo 7
Machine Translated by Google
herencia y polimorfismo
no existen
Preguntas tontas
privado
público
final
final
privado
métodos primordiales
Aparato
activación booleana()
apagado booleano()
Tostadora
¡No se pueden
cambiar los
argumentos en un método primordial!
190 capítulo 7
Machine Translated by Google
herencia y polimorfismo
Sobrecargar un método
Un método sobrecargado
es simplemente un método
diferente que tiene el
mismo nombre de método. No
tiene nada que ver con la
herencia y el polimorfismo. Un
método sobrecargado NO es
lo mismo que un método anulado.
3 Varías lospoder
niveles de acceso en setUniqueID vacío público (int ssNumber) {
“”
cualquier dirección. Cadena numString = + ssNumber;
setUniqueID(numString);
Eres libre de sobrecargar un método con un método que sea
}
más restrictivo. No importa, ya que el nuevo método no está
}
obligado a cumplir el contrato del método sobrecargado.
fijo
esge
a = 6; 56
segundo 11
= 5; a = 5; sesenta y cinco
el programa:
b.m1();
}
producción:
c.m2();
candidatos de código:
a.m3(); A es m1, A es m2, C es m3, 6
m1 de B, m2 de A, m3 de A,
}
c.m1();
c.m2(); A es m1, B es m2, A es m3,
c.m3();
B es m1, A es m2, C es m3, 13
}
a.m1();
M1 de B, m2 de C, m3 de A,
b.m2();
c.m3(); B es m1, A es m2, C es m3, 6
}
a2.m1(); A es m1, A es m2, C es m3, 13
a2.m2();
a2.m3();
192 capítulo 7
Machine Translated by Google
herencia y polimorfismo
ma[x].asustar(x); }
}
miedo booleano (int x) {
} 2
[Link](“arrrgh”);
}
A
devolver verdadero;
B [Link](“¿un bocado?”);
A devolver 1;
} }
[Link](“aliento de fuego”);
devolver verdadero; miedo booleano (int z) {
4
[Link](“arrrgh”);
} A
Ventana
Ayuda dede
la edición
ventanade
dearchivos
edición Ayuda Suspender
de archivos SaveYourself devolver verdadero;
}
% java
java TestArrays % ¿un
MonsterTestDrive
bocado?
isla = Fiji aliento } miedo booleano (byte b) {
=deCozumel
fuego isla arrrgh isla B [Link](“¿un bocado?”);
Bermuda
= isla = Azores devolver verdadero;
}
Rompecabezas de piscina
bote de remos de clase pública ________ ________ { barcos de prueba de clase pública {
[Link](“___________”); }
}
}
}
vela de deriva a la deriva
194 capítulo 7
Machine Translated by Google
herencia y polimorfismo
El conjunto 1 funcionará.
arrrgh
aliento de fuego
arrrgh
b.m1();
}
candidatos de código: producción:
c.m2();
a.m3(); A es m1, A es m2, C es m3, 6
fijo m1 de B, m2 de A, m3 de A,
}
c.m1();
c.m2();
esge c.m3();
A es m1, B es m2, A es m3,
}
c.m3(); B es m1, A es m2, C es m3, 6
[Link](“golpe de natasha”);
}
}
longitud de retorno ;
}
[Link](“deriva ”);
}
}
[Link](32);
[Link]();
[Link]();
[Link]();
}
}
}
}
196 capítulo 7
Machine Translated by Google
Polimorfismo grave
hacer ruido()
comer()
dormir() deambular()
Felino
Canino
vagar()
Hipopótamo
vagar()
tamaño
imagen comida
makeNoise() presa
comer()
León
tamaño
imagen
comida
makeNoise() presa
comer()
Perro
Gato
tamaño
tamaño
Tigre imagen comida
de la imagen
Lobo makeNoise() presa
comer()
de la comida
makeNoise() presa
tamaño
tamaño come()
imagen
imagen comida
comida
makeNoise() presa comer() makeNoise() presa
comer()
198 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
un lobo
un hipopótamo
Referencia animal a un
hi pag
bj mi
Connecticut
Referencia animal a un
animado ?
objeto animal. Ai Ct
a ohbj mi
norte
metro yo
Animal
objetos aterradores
abstracto
200 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
c = nuevo Perro();
c = nuevo Canino();
entonces
}
Ayuda de la ventana de edición de archivos BeamMeUp
% javac [Link]
c = nuevo Canino();
^
1 error
Con una clase abstracta, los chicos que hacen el trabajo en tiempo de
subclase
ejecución son instancias de su clase abstracta.
abstracto
Canino
concreto
Hipopótamo
abstracto
Felino concreto
Perro
concreto concreto
Gato
Lobo
concreto concreto
León
Tigre
¿abstracto o concreto?
202 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
Métodos abstractos
Realmente apesta
ser un método abstracto.
No tienes cuerpo.
no existen
Preguntas tontas
Implementar un método
abstracto es como un
primordial método.
204 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
Afila tu lápiz
solicitud de arquitecto
aplicación de entrenamiento
ejemplos de polimorfismo
Polimorfismo en acción
agregar(Perro d)
agregar vacío público (Perro d) {
Si aún no estamos en el límite de la matriz
if (nextIndex <[Link]) { de perros, agregue el Perro e imprima un
mensaje.
perros[nextIndex] = d;
“
[Link](“Perro agregado en + índicesiguiente);
siguienteIndex++;
}
incremento, para darnos el el
siguiente índice a usar
}
}
206 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
2 animal privado[] animales = nuevo animal[5]; (Recuerde, no puede crear una nueva
privado int nextIndex = 0; instancia de un tipo abstracto, pero PUEDE
Mi lista de animales
agregar vacío público (Animal a) {
crear un objeto de matriz declarado
para MANTENER ese tipo).
if (siguienteÍndice <[Link]) {
animales[] animales
int índice siguiente animales[nextIndex] = a;
“
[Link](“Animal agregado en nextIndex++; + índicesiguiente);
agregar(Animal a)
}
}
}
% java AnimalTestDrive
Animal agregado en 0
Animal agregado en 1
¿Qué pasa con los no animales? ¿Por qué no crear una clase
lo suficientemente genérica como para tomar cualquier cosa?
208 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
Objeto
booleano es igual()
1 es igual a (Objeto o)
3 código hash()
Perro a = nuevo Perro();
Gato c = nuevo gato(); Gato c = nuevo gato();
[Link]([Link]());
si ([Link] igual a (c)) { Menú desplegable de ayuda de la ventana de edición de archivos
identificación única).
Ventana de edición de archivos Ayuda Detener
no existen
Preguntas tontas
final
210 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
Perro d= = [Link](0);
myD d=m ¡¡NO!! ¡¡No se compilará!! Cuando usas ArrayList<Object>, el método get() d
devuelve tipo Objeto. ¡El compilador solo sabe que el objeto hereda de
Object (en algún lugar de su árbol de herencia) pero no sabe que es un perro!
vacío público ir () {
Esto funciona (aunque puede que no sea
Perro aPerro = nuevo Perro();
muy útil, como verás en un momento) porque
BIEN Objeto mismoPerro = getObject(unPerro);
☺ puedes asignar CUALQUIER COSA a una referencia
}
de tipo Objeto, ya que cada clase pasa la prueba
ISA para Objeto. Cada objeto en Java es una
Objeto público getObject (Objeto o) { instancia de tipo Objeto, porque cada clase en Java
volver o; tiene un Objeto en la parte superior de su árbol de herencia.
}
212 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
oh
Doh bj mi
gramo
oh
Connecticut
Objeto
[Link]
[Link]();
¡No se compilará!
¡¡No puedo hacer esto!! La clase Object no tiene idea de
lo que significa ladrar(). Aunque USTED sabe que en
realidad es un perro en ese índice, el compilador no lo sabe.
código hash()
El compilador decide si se puede llamar a un
método basándose en el tipo, no en el tipo
real. referencia
oh
objeto
Doh bj mi
gramo
oh
Connecticut
Objeto
Objeto
El método que estás llamando a
es igual() una referencia DEBE estar en la clase
obtenerClase()
de ese tipo de referencia. No importa cuál
código hash()
sea el objeto real.
Encadenar()
[Link]();
Me trata como a un
Objeto
()
sh ( ) has C
h oh
gramo
rit
norte
S d
mi
t oh (
mi )
snowboard
q Objeto
El snowboard hereda métodos tu
ayo ()
s() ass
gramo
mi
A
)
es igual()
de la superclase Objeto, y t yC yo
oh
yo(
agrega cuatro ir tr
gramo
obtenerClase()
más.
()
norte
Coh
código hash()
yo s
oh mi
Encadenar()
snowboard
doblar()
S miC
t
desgarrar() oh
norte
wboh ard obj
obtenerAire()
perder el control()
214 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
()
dmi ttur
Snowboard s = nueva Snowboard(); r norte
()
h
s ( ) has C
h oh
gramo
rit
norte
Objeto o = s; S d
mi
t oh (
mi )
q Objeto
tu
ayo ()
s() ss
gramo
mi
A y Ca
)
t yo(
s
yo
oh
ir tr
gramo
()
norte
Coh
yo s
oh mi
snowboard
El mando a distancia Snowboard
S miC
t
(referencia) tiene más botones que un
menos métodos aquí... oh
norte
wboh ard obj
mando a distancia Object. El oh
control remoto de Snowboard puede
ver la Snowboardness completa del La referencia de Objeto solo puede ver las
partes del Objeto del objeto Snowboard.
objeto Snowboard. Puede acceder a
todos los métodos de Snowboard, Sólo puede acceder a los métodos de la
clase Objeto. Tiene menos botones que el
incluidos los métodos de objeto
mando a distancia de Snowboard.
heredados y los métodos de la clase Snowboard.
objetos de fundición
oh
Doh bj mi
gramo
oh
Connecticut
Objeto
Espero que no duela.
¿Y qué tiene de malo seguir
siendo un Objeto? Vale, no puedo
buscarlo, claro, pero puedo dártelo.
un código hash realmente agradable.
Objeto o = [Link](index);
devolver el objeto a un perro
Perro d = (Perro) o; que sabemos que está allí.
[Link]();
oh
Doh bj migramo
oh
Connecticut
Objeto
en vez de
si (o instancia de Perro) {
Perro d = (Perro) o;
}
216 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
Cuenta
débito (doble cantidad)
doble obtenerSaldo()
218 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
1 Opción uno
Tomamos el camino fácil y colocamos
métodos pet en la clase Animal.
Coloque todo el
Ventajas:
código del método pet
Todos los animales heredarán instantáneamente los aquí para heredar.
comportamientos de las mascotas. No tendremos que
tocar las subclases de Animal existentes en absoluto, y
cualquier subclase de Animal creada en el futuro Animal
también podrá aprovechar la herencia de esos métodos.
De esa manera, la clase Animal se puede usar como
tipo polimórfico en cualquier programa que quiera tratar
a los animales como mascotas.
Canino
Hipopótamo
Contras:
2 Opción dos
Comenzamos con la Opción Uno, poniendo los métodos
pet en la clase Animal, pero hacemos que los métodos
sean abstractos, forzando a las subclases Animal a anularlos.
Ventajas:
Eso nos daría todos los beneficios de la Opción Uno, pero sin el inconveniente
de tener animales que no son mascotas corriendo con métodos de mascotas Coloque todos los métodos favoritos aquí,
Todas las clases DEBEN anular los métodos, pero pueden hacer que los
métodos "no hagan nada".
Animal
Contras:
220 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
3 Opción tres
Coloque los métodos pet SÓLO en
las clases a las que pertenecen.
Ventajas:
Perro
Y segundo, no puedes usar polimorfismo
para los métodos pet.
¡Cada clase que necesite utilizar
Gato
comportamientos de mascotas Lobo
debería conocer todas y cada una
de las clases! En otras León
palabras, no puedes usar
Tigre
Animal como tipo
polimórfico ahora, porque el
compilador no te permitirá llamar
a un método Pet en una referencia
Animal (incluso si es realmente un
objeto Perro) porque la clase Animal no
tiene el método. .
herencia múltiple ?
Una forma de garantizar que todas las clases pet tengan los mismos
métodos definidos (mismo nombre, mismos argumentos, mismos tipos de
retorno, no faltan métodos, etc.), sin tener que cruzar los dedos y esperar que
todos los programadores lo hagan bien.
Una forma de aprovechar el polimorfismo para que todas las mascotas puedan
llamar a sus métodos de mascotas, sin tener que usar argumentos, tipos de
retorno y matrices para todas y cada una de las clases de mascotas.
Canino
Hipopótamo
Felino
Perro
perro se extiende
Gato León Lobo mascota y ambos
Animal
222 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
Unidad combinada
interfaces
Interfaz al rescate!
interfaz
Mascota
Una interfaz Java es como un
Clase 100% pura abstracta.
resumen vacío beFriendly();
Todos los métodos en una interfaz son
juego vacío abstracto();
abstractos, por lo que cualquier clase
que ESA Pet DEBE implementar (es decir,
anular) los métodos de Pet.
224 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
Creación e implementación de la
interfaz Pet Los métodos de interfaz son implícitamente
públicos y abstractos, por lo que escribir "público"
y "abstracto" es opcional (de hecho, no se considera
"buen estilo" escribir las palabras, pero hizo aquí
En su lugar dices "interfaz" solo lo reforzamos, y porque nunca lo hemos
hecho). sido esclavos de la moda...)
de 'clase' aquí
Dices 'implementos'
Perro ESUn Animal seguido del nombre
y Perro ESUna Mascota
de la interfaz.
clase pública Perro extiende implementos caninos Mascota {
no existen
Preguntas tontas
polimorfismo de interfaz
Robot
Mascota Animal
Agente
RoboPerro
Canino
Hipopótamo
La clase RoboDog no
venir
proviene del animal.
árbol de herencia, ¡pero aún así
Felino
llega a ser una mascota!
Perro
Tigre
226 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
hazlo pegado
Cree una subclase (en otras palabras, solo extender una clase)
cuando necesite crear una versión de más específicoC
una clase y necesite anular o agregar nuevos comportamientos).
Utilice una interfaz cuando desee definir una que otras role
clases puedan reproducir, independientemente de dónde se
encuentren esas clases en el árbol de herencia.
usando súper
}
void buzzwordCompliance() {...}
}
Informe
[Link]();
Informe de palabra de moda
Una referencia al objeto de subclase
(BuzzwordReport) siempre llamará a la
versión de subclase de un método anulado.
La palabra clave super es en realidad una referencia
Eso es polimorfismo.
Pero el código de la subclase puede a la parte de superclase de un objeto.
Cuando el código de subclase usa super,
llamar a [Link]() para invocar
como en [Link](), la versión de superclase de
la versión de la superclase.
el método se ejecutará.
228 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
PUNTOS DE VIÑETA
Cuando no desea que se cree una instancia de una clase (en otras palabras, no desea que
nadie cree un nuevo objeto de ese tipo de clase), marque la clase con la palabra clave abstracta .
Una clase abstracta puede tener métodos tanto abstractos como no abstractos.
Si una clase tiene incluso un método abstracto, la clase debe marcarse como abstracta.
Un método abstracto no tiene cuerpo y la declaración termina con un punto y coma (sin llaves).
Todos los métodos abstractos deben implementarse en la primera subclase concreta del árbol de
herencia.
Cada clase en Java es una subclase directa o indirecta de la clase Objeto ([Link].
Objeto).
Los métodos se pueden declarar con argumentos de objeto y/o tipos de retorno.
Puede llamar a métodos en un objeto solo si los métodos están en la clase (o interfaz) utilizada como
tipo de variable de referencia , independientemente del tipo de objeto real . Por lo tanto, una
variable de referencia de tipo Objeto sólo se puede utilizar para llamar a métodos definidos en la clase
Objeto, independientemente del tipo de objeto al que se refiere la referencia.
Una variable de referencia de tipo Objeto no se puede asignar a ningún otro tipo de referencia sin
una conversión. Se puede utilizar una conversión para asignar una variable de referencia de un tipo
a una variable de referencia de un subtipo, pero en tiempo de ejecución la conversión fallará si el
objeto en el montón NO es de un tipo compatible con la conversión.
Todos los objetos salen de ArrayList<Object> como tipo Objeto (es decir, solo se puede hacer referencia
a ellos mediante una variable de referencia de Objeto, a menos que use una conversión).
La herencia múltiple no está permitida en Java debido a los problemas asociados con el “Diamante Mortal
de la Muerte”. Eso significa que sólo puede ampliar una clase (es decir, sólo puede tener una superclase
inmediata).
Una interfaz es como una clase abstracta 100% pura. Define sólo métodos abstractos.
Cree una interfaz utilizando la palabra clave interfaz en lugar de la palabra clase.
Una clase que implementa una interfaz debe implementar todos los métodos de la interfaz, ya
que todos los métodos de la interfaz son implícitamente públicos y abstractos.
Para invocar la versión de superclase de un método desde una subclase que ha anulado el método,
(interfaz)
1) foo
1) interfaz pública Foo { }
2)
2) interfaz pública Vinn { }
Bar
La clase abstracta pública Vout implementa Vinn {}
230 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
¿Qué es la Declaración?
Dado:
Hacer clic
clase pública Haga clic en
1
{ } 1) clase pública Clack se extiende Haga clic en { }
Arriba
2
2)
Charla
Consejo
3)
Tarifa
3
4)
foo
4
fi
Bar 5)
Zeta
5
baz
Beta
Alfa LLAVE
Charla
Delta
Charla
Charla
Piscina
Rompecabezas
____________ Nariz {
público ___________ ________ extiende Payasos {
________________________
} público estático vacío principal (String [] argumentos) {
____________________________
clase abstracta Picasso implementa ________
yo[0] = nuevo __________
__________________________
yo[1] = nuevo __________
devolver 7;
} yo[2] = nuevo __________
[Link](__________________
clase {} + ““
_________ ________ __________
+ _______.getClass() );
}
clase {
_________ ________ __________
}
___________________________ } Ayuda de la ventana de edición de archivos BeAfraid
________De76
232 capítulo 8
Machine Translated by Google
interfaces y polimorfismo
¿Cuál es la imagen?
2) (interfaz)
Vinn
3) (interfaz)
Wuffie
votar
¿Qué es la Declaración?
Muffie
4) zoop
peludito
boop
interfaz pública Foo { } 4) la
Pegajoso
pública Baz extiende la barra { }
5) Delta
(interfaz) pública Alpha implementa Zeta { } interfaz pública
Épsilon
Beta { } clase pública Delta
Alfa
solución de rompecabezas
{ }
devolver 5; }
}
}
% java de 76
5 actos de clase
Payasos de 7 clases
7 clase de 76
234 capítulo 8
Machine Translated by Google
Vida y muerte de un
...luego dijo: “¡No
la pila y el montón
ir()
Connecticut
S
DtuCk bj miC t norte mi
hacer cosas() oh oh
wbohar d oh b
j
principal()
t
C
Btut t bj mi
ohnorte oh
236 capítulo 9
Machine Translated by Google
constructores y gc
marcos de pila
bar() s
variables
foo() xib locales
(incluido el parámetro x)
1 código de otro 2 doStuff() llama a go(), go() 3 go() llama a Crazy(), 4 loco() completo,
la clase llama a doStuff() está en empujado en Crazy() ahora está en la y su marco de pila está
y doStuff() va a un la parte superior de la pila. parte superior de la apareció fuera de la pila.
marco de pila en la Las variables 'x' y 'z' pila, con la variable La ejecución vuelve al
parte superior de la están en el marco de pila 'c' en el marco. método go() y continúa
pila. La variable go() . en la línea que sigue
booleana denominada a la llamada a crazy().
'b' va al marco de pila
doStuff() .
loco() c
ir() xz ir() xz ir() xz
no existen
Preguntas tontas
PUNTOS DE VIÑETA
238 capítulo 9
Machine Translated by Google
constructores y gc
largo
hormiga
Antena
hormiga
Antena
creación de objetos
2 Crear un objeto
Pato miPato = nuevo Pato();
Aquí
ocurre un milagro. Objeto pato
3 Vincular el objeto y la
Asigne el nuevo
referencia.
objeto al
referencia.
Pato miPato = nuevo Pato();
Objeto pato
mi pato
Referencia de pato
240 capítulo 9
Machine Translated by Google
constructores y gc
No.
nuevo
Un constructor tiene el código
pato público() {
pato público() {
¿Dónde está el tipo de devolución? // el código del constructor va aquí
Si este fuera un método, }
necesitaría un tipo de
retorno entre "público" y
"Pato()".
construir un pato
Si grazna como un
constructor...
público Pato()
{ [Link](“Quack”);
} El constructor te da la oportunidad
} de entrar en medio de lo nuevo.
Código constructor.
Afila tu lápiz
Incrementa un contador para rastrear cuántos objetos de este tipo de
clase se han creado.
Asigne un estado específico del tiempo de ejecución (datos sobre lo que está sucediendo AHORA).
242 capítulo 9
Machine Translated by Google
constructores y gc
pato público() {
tamaño = 34;
}
pato público() {
[Link](“Cuac”); constructor
}
[Link](42);
Hay algo malo aquí. ¡El Pato está vivo en este
} puntoconfiando
del código,
estás enpero sin un tamaño!* Y luego
SABER
} proceso: uno
el usuario Duck
que la creación del Pato es una
debe llamar al constructor de dos partes
para llamar al configurador.
y uno
*Las variables de instancia tienen un valor predeterminado. 0
o 0,0 para primitivas numéricas, falso para booleanos y nulo
para referencias.
usted está aquí 243
Machine Translated by Google
Curandero
el tamaño es 42
*No quiero dar a entender que no todos los estados de Duck carezcan de importancia.
244 capítulo 9
Machine Translated by Google
constructores y gc
Imagine que desea que los usuarios de Duck tengan DOS opciones pato público2() {
para crear un Duck: una en la que proporcionan el tamaño del // suministra el tamaño predeterminado
Duck (como argumento del constructor) y otra en la que no tamaño = 27;
}
especifican un tamaño y, por lo tanto, obtienen el tamaño del Duck predeterminado.
246 capítulo 9
Machine Translated by Google
constructores y gc
Cuatro constructores
medio
hacer un
diferentes deformas
nuevo hongo.
a
cuatro diferentes.
PUNTOS DE VIÑETA
Las variables de instancia viven dentro del objeto al que pertenecen, en el Si desea un constructor sin argumentos y ya ha instalado un constructor
montón. con argumentos, tendrá que crear el constructor sin argumentos usted
mismo.
Si la variable de instancia es una referencia a un objeto, tanto la referencia
como el objeto al que hace referencia están en el montón. Siempre proporcione un constructor sin argumentos si puede, para que a los
constructores sobrecargados
clase pato {
Afila tu lápiz libras enteras = 6;
Haga coincidir la nueva llamada Duck() con el constructor flotabilidad del flotador = 2.1F; Nombre
que se ejecuta cuando se crea una instancia de ese Duck. Lo hicimos de cadena = "Genérico"; plumas
largas[] = {1,2,3,4,5,6,7}; booleano canFly = verdadero;
el más fácil para empezar.
int velocidadmáx = 25;
no se puede resolver el
símbolo :constructor Color()
ubicación: clase
[Link] Color c =
new Color();
^
Color c = nuevo Color(3,45,200); 1 error
248 capítulo 9
Machine Translated by Google
constructores y gc
público
4 Puedes tener más de un constructor en tu clase, siempre que las listas de privado
argumentos sean diferentes. Tener más de un constructor en una
clase significa que tienes constructores sobrecargados.
pato público() { }
Se ha demostrado que hacer todas las Brain Barbells produce un aumento del 42% en el
tamaño de las neuronas. Y ya sabes lo que dicen: "Grandes neuronas..."
nuevo
nuevo
Un solo
Objeto objeto en
El objeto tiene variables de instancia
Foo a; el montón.
encapsuladas por métodos de acceso. Y
intb; X
Esas variables de instancia se z
intc;
desgarrar()
250 capítulo 9
Machine Translated by Google
constructores y gc
nuevo XY
Objeto
SV
k
C
a b
Animal
Objeto
Animal
Hipopótamo
Hipopótamo
construcción de objetos
Objeto()
Animal() Animal() Animal()
es el constructor Anima
El primero, A. Primero
252 capítulo 9
Machine Translated by Google
constructores y gc
súper();
Pato público (int nuevoTamaño) {
}
súper();
solo dices super()
tamaño = nuevoTamaño;
}
2
súper();
Boop público() { }
Esto está bien porque el
súper();
compilador llamará a
} Estos están bien porque Boop público (int i) { super() como primera
el programador ex declaración.
codificó tamaño = yo;
tácitamente la llamada.
Boop público (int i) { a super(), como el primero }
declaración.
súper();
254 capítulo 9
Machine Translated by Google
constructores y gc
Animal
Animal(Cadena n)
Cadena getName()
Hipopótamo
de hipopótamos]
cadena pública getName() {
Un método getter que
nombre de retorno; hipopótamo hereda
La parte Animal de
Animal público (Cadena el nombre) { mí necesita saber mi nombre,
nombre = elNombre; El constructor que así que tomo un nombre propio.
toma el nombre y le asigna Constructor Hippo, luego pasa
} el nombre de instancia.
variable el nombre a super()
}
256 capítulo 9
Machine Translated by Google
constructores y gc
Afila tu lápiz
hazlo pegado
%javac [Link]
público SonOfBoo()
{ super(“abucheo”); no se puede resolver el símbolo
}
símbolo: constructor Boo
public SonOfBoo(int i) { super(“Fred”); ([Link],[Link] [Link])
%javac [Link]
}
no se puede resolver el símbolo
público SonOfBoo(int i, String s) { }
símbolo: constructor Boo
(int,[Link])
public SonOfBoo(Cadena a, Cadena b, Cadena c) { super(a,b);
}
}
Ahora sabemos cómo nace un objeto, 1 Una variable local vive sólo dentro del
pero ¿cuánto tiempo dura? vivir ? método que declaró la variable.
La variable
leer()
's' está vivo, pero sólo en el alcance
método. Cuando sleep() se completa en
dentro de
todavía veo y read() está
la parte superior de la pila y se ejecuta
's'. Cuando se lee()
read() se nuevamente,
puede completar y se retira
la pila, 's' está muerta. Empujando
margaritas digitales.
258 capítulo 9
Machine Translated by Google
constructores y gc
loco() c
ir() xz ir() xz ir() xz
1 doStuff() va a la pila. La variable 2 go() se deja caer encima 3 Crazy() se inserta en la pila, 4 crazy() se completa y se
'b' está viva y dentro del de la pila. 'x' y 'z' están con 'c' ahora viva y dentro del elimina de la pila, por lo que 'c'
alcance. vivos y dentro del alcance, y 'b' alcance. Las otras tres variables está fuera de alcance y
está vivo pero no dentro del están vivas pero fuera de muerto. Cuando go() continúa
alcance. donde lo dejó, 'x' y 'z' están
alcance.
La variable 'b' todavía está
260 capítulo 9
Machine Translated by Google
constructores y gc
lo que 'd' ahora está muerta y DtuCk bj miC t pato está abandonado.
desaparecida. La ejecución vuelve tonto() oh
Cebo recolector de basura.
a foof(), pero foof()
No puedo usar 'd'.
Asignar la referencia a
otro objeto.
DtuCk bj miC t
oh
d
RmiRmi t Montón
F bj miC
oh
d
RmiRmi t Montón
F bj miC
oh DtuCk bj miC t
oh
262 capítulo 9
Machine Translated by Google
constructores y gc
Establecer explícitamente
la referencia a nula
1
clase pública ReRef {
vacío público ir () {
d
d = nulo;
RmiRmi t Montón
} F bj miC
oh
}
El nuevo Duck va al montón, al que se hace
DtuCk bj miC t
oh
d
RmiRmi t Montón
F bj miC
oh
264 capítulo 9
Machine Translated by Google
constructores y gc
clase pública GC {
devolver nuevoGC;
2 gc2 = nulo;
}
3 nuevoGC = gc3;
GCgc4 = gc3;
A
7 gc3 = gc2;
// llama a más métodos
}
8 gc1 = gc4;
GC localGC = copiarGC;
Ventana de edición de archivos Ayuda Suspender
266 capítulo 9
Machine Translated by Google
constructores y gc
Popular
clase abejas {
Objetos
Miel [] abejaHA;
}
clase mapache {
Equipo k;
Miel rh;
}
equipo de clase {
Miel kh;
}
clase oso {
Miel cariño;
}
}
¡Aquí hay un
Kit k = nuevo Kit(); [Link] =
tarro de miel; Mapache r
nuevo objeto Mapache!
= nuevo mapache();
“Hemos ejecutado la simulación cuatro veces y la temperatura del módulo principal cambia constantemente
de la nominal a la fría”, dijo Sarah, exasperada. “Instalamos los nuevos robots temporales la semana pasada. Las lecturas
de los robots de radiador, diseñados para enfriar las viviendas, parecen estar dentro de las especificaciones, por lo que
hemos centrado nuestro análisis en los robots de retención de calor, los robots que ayudan a calentar las habitaciones”.
Tom suspiró, al principio había parecido que la nanotecnología realmente los adelantaría a lo previsto. Ahora, cuando sólo
faltaban cinco semanas para el lanzamiento, algunos de los sistemas clave de soporte vital del orbitador todavía no
pasaban el desafío de la simulación.
Cinco minutos
"¿Qué proporciones estás simulando?", Preguntó Tom.
Misterio “Bueno, si veo hacia dónde vas, ya hemos pensado en eso”, respondió Sarah. "Mal
El control de misión no aprobará los sistemas críticos si los ejecutamos sin especificaciones. Estamos
obligados a ejecutar las SimUnits del robot del radiador v3 en una proporción de 2:1 con las SimUnits
del radiador v2”, continuó Sarah. "En general, se supone que la proporción entre robots de retención y
robots de radiador es de 4:3".
"¿Cómo va el consumo de energía, Sarah?", Preguntó Tom. Sarah hizo una pausa: “Bueno, esa
es otra cosa, el consumo de energía está siendo mayor de lo previsto. También tenemos un equipo que está
rastreando eso, pero debido a que los nanos son inalámbricos, ha sido difícil aislar el consumo de energía de los
radiadores de los robots de retención”. "Las relaciones generales de consumo de energía", continuó Sarah, "están
diseñadas para funcionar en una proporción de 3:2 y los radiadores extraen más energía de la red inalámbrica".
“Está bien, Sarah”, dijo Tom. “Echemos un vistazo al código de inicio de la simulación.
¡Tenemos que encontrar este problema y hacerlo rápido!
importar [Link].*;
clase V2Radiador {
V2Radiator (lista ArrayList) {
para(int x=0; x<5; x++) {
[Link](new SimUnit(“V2Radiator”));
}
}
}
clase RetenciónBot {
RetentionBot (listaArrayList) {
[Link](new SimUnit(“Retención”));
}
}
268 capítulo 9
Machine Translated by Google
constructores y gc
Tom le dio al código una mirada rápida y una pequeña sonrisa apareció en sus labios. Creo que he
encontrado el problema, Sarah, y apuesto a que sé en qué porcentaje tus lecturas de uso de energía también están
equivocadas.
¿Qué sospechaba Tom? ¿Cómo podría adivinar los errores en las lecturas de energía y qué pocos
¿Podrías agregar líneas de código para ayudar a depurar este programa?
1 copiarGC = nulo; No: esta línea intenta acceder a una variable que está
fuera de alcance.
2 gc2 = nulo; Bien, gc2 era la única variable de referencia que
se refería a ese objeto.
3 nuevoGC = gc3; No, otra variable fuera de alcance.
Popular
Objetos
270 capítulo 9
Machine Translated by Google
constructores y gc
Dado que todas las clases de Bot crean SimUnits, escribir un constructor
para la clase SimUnit, que imprimiera una línea cada vez que se creaba una
SimUnit, habría resaltado rápidamente el problema.
10 números y estática
Métodos matemáticos
int x = [Link](42.2);
int y = Matemá[Link](56,12);
intz = [Link](343);
%javac PruebaMatemáticas
1 error
274 capítulo 10
Machine Translated by Google
números y estática
estático
[Link](título);
mín() Sin variables de instancia.
}
máx() El comportamiento del
El valor actual de la variable de
abdominales()
método no cambia con el
instancia 'título' es la canción que se ...
Canción
estado de la variable de instancia.
título
reproduce cuando llamas a reproducir().
A mi manera
pistolas sexuales
jugar() t
C
política mi
b j
oh
Coldplay
Soh gramo
norte
t
Matemá[Link](42,36);
C
mi
b j
oh
dos instancias Soh gramo
norte
Canción
Canción
[Link]();
[Link](); ¡¡SIN OBJETOS!!
Llamar a
la
en
referencia de play() esto Llamar a play() en esta ¡Absolutamente NO HAY OBJETOS
en cualquier lugar
causará referencia hará que se en esta imagen!
“Politik” para jugar.
reproduzca “My Way”.
métodos estáticos
Matemáticas Matemá[Link](88,86);
mín()
máx()
abdominales()
...
t2 [Link]();
abstracto
privado
276 capítulo 10
Machine Translated by Google
números y estática
Si intentas utilizar
una variable de instancia
desde dentro de un
método estático, el
compilador cual
piensa: "¡No sé de qué
Si intentas compilar este código: variable de instancia estás hablando!".
pato de clase pública { ¿Qué pato? Si tiene diez objetos
¿De quién es el tamaño?
% javac [Link]
métodos estáticos
Esto no se compilará:
Llamar a getSize() simplemente
pato de clase pública { pospone lo inevitable: getSize()
usa la variable de instancia de tamaño.
tamaño int privado;
% javac [Link]
hazlo pegado
[Link](); [Link](); [Link]();
278 capítulo 10
Machine Translated by Google
números y estática
Variable estática:
El valor es el mismo para La variable estática duckCount se
inicializa SÓLO cuando la clase
TODAS las instancias de la clase. se carga por primera vez, NO cada
pato público() {
clase pato { patoCount++;
Ahora seguirá
int patoCount = 0;
incrementando cada vez
}
pato público() { las ejecuciones del constructor
patoCount++; Duck, porque duckCount es
} esto siempre establecería estático y no se restablecerá a 0.
} aduckCount en 1 cada vez conjunto vacío público (int s) {
se hizo pato
tamaño = s;
}
público int getSize() {
tamaño de retorno;
}
}
tamaño: 20 tamaño
DtuCk bj miCt
oh
obtenerTamaño()
establecerTamaño()
DtuCk bj miCt
oh
tamaño: 8
tamaño: 12
patoContar: 4 Cada objeto
variable de Duck tiene su propio
patoContar: 4
hay una tamaño, pero solo
DtuCk bj miCt copia de duckCount
oh
DtuCk bj miCt
oh
variable: la de la clase.
variables estáticas
variable
niño instancia dos
estática: helado
niño ejemplo uno
Barra cerebral
cerebro
con barra
280 capítulo 10
Machine Translated by Google
números y estática
[Link]([Link]);
} Acceda a una variable estática como a un método
} estático: con el nombre de la clase.
% java PlayerTestDrive
0 antes de que se hagan instancias
1
después de crear un objeto
282 capítulo 10
Machine Translated by Google
números y estática
Tonto() {
buf = 42; ahora no puedes cambiar whuffie
}
anular hacerMás() {
final int z = 7;
// no puedes cambiar z Es todo tan... así final .
} que quiero decir, conocido
} si lo hiciera no sería capaz
de cambiar las cosas...
método final
clase puf {
calcWhuffie anulado final () {
// cosas importantes
// eso nunca debe ser anulado
}
}
clase final
clase final MiClaseMásPerfecta {
// no se puede ampliar
}
estática y final
no existen
Preguntas tontas
PUNTOS DE VIÑETA
Si tiene una clase con solo métodos estáticos y no desea que se cree
una instancia de la clase, puede marcar el constructor como privado.
Para crear una constante en Java, marque una variable como estática
y final.
CÓDIGO_PERRO = 420;
}
284 capítulo 10
Machine Translated by Google
números y estática
Afila tu lápiz
¿Qué es legal?
}
}
Métodos matemáticos
Métodos matemáticos
Matemá[Link]()
doble r1 = [Link]();
int r2 = (int) ([Link]() * 5);
Matemá[Link]()
Devuelve un doble que es el valor absoluto de
Matemá[Link]()
Matemá[Link]()
Devuelve un valor que es el máximo de los dos
argumentos. El método está sobrecargado para
aceptar enteros, largos, flotantes o dobles.
intx = [Link](24,240); // devuelve 240
doble y = [Link](90876.5, 90876.49); // devuelve 90876,5
286 capítulo 10
Machine Translated by Google
números y estática
entero x = 32;
Lista ArrayList = nueva ArrayList();
[Link](x);
Booleano
Personaje
métodos estáticos
288 capítulo 10
Machine Translated by Google
números y estática
Autoboxing: desdibujando
la línea entre primitivo y objeto
métodos estáticos
gramo
En t
primitiva del tipo coincidente.
290 capítulo 10
Machine Translated by Google
números y estática
gramo
En t
Pero no te preocupes, esto es sólo un truco del compilador.
El lenguaje no fue modificado para que los
operadores trabajaran en objetos; el compilador yo ++;
simplemente convierte el objeto a su tipo primitivo
antes de la operación. Aunque seguro que parece
raro.
Asignaciones 3
3
Puede asignar un contenedor o una primitiva a una
t
variable declarada como contenedor o primitiva I t j
C
mi
mi mir ohb
norte
Entero yo;
¿Se compilará este código? ¿Funcionará? Si se intj;
ejecuta, ¿qué hará?
público estático vacío principal (String[] args) {
Tómate tu tiempo y piensa en esto; trae a TestBox t = nuevo TestBox();
colación una implicación del autoboxing de [Link]();
la que no hablamos. }
métodos de envoltura
Cadena s = “2”;
int x = [Link](s);
doble d = [Link](“420.24”);
Cada método o
% Envoltorios de Java
constructor que analiza una
Excepción en el hilo "principal"
cadena puede generar una
[Link]: dos excepción NumberFormatException.
en [Link]([Link]) Es una excepción de tiempo de
292 capítulo 10
Machine Translated by Google
números y estática
doble d = 42,5;
Cadena dobleString = [Link](d);
formato de número
Formato de números
294 capítulo 10
Machine Translated by Google
números y estática
Formato deconstruido...
1 instrucciones de formato
Se utilizan especificadores de formato especiales que
describen cómo se debe formatear el argumento.
Nota: si ya conoce printf() de c/C+
+, probablemente pueda hojear las
2 El argumento que se va a formatear. siguientes páginas. De lo contrario,
¡lee atentamente!
Aunque puede haber más de un argumento, comenzaremos
con solo uno. El tipo de argumento no puede ser
cualquier cosa... tiene que ser algo que pueda formatearse
usando los especificadores de formato en las instrucciones de formato.
Por ejemplo, si sus instrucciones de formato especifican un
número de punto flotante, no puede pasar un perro o incluso
una cadena que parezca un número de punto flotante.
el método formato()
después
¿Qué del punto
significa ".2f"?decimal. Puedes adivinar
296 capítulo 10
Machine Translated by Google
números y estática
especificador de formato
El especificador de formato
Un especificador de formato puede tener hasta cinco partes diferentes (sin incluir el
"%"). Todo lo que está entre corchetes [ ] a continuación es opcional, por lo que solo se requieren
el porcentaje (%) y el tipo. Pero el orden también es obligatorio, por lo que cualquier pieza
que SÍ utilices debe ir en este orden.
%[número de argumento][banderas][ancho][.precisión]tipo
Llegaremos a esto más Esto define el Ya sabes que el tipo es obligatorio... define
adelante... te permite Estos son para número MÍNIMO de (ver la página siguiente) la precisión. En
decir QUÉ argumento más caracteres que se
si hay más de uno. opciones de formato otras palabras, "d" para un decimal
(No te preocupes utilizarán. Eso es establece el número entero o "f" para
especiales, como
por eso todavía). insertar comas, *mínimo* no lugares decimales.
un punto flotante. No
TOTAL. Si el número es olvides incluir el "." ahí.
poner números
negativos entre más largo que el número.
paréntesis o ancho, aún se usará en
suizquierda.
justificar los números a la totalidad, pero si es
menor que el ancho, se
completará con ceros.
%[número de argumento][banderas][ancho][.precisión]tipo
formato(“%,6.1f”, 42.000);
298 capítulo 10
Machine Translated by Google
números y estática
%d decimal
¡Un 42,25 no funcionaría! Sería lo
formato(“%d”, 42);
mismo que intentar asignar directamente
un doble a un
42 variable interna.
%F punto flotante
Aquí combinamos la “f” con un
formato(“%.3f”, 42.000000); indicador de precisión.
“.3” así que terminamos con
42.000 tres ceros.
%X hexadecimal
formato(“%x”, 42);
2a
%C personaje
formato(“%c”, 42);
El número 42 representa el
* carácter “*”.
argumentos de formato
300 capitulo 10
Machine Translated by Google
números y estática
15:01:47
La coma no forma parte del formato... es sólo el obtener solo el mes y nuevamente
carácter que queremos imprimir después del primer el día del mes. Para el
argumento formateado insertado.
Domingo 28 de noviembre
Igual que el anterior, pero sin duplicar los argumentos %tA %tB %td
manipulando fechas
302 capítulo 10
Machine Translated by Google
números y estática
conseguir un calendario
Esto NO FUNCIONA:
¡El compilador no permitirá esto!
Calendario cal = nuevo Calendario();
Espera un minuto.
Si no puede crear una
instancia de la clase
Calendario, ¿qué está asignando
exactamente a esa referencia
de Calendario?
304 capítulo 10
Machine Translated by Google
números y estática
[Link](2004,0,7,15,40);
Convierta esto a una gran
cantidad de milisegundos.
día largo1 = [Link]();
día1 += 1000 * 60 * 60; Agregue el equivalente a una hora en milisegundos y luego actualice la hora.
(Observe el “+=”, es como día1 = día1 +...).
[Link](día1);
[Link]([Link], 35);
“Avanzar” 35 días hasta esta fecha.
[Link] ("rollo 35 días" + [Link]()); ¡Esto “adelanta” la fecha 35 días,
pero NO cambia el mes!
[Link]([Link], 1);
[Link](“establecido en 1” + [Link]());
No estamos incrementando aquí, simplemente
haciendo un "conjunto" de la fecha.
nueva hora 16
agregar 35 días miércoles 11 de febrero 16:40:41 MST 2004
Este resultado confirma cómo
funcionan millis, add, roll y set.
rodar 35 días martes 17 de febrero 16:40:41 MST 2004
establecido en 1 domingo 01 de febrero 16:40:41 MST 2004
API de calendario
306 capítulo 10
Machine Translated by Google
números y estática
importar [Link];
clase no estática {
[Link](“sqrt” + Matemá[Link](2.0));
[Link](“bronceado“ + Matemá[Link](60));
}
La sintaxis que se utilizará al
} declarar importaciones estáticas.
308 capítulo 10
Machine Translated by Google
números y estática
ser el compilador
estático {
EstáticoSuper{
[Link](
“superconstructor”);
súper constructor
estático {
constructor
rand = (int) ([Link]() * 6);
Pruebas estáticas() {
310 capítulo 10
Machine Translated by Google
números y estática
estático
imanes de código
[Link](2004,1,7,15,40);
importar [Link].*;
(“luna llena en %t”, c));
importar [Link].*;
[Link](2004,0,7,15,40); [Link]
Ventana de edición de archivos Ayuda Howl
312 capítulo 10
Machine Translated by Google
números y estática
Verdadero o falso
FALSO
FALSO
Verdadero
FALSO
Verdadero
FALSO
EstáticoSuper( ) {
Verdadero
[Link](
“superconstructor”);
} Verdadero
FALSO
en principal
importar [Link].*;
Calendario c = [Link]();
[Link](2004,0,7,15,40);
[Link](día1);
314 capítulo 10
Machine Translated by Google
11 manejo de excepciones
Comportamiento riesgoso
Claro que es
arriesgado, pero puedo
manejarlo si algo sale mal.
tu mensaje, que se
envía a los demás
ritmo de baile
jugadores, junto con tu
patrón de ritmo actual,
cuando presionas "Enviar"
Andy: ritmo #2
va
en uno para cargar el patrón que
con él y luego haga clic
'Comienza' a jugarlo.
316 capítulo 11
Machine Translated by Google
manejo de excepciones
archivo midi
El archivo MIDI tiene
información sobre cómo se
} // cerrar juego
[Link]();
} // cerrar principal
% javac [Link]
1 errores
318 capítulo 11
Machine Translated by Google
manejo de excepciones
th en
1 Digamos que quieres
llamar a un método en un
clase vaca {
barra de clase { muu vacío() {
ir vacío() { si (servidorAbajo){
}
}
explotar();
} int cosas() {
}
[Link]();
}
}
si (servidor caído) {
podría no funcionar en tiempo de explotar();
ejecución. }
clase que
no escribiste }
Mi método
Me pregunto moo()
si ese método explotará si el
3 Necesitas saber servidor no funciona.
podría explotar...
que el método al que
arriesgado. }
}
}
clase que
no escribiste
tú
Ahora que lo
sé, puedo tomar
precauciones.
wr i t mi saFmiyo
4 Luego escribes el código y
que puede manejar la falla si
hace barra de clase {
ir vacío() {
intentar{
mugir();
}captura(MX m){
}
}
por si acaso.
tu codigo
tú
lanza
getSequencer() puede
320 capítulo 11
Machine Translated by Google
manejo de excepciones
Estimado compilador,
trata de atraparlo
Querido geek,
intentar {
Ponga lo arriesgado en
Secuenciador secuenciador = MidiSystem. getSecuenciador();
un bloque de "intentar".
[Link](“Obtuve un secuenciador con éxito”);
bloque
hacer si ocurre 'catch' para saber qué
algo
público estático vacío principal (String [] argumentos) {
situación
PruebaMúsica1 mt = nueva PruebaMúsica1();
excepcional; en otras palabras, a
[Link](); MidiUnavailableException
es aventado
} // cerrar principal mediante la llamada a getSequencer().
} // cerrar clase
Voy a
INTENTAR esta cosa
arriesgada y
me ATRAPARÉ si me caigo.
arrojable
322 capítulo 11
Machine Translated by Google
manejo de excepciones
su
Si es el código el que detecta la excepción, ¿de quién
htr
pag
oh
baC
norte
2
k
clase vaca {
barra de clase { muu vacío() {
ir vacío() { si (servidorAbajo){
1
mugir(); explotar();
} }
}
int cosas() {
}
[Link]();
} llama al método arriesgado
}
} cree un
de nuevo objeto
excepción y tírelo.
[Link]();
} captura (BadException ex) {
[Link](“¡Aaargh!”); Si no puede recuperarse
de la excepción, AL MENOS
[Link]();
obtenga un seguimiento de la pila utilizando el método printStackTrace()
} que heredan todas las excepciones.
Excepción 2
no existen
Preguntas tontas
324 capítulo 11
Machine Translated by Google
manejo de excepciones
PUNTOS DE VIÑETA
Un método puede generar una excepción cuando algo falla en tiempo de ejecución.
Una excepción es siempre un objeto de tipo Excepción. (Lo cual, como recordará
de los capítulos sobre polimorfismo, significa que el objeto es de una clase que tiene
Exception en algún lugar de su árbol de herencia).
Si no está preparado para manejar la excepción, aún puede hacer feliz al compilador Para obtener mejores resultados,
lea este libro (o al menos
"evitando" oficialmente la excepción. Hablaremos de agacharnos un poco más
mire las imágenes) justo
adelante en este capítulo.
antes de irse a dormir.
Afila tu lápiz
abajo el
Primero se ejecuta el bloque try
Si el intento falla
(porque doRiskyThing() lanza
hace una excepción)
El resto del bloque try nunca
intentar { se ejecuta, lo cual es bueno
1 Foo f = [Link](); porque el resto del try
El bloque try se ejecuta, pero la depende del éxito de
int b = [Link](); la llamada a doRiskyThing().
llamada a doRiskyThing() genera
una excepción, por lo que el
resto del bloque try no se ejecuta.
} captura (Excepción ex) { Ventana de edición de archivos Ayuda RiskAll
326 capítulo 11
Machine Translated by Google
manejo de excepciones
intentar {
encender el horno();
[Link]();
} captura (BakingException ex) {
[Link]();
} finalmente {
apagar horno();
}
No el control de
Si el bloque try tiene éxito (excepción),
intentar {
flujo salta el bloque catch y pasa al bloque
encender el horno();
finalmente. Cuando se completa el bloque
[Link]();
finalmente, el resto del método
apagar horno();
continúa.
} captura (BakingException ex) {
[Link]();
Si el bloque try o catch tiene una declaración de
apagar horno();
devolución, ¡finalmente aún se ejecutará! El
} flujo salta al final y luego regresa al retorno.
Afila tu lápiz
328 capítulo 11
Machine Translated by Google
manejo de excepciones
vacío público ir () {
} atrapar(LenceríaException lex) {
si doLaundry() lanza una
// código de recuperación
LingerieException, aterriza en el
}
} bloque catch de LingerieException.
excepciones polimórficas
como superclase.
IOExcepción RopaExcepción
VestidoCamisaExcepción
Declarar una ClothingException te permite lanzar
cualquier
CamisetaExcepción
individualmente.
DressShirtException sin declararlas explícitamente
RopaExcepción lavanderí[Link]();
lavanderí[Link]();
subclase
} }
330 capítulo 11
Machine Translated by Google
manejo de excepciones
intentar {
lavanderí[Link]();
// código de recuperación...
¿Recuperación de QUÉ? Este bloque de captura
detectará CUALQUIER excepción, por lo que
}
no sabrá automáticamente qué salió mal.
intentar {
lavanderí[Link]();
TeeShirtExceptions y
} captura (TeeCamisaException tex) {
LingerieExceptions necesitan un código
// recuperación de Tee ShirtException de recuperación diferente, por lo que
debes usar diferentes bloques catch.
} atrapar(LenceríaException lex) {
// recuperación de LingerieException
CamisetaExcepción VestidoCamisaExcepción
332 capítulo 11
Machine Translated by Google
manejo de excepciones
El tamaño importa
cuando tienes varios bloques
captura (Excepción ex) de captura. El que tenga la cesta más
grande tiene que estar abajo.
De lo contrario, los que tienen
cestas más pequeñas son inútiles.
intentar {
lavanderí[Link]();
// recuperación de ClothingException
} atrapar(LenceríaException lex) {
// recuperación de LingerieException
// recuperación de ShirtException
rompecabezas polimórfico
Afila tu lápiz
intentar {
[Link]();
} captura(AlphaEx a) {
// recuperación de AlphaEx
} captura(BetaEx b) {
// recuperación de BetaEx
} captura(GammaEx c) {
// recuperación de GammaEx
} captura(DeltaEx d) {
// recuperación de DeltaEx
BazEx
FooEx
BarEx BiffEx
boinkex
334 capítulo 11
Machine Translated by Google
manejo de excepciones
manejar o declarar
Agacharse (declarando)
sólo retrasa lo inevitable
lava la ropa
foo foo
principal principal
principal
336 capítulo 11
Machine Translated by Google
manejo de excepciones
1 MANGO
Envuelva la decisión arriesgada en un intento/captura
2 DECLARAR (esquivarlo)
Declare que SU método arroja las mismas excepciones que el método
riesgoso al que está llamando. El método doLaundry() genera una
ClothingException, pero al declarar la
void foo() lanza ClothingException {
excepción, el método foo() consigue
lavanderí[Link]();
eludir la excepción. Sin intento/captura.
}
Pero ahora esto significa que quien llame al método foo() debe seguir la
ley Handle o Declare. Si foo() evita la excepción (declarándola) y main()
llama a foo(), entonces main() tiene que lidiar con la excepción.
} ¡¡PROBLEMA!!
El parámetro
} captura (MidiUnavailableException ex) { de captura
tiene que ser
[Link](“Qué fastidio”); la excepción "correcta".
Si dijéramos
que el código
'catch(ExcepciónArchivoNoEncontradof), el
mórficamente a
} } // cerrar juego no se compilaría,
no porque poli
encajaría en un
Excepción inviable Midi
atrapar FileNotFoundException.
Recuerda que no es suficiente
bloquearte tener que
¡cosa siendo arrojada!
atrapar el
Reglas de excepción
2 No puedes poner código entre el try y el 4 Un intento con solo finalmente (sin captura)
catch. aún debe declarar la excepción.
intentar { void go() lanza FooException {
¡ILEGAL! No puedes poner
[Link](); intentar {
código entre el intento y
la captura. Un intento sin captura
} [Link]();
no cumple con el
int y = 43; } finalmente { }
}
identificador ni declara la ley
} captura (Excepción ex) { }
338 capítulo 11
Machine Translated by Google
manejo de excepciones
No hay manera de
Pero, ¿por qué
que deje que Betty gane el
no utilizas el
código este año, así que lo
código ReadyBake?
haré yo mismo desde cero.
midi
tiene un sostiene Evento
obras de teatro
midi
Evento
midi
Evento
340 capítulo 11
Machine Translated by Google
manejo de excepciones
[Link]();
[Link](seq);
Dar la secuencia al secuenciador (como
[Link](); poner el CD en el reproductor de CD)
342 capítulo 11
Machine Translated by Google
manejo de excepciones
1 hacer un mensaje
Mensaje Corto a = nuevo Mensaje Corto();
siguiente página)
Anatomía de un mensaje.
El argumento
primero de setMessage() siempre representa
el 'tipo' de mensaje, mientras que los tres otro
t argumentos representan cosas diferentes
dependiendo del tipo de mensaje.
2 Canal
canal
Tipo de mensaje nota para velocidad
jugar Piense en un canal como un músico en una banda.
144 significa
NOTA SOBRE 1 127
012345678
empezar a jugar
128 significa
NOTA APAGADA
4 Velocidad
¿Qué tan rápido y fuerte hizo
344 capítulo 11
Machine Translated by Google
manejo de excepciones
cambiar un mensaje
1 cambiar la nota
Pruebe con un número entre 0 y 127 en los mensajes de
127
activación y desactivación de notas.
3 cambiar el instrumento
Agregue un nuevo mensaje, ANTES del mensaje de
reproducción de notas, que configure el instrumento en el canal
1 en algo distinto al piano predeterminado. El mensaje de
cambio de instrumento es '192' y el tercer argumento
representa el instrumento real (pruebe con un número entre 0 y 127).
al instrumento 102
en canal 1 (músico 1)
mensaje de cambio de instrumento
importar [Link].*;
intentar {
Mensaje Corto a = nuevo Mensaje Corto(); Ejecútelo con dos argumentos int de
[Link](144, 1, nota, 100); 0 a 127. Pruebe estos para empezar:
MidiEvent noteOn = nuevo MidiEvent(a, 1); [Link](notaEn);
Ayuda de la ventana de edición de archivos Atenuar
346 capítulo 11
Machine Translated by Google
manejo de excepciones
Andy: ritmo #2
348 capítulo 11
Machine Translated by Google
manejo de excepciones
intentar {
[Link](“r“);
[Link](“t“);
hacerArriesgado(prueba);
[Link](“s“); } finalmente {
[Link](“o“);
[Link](“w“);
[Link](“a“);
[Link](“h”);
Ventana de edición de archivos Ayuda ThrowUp
% java ExTestDrive sí se
descongela público estático vacío principal (String [] argumentos) {
Prueba de cadena = args[0];
% java ExTestDrive sin
lanzamientos
rompecabezas: crucigrama
JavaCross 7.0
350 capítulo 11
Machine Translated by Google
manejo de excepciones
[Link](“t”);
hacerArriesgado(prueba);
[Link](“o”);
} captura (MyEx e) {
[Link](“a”);
} finalmente {
[Link](“w”);
}
[Link](“s”);
}
[Link](“r”);
}
} Ventana de edición de archivos Ayuda Chill
% java ExTestDrive sí se
descongela
JavaCross Respuestas
ASIGNACIÓN
ASIGNACIÓN estalló
MCN R
SUBCLASE AOS INVOCAR
TPT t V C
MANGO DE JERARQUÍA l
norte NUEVA HAMPSHIRE t t A
S C ETEXCEPCIONES
t mi C R norte S
COMO PALABRA CLAVE h
nordeste mi ETREE
TT PATO C RT
EN T A ALGORITMO
AE ÉL A TR
LANZAR CONCRETO oh
mi Ah mi NUEVO
352 capítulo 11
Machine Translated by Google
12 obteniendo gui
Un muy gráfico
Historia
¡Guau! Esto luce genial.
Escuché que tu
Supongo que la presentación
ex esposa sólo podía cocinar
eslo es todo.
realmente comidas de línea de comando.
354 capítulo 12
Machine Translated by Google
obteniendo gui
[Link](JFrame.EXIT_ON_CLOSE);
¡Vaya! Ese es un
botón realmente grande.
no existen
Preguntas tontas
1 A
método que se llamará cuando el usuario
haga clic (lo que desea que suceda como
resultado del clic del botón).
2
camino saber cuándo activar un
hacia ese método. En otras palabras, ¡una
forma de saber cuándo el usuario hace
clic en el botón!
356 capítulo 12
Machine Translated by Google
obteniendo gui
Oye botón, me
1
importa lo que te pase.
oyentes de eventos
ev)
<<interfaz>>
ItemListener
itemStateChanged(ItemEvent ev)
<<interfaz>>
Escucha clave
claveReleased(KeyEvent ev)
keyTyped(KeyEvent ev)
358 capítulo 12
Machine Translated by Google
obteniendo gui
Ct i oh nL si t mi
.adda r( t
mi
norte
norte hs
i)
tt
oh
btu
t )
aCti oh mivmi
norte
r Foh r mid( el
nortePAG
mi metro
obteniendo eventos
vacío público ir () {
Marco JFrame = nuevo JFrame();
botón = nuevo JButton(“haz clic en mí”);
registra tu interés con el botón. Esto le dice al
botón "Agrégame a tu lista de oyentes".
2 botó[Link](esto);
¡El argumento que pase DEBE ser un objeto de
una clase que implemente ActionListener!
[Link]().add(botón);
[Link](JFrame.EXIT_ON_CLOSE);
[Link](300,300);
Implemente el método actionPerformed()
[Link] (verdadero);
} de la interfaz ActionListener. ¡Este es el
método de manejo de eventos real!
3
acción vacía pública realizada (evento ActionEvent) {
[Link](“¡Me han hecho clic!”);
}
}
El botón llama a este método para informarle que ocurrió un
evento. Le envía un objeto ActionEvent como argumento,
pero no lo necesitamos. Saber que ocurrió el evento es
suficiente información para nosotros.
360 capitulo 12
Machine Translated by Google
obteniendo gui
Fuente ENVÍA
el evento
El oyente OBTIENE el
evento
Objeto de evento
CONTIENE DATOS
sobre el evento
mi
vmi Ct
t ohbj
norte
mi
manejo de eventos
no existen
Preguntas tontas
Afila tu lápiz
¿Cómo se sabe si un objeto es
una fuente de evento?
Busque en la API.
caja de diálogo clave mecanografiada() sabes que una clase con este método
es una
boton de radio ratónSalido()
fuente de eventos clave.
opción del menú enfoque ganado() Hay un patrón de nombres.
362 capítulo 12
Machine Translated by Google
obteniendo gui
1
Poner widgets en un marco
Agregue botones, menús, botones de radio, etc.
[Link]().add(miBotón);
Número de libros de
Head First Java
2 Dibujar gráficos 2D en un widget comprados
Utilice un objeto gráfico para pintar formas. por error por los
baristas de cafeterías.
grá[Link](70,70,100,100);
cuadros,
gráficos
arte, juegos,
comerciales,
simulaciones, etc.
etc.
3
Poner un JPEG en un widget
Puedes poner tus propias imágenes en un widget.
grá[Link](miPic,10,10,this);
componente de pintura público vacío (Gráficos g) { NUNCA llamarás a esto tú mismo. El sistema lo
364 capítulo 12
Machine Translated by Google
obteniendo gui
Mostrar un JPEG
tu nombre de archivo va aquí
componente de pintura público vacío (Gráficos g) {
[Link](imagen,3,4,esto);
}
La esquina izquierda
componente de pintura público vacío (Gráficos g) { llenar todo el panel con negro (el
color predeterminado)
[Link](0,0,[Link](), [Link]());
Los primeros dos argumentos definen la esquina superior (x,y), izquierda
int rojo = (int) ([Link]() * 255); borde superior". Los otros dos argumentos dicen: "Haga que el ancho de
int verde = (int) ([Link]() * 255); este rectángulo sea tan ancho como el panel ([Link]()) y que la
int azul = (int) ([Link]() * 255); altura sea tan alta como el panel ([Link])".
componente de pintura público vacío (Gráficos g) { } Métodos a los que puedes recurrir en un
Referencia gráfica :
dibujarImagen()
Dibujar linea()
dibujarpolígono
dibujarRect()
dibujarOval()
llenarRect()
llenarRoundRect()
establecerColor()
[Link]();
Métodos que puede invocar en
una referencia de Graphics2D :
llenar3DRect()
dibujar3DRect()
girar()
Perro d = (Perro) a;
[Link](); escala()
cortar()
transformar()
setRenderingHints()
366 capítulo 12
Machine Translated by Google
obteniendo gui
[Link](70,70,100,100);
}
el método fillOval() realmente significa
"rellenar el óvalo con lo que esté cargado
en tu pincel (es decir, el degradado)"
eventos y gráficos
PUNTOS DE VIÑETA
EVENTOS GRÁFICOS
Para crear una GUI, comience con una ventana, generalmente un JFrame
Puede dibujar gráficos 2D directamente en un widget.
Marco JFrame = nuevo JFrame();
Puedes dibujar un .gif o .jpeg directamente en un widget.
Puede agregar widgets (botones, campos de texto, etc.) al
Para dibujar sus propios gráficos (incluido un .gif o .jpeg),
JFrame usando:
[Link]().add(button); cree una subclase de JPanel y anule el método paintCom
ponent().
A diferencia de la mayoría de los otros componentes, JFrame no le
permite agregarle directamente, por lo que debe agregarlo al panel de El sistema GUI llama al método paintComponent(). NUNCA
La interfaz de escucha le brinda al origen del evento una El objeto al que hace referencia el parámetro Graphics
forma de devolverle la llamada, porque la interfaz define de paintComponent() es en realidad una instancia de la
los métodos que el origen del evento llamará cuando clase Graphics2D. La clase Graphics 2D tiene una variedad de
ocurra un evento. métodos que incluyen:
fill3DRect(), draw3DRect(), rotate(), scale(), shear(),
Para registrarse para eventos con una fuente, llame al
transform()
método de registro de la fuente. Los métodos de registro
siempre toman la forma: add<EventType>Listener. Para Para invocar los métodos Graphics2D, debe convertir el
registrarse en ActionEvents de un botón, por parámetro de un objeto Graphics a un objeto Graphics2D:
ejemplo, llame a: [Link](this);
Gráficos2D g2d = (Gráficos2D) g;
Implemente la interfaz de escucha implementando todos los
métodos de manejo de eventos de la interfaz. Coloque su
código de manejo de eventos en el método de devolución
de llamada del oyente. Para
ActionEvents, el método es: public void actionPerformed(ActionEvent
evento) {
[Link](“¡hiciste clic!”);
}
368 capítulo 12
Machine Translated by Google
obteniendo gui
Inicia la aplicación
¿Pones DOS
cosas en un marco?
[Link]().add(botón);
este
región predeterminada Oeste centro Afila tu lápiz
Dadas las imágenes de la página 351, escribe la
370 capítulo 12
Machine Translated by Google
obteniendo gui
importar [Link].*;
importar [Link].*;
importar [Link].*;
Marco JFrame;
vacío público ir () {
marco = nuevo JFrame();
[Link](JFrame.EXIT_ON_CLOSE);
múltiples oyentes
norte
Oeste centro
la etiqueta
irá aquí
panel de dibujo
va en el centro
sur
El botón de
cambio de color irá aquí.
Y necesitamos conseguir
DOS eventos
372 capítulo 12
Machine Translated by Google
obteniendo gui
1 opción uno
Implementar dos métodos actionPerformed()
2 opción dos
Registre al mismo oyente con ambos botones.
clase MyGui implementa ActionListener {
// declaramos un montón de variables de instancia aquí
vacío público ir () {
// construir interfaz gráfica de usuario
múltiples oyentes
3 opción tres
Crea dos clases ActionListener separadas
clase MyGui {
Marco JFrame;
Etiqueta JLabel;
interfaz gráfica de usuario vacía() {
// código para crear una instancia de los dos oyentes y registrar uno // con el botón de color y
el otro con el botón de etiqueta
} } // cerrar clase
Defecto: estas clases no tendrán acceso a las variables sobre las que necesitan
actuar, 'marco' y 'etiqueta'.
374 capítulo 12
Machine Translated by Google
obteniendo gui
clases internas
clase MiClaseExterna {
privado int x;
376 capítulo 12
Machine Translated by Google
obteniendo gui
Ponerse
2 Cree una instancia de
en contacto la clase interna
utilizando la instancia
de la clase externa.
clase mi oh
nortenorte
entero x
El nuevo bestseller del
autor de "¿Quién movió mi Char?" r
Estos dos objetos del montón t mi
ohtu
tienen un vínculo especial. El cuerdas
interno puede usar las variables
del externo (y viceversa). i mi
nortenorte r
*Hay una excepción a esto, para un caso muy especial: una clase interna definida
dentro de un método estático. Pero no vamos a llegar allí, y es posible que pases
toda tu vida en Java sin encontrarte con uno de estos.
nuevo MiInterior()
clase MiExterior { En t
La clase externa tiene una variable
de instancia privada 'x'
privado int x;
exterior
Mi exterior
interno
mi interior
clase Foo {
público estático vacío principal (String[] args) {
MiExteriorobjexterno = nuevo MiExterior();
[Link] internalObj = [Link] MyInner();
}
}
378 capítulo 12
Machine Translated by Google
obteniendo gui
Marco JFrame;
Etiqueta JLabel;
vacío público ir () {
marco = nuevo JFrame();
[Link](JFrame.EXIT_ON_CLOSE);
[Link]().add([Link], colorButton);
exterior
[Link]().add([Link], drawPanel);
interno
[Link]().add([Link], labelButton);
[Link]().add([Link], etiqueta); Objeto
interno
LabelListener
[Link](300,300); Objeto
[Link] (verdadero); ColorListener
} ¡Ahora podemos
tener DOS
clase LabelListener implementa ActionListener { ActionListeners en una sola clase!
acción vacía pública realizada (evento ActionEvent) {
[Link](“¡Ay!”);
} la clase interna
} // cerrar clase interna conoce la 'etiqueta'
clases internas
HeadFirst: ¿Qué hace que las clases internas sean importantes? separado de todos los demás. Las clases internas no son exactamente
reutilizables. De hecho, los he oído llamar “Inútiles—
Objeto interior: ¿ Por dónde empiezo? Te damos la oportunidad de
inútil una y otra vez”.
implementar la misma interfaz más de una vez en una clase.
Recuerde, no puede implementar un método más de una vez en una Objeto interno: Sí, es cierto que la clase interna no es tan reutilizable;
clase Java normal. Pero al usar clases internas , cada clase interna de hecho, a veces no es reutilizable en absoluto, porque está
puede implementar la misma interfaz, por lo que puedes tener todas íntimamente ligada a las variables de instancia y métodos de la clase
estas implementaciones diferentes de los mismos métodos de interfaz. externa. Pero
HeadFirst: ¡Lo cual sólo prueba mi punto! Si no son reutilizables, ¿por qué
HeadFirst: ¿ Por qué querrías implementar el mismo método dos molestarse con una clase separada? Quiero decir, aparte del problema
veces? de la interfaz, que parece una solución alternativa.
a mi.
Objeto interno: revisemos los controladores de eventos de la GUI.
Piénselo... si desea que tres botones tengan cada uno un Objeto interno: como decía, debes pensar en ISA y el polimorfismo.
comportamiento de evento diferente, entonces use tres clases
internas, todas implementando ActionListener, lo que significa que
CabezaPrimero: Está bien. Y estoy pensando en ellos porque...
cada clase puede implementar su propio método actionPerformed.
Objeto interno: ¡Porque es posible que las clases externa e interna
HeadFirst: Entonces, ¿son los controladores de eventos la única razón para
deban pasar diferentes pruebas ISA! Comencemos con el ejemplo del
utilizar clases internas?
oyente de GUI polimórfico. ¿Cuál es el tipo de argumento declarado
Objeto interior: Oh, Dios mío, no. Los controladores de eventos son para el método de registro del oyente del botón? En otras
sólo un ejemplo obvio. Siempre que necesite una clase separada, pero palabras, si va a la API y verifica, ¿qué tipo de cosa (clase o tipo de
aún desee que esa clase se comporte como si fuera parte de otra interfaz) debe pasar al método addActionListener()?
clase, una clase interna es la mejor (y a veces la única) forma de hacerlo.
380 capítulo 12
Machine Translated by Google
obteniendo gui
HeadFirst: Oh, bueno, tú simplemente... hmmm. Creo que lo estoy HeadFirst: ¿La vida de quién? ¿Tuyo? ¿El objeto exterior? ¿Ambos?
entendiendo. Siempre puedes implementar más de una interfaz, pero solo
Objeto interior: Mío. No puedo estar atado a ningún otro objeto exterior.
puedes extender una clase. Sólo puedes ser un tipo de ISA cuando se
Mi única salida es la recogida de basura.
trata de tipos de clases .
HeadFirst: ¿Qué pasa con el objeto exterior? ¿Se puede asociar
Objeto interior: ¡Bien hecho! Sí, no puedes ser al mismo tiempo un Perro
con otros objetos internos?
y un Botón. Pero si eres un Perro que a veces necesita ser un Botón
(para poder pasar a métodos que toman un Botón), la clase Perro (que Objeto interior: ahora lo tenemos. Esto es lo que realmente querías. Sí Sí.
extiende Animal para que no pueda extender el Botón) puede tener una Mi así llamado 'compañero' puede tener tantos objetos internos como
clase interna que actúa en nombre del Perro como un Botón, extendiendo quiera.
el Botón y, por lo tanto, dondequiera que se requiera un Botón, el HeadFirst: ¿Eso es monogamia en serie? ¿O puede tenerlos todos al
Perro puede pasar su Botón interno en lugar de él mismo. En otras mismo tiempo?
palabras, en lugar de decir [Link](this), el objeto Dog llama a
Objeto interior: Todo al mismo tiempo. Allá. ¿Satisfecho?
[Link](new MyInnerButton()).
HeadFirst: Bueno, tiene sentido. Y no lo olvidemos, fuiste tú quien
ensalzó las virtudes de “múltiples implementaciones de la misma
HeadFirst: ¿Puedo darme un ejemplo claro?
interfaz”. Entonces tiene sentido que si la clase externa tiene tres botones,
Objeto interno: ¿Recuerdas el panel de dibujo que usamos, donde necesitaría tres clases internas diferentes (y por lo tanto tres objetos
creamos nuestra propia subclase de JPanel? En este momento, esa de clase interna diferentes) para manejar los eventos. Gracias por todo.
clase es una clase separada, no interna. Y eso está bien, porque la
clase no necesita acceso especial a las variables de instancia de la GUI Aquí tienes un pañuelo.
principal. Pero ¿y si así fuera? ¿Qué pasa si estamos haciendo una
animación en ese panel y obtiene sus coordenadas de la aplicación
principal (por ejemplo, en función de algo que el usuario hace en otra
parte de la GUI)? En ese caso, si convertimos el panel de dibujo en
una clase interna, la clase del panel de dibujo pasa a ser una Él piensa que es
subclase de JPanel, mientras que la clase externa sigue siendo libre Lo hice, teniendo objetos dos
de ser una subclase de otra cosa.
de clase interna. Pero tenemos nosotros
HeadFirst: ¡Sí, ya veo! Y el panel de dibujo no es lo suficientemente acceso a todos sus datos privados, así
reutilizable como para ser una clase separada de todos modos, ya que lo que imagina el daño que podríamos causar...
que realmente está pintando es específico de esta aplicación GUI.
tú y la instancia externa.
Objeto interior: ¿Qué pasa con ustedes? ¿No hay suficientes chismes
sórdidos en un tema tan serio como el polimorfismo?
clases internas
comenzar finalizar
no existen
Preguntas tontas
20 píxeles desde la
izquierda, 50 píxeles desde arriba
382 capítulo 12
Machine Translated by Google
obteniendo gui
Afila tu lápiz
importar [Link].*;
importar [Link].*;
vacío público ir () {
Marco JFrame = nuevo JFrame();
[Link](JFrame.EXIT_ON_CLOSE);
¡Aquí es donde para (int i = 0; i < 130; i++) { repite esto 130 veces
está la acción!
x++;
y++; incrementar x e y
coordenadas
decirle al panel que se vuelva a pintar (para
[Link](); que podamos ver el círculo en la nueva ubicación)
intentar {
[Link](50);
} captura (Excepción ex) { } Disminuya un poco la velocidad (de lo contrario, se
} moverá tan rápido que no VERÁ que se
preocuparte
mueve). No se suponía que ya supiera esto. Llegaremos
}// cerrar el método go() a los hilos en el capítulo 15.
384 capítulo 12
Machine Translated by Google
obteniendo gui
[Link]([Link]);
[Link](x,y,40,40);
getWidth() y getHeight() son métodos
heredados de JPanel.
}
X +3 X
Y +3 Y
X X
Y Y
X X
Y Y
Código Cocina
Recuerde, esta parte es opcional. Pero creemos que es bueno para ti.
Y te gustará. Y puedes usarlo para impresionar a la gente.
(Vale, claro, puede que funcione sólo con personas que son realmente fáciles de impresionar,
pero aun así...)
386 capítulo 12
Machine Translated by Google
obteniendo gui
MidiEvent estático público makeEvent (int comd, int chan, int uno, int dos, int tick) {
}catch(Excepción e) { }
evento de regreso;
devolver el evento (un MidiEvent
} todo cargado con el mensaje)
388 capítulo 12
Machine Translated by Google
obteniendo gui
importar [Link].*;
no olvides la importación
clase pública MiniMusicPlayer1 {
intentar {
para (int i = 5; i < 61; i+= 4) { haga un montón de eventos para que las notas sigan
subiendo (desde la nota de piano 5 hasta la nota de piano 61)
MidiEvent estático público makeEvent (int comd, int chan, int uno, int dos, int tick) {
Evento MidiEvent = nulo;
intentar {
Mensaje Corto a = nuevo Mensaje Corto();
[Link](comd, chan, uno, dos);
evento = nuevo MidiEvent(a, marca);
}catch(Excepción e) { }
evento de regreso;
}
} // cerrar clase
para (int i = 5; i < 60; i+= 4) { Así es como retomamos el ritmo: insertamos
[Link](makeEvent(144,1,i,100,i)); nuestro PROPIO ControllerEvent (176 dice que el
tipo de evento es ControllerEvent) con un argumento
[Link](makeEvent(176,1,127,0,i)); para el evento número 127. ¡Este evento no servirá
de NADA! Lo ponemos en JUST para poder
[Link](makeEvent(128,1,i,100,i + 2)); obtener un evento cada vez que se toca una nota.
} // finalizar bucle En otras palabras, su único propósito es que se
active algo que NOSOTROS podamos escuchar
[Link](seq); (no podemos escuchar los eventos NOTA ON/OFF).
[Link](220); Tenga en cuenta que haremos que este evento
[Link](); suceda en el MISMO tic que la NOTA EN. Entonces,
} captura (Excepción ex) {[Link]();} cuando ocurra el evento NOTA EN, lo sabremos
} // cerca porque NUESTRO evento se activará al mismo tiempo.
cambio de control de vacío público (evento de mensaje corto) { El método del controlador de eventos (desde la interfaz de
[Link](“la”); escucha ControladorEvento). Cada vez que obtengamos
} el evento, imprimiremos "la" en la línea de comando.
public MidiEvent makeEvent(int comd, int chan, int uno, int dos, int tick) {
Evento MidiEvent = nulo;
intentar {
Mensaje Corto a = nuevo Mensaje Corto();
[Link](comd, chan, uno, dos);
evento = nuevo MidiEvent(a, marca);
El código que es diferente de la versión anterior
}catch(Excepción e) { } se resalta en gris. (y esta vez no lo ejecutaremos
evento de regreso; todo dentro de main())
}
} // cerrar clase
390 capítulo 12
Machine Translated by Google
obteniendo gui
mensaje = falso;
} // cerrar si
} // cerrar método
} // cerrar clase interna
Código MiniMusicPlayer3
Afila tu lápiz
importar [Link].*; Esta es la lista de códigos completa para la versión tres.
importar [Link].*; Construye directorio en la versión dos. Intente anotarlo
importar [Link].*;
usted mismo, sin mirar las páginas anteriores.
importar [Link].*;
vacío público ir () {
setUpGui();
intentar {
int r = 0;
para (int i = 0; i < 60; i+= 4) {
[Link](seq);
[Link]();
[Link](120);
} captura (Excepción ex) {[Link]();}
} // cerrar método
392 capítulo 12
Machine Translated by Google
obteniendo gui
public MidiEvent makeEvent(int comd, int chan, int uno, int dos, int tick) {
Evento MidiEvent = nulo; Pruebe
{Mensaje
Corto a = nuevo Mensaje Corto(); [Link](comd, chan,
uno, dos); evento = nuevo MidiEvent(a, marca);
}catch(Excepción e) { } evento de
retorno; } // cerrar
método
Gráficos2D g2 = (Gráficos2D) g;
[Link](nuevo Color(r,gr,b));
} // cerrar si } // cerrar
método } // cerrar clase
interna
} // cerrar clase
¿Quién soy?
394 capítulo 12
Machine Translated by Google
obteniendo gui
Marco JFrame;
JBotón b;
[Link]( JFrame.EXIT_ON_CLOSE);
b = nuevo JButton(“A”);
[Link]();
______________________________________;
_________.getContentPane().add(drawP);
__________________________;
_________.setVisible(verdadero); para (int i=0;
i<124; _______________) {
_____________________;
_____________________; prueba
{ [Link](50); } captura
(Excepción ex) { } }
__________________________________;
__________________________________;
__________________________________;
__________________________________;
}
}
}
396 capítulo 12
Machine Translated by Google
obteniendo gui
Soluciones de ejercicio
interfaz de escucha
Marco JFrame;
JBotón b;
acción realizada( )
establecerTamaño( )
public static void main(String [] args) { InnerButton
gui = nuevo InnerButton(); [Link]();
componente de pintura () }
El método addActionListener()
toma una clase que implementa la
fuente del evento
interfaz ActionListener
agregarActionListener()
b = nuevo JButton(“A”);
componente de pintura () [Link]( nuevo BListener( ) );
clase interna
Rompecabezas de piscina
398 capítulo 12
Machine Translated by Google
13 usando columpio
El swing es fácil.
componentes y contenedores
[Link]
JBotón
Marco J JPanel
JCheckBox
JTextField
400 capitulo 13
Machine Translated by Google
usando columpio
Administradores de diseño
Como administrador de
diseño, estoy a cargo del
tamaño y la ubicación de sus componentes.
En esta GUI, soy yo quien decide qué tan
grandes deben ser estos botones y dónde
están entre sí y con el marco.
botón 1
botón 2
botón 3
Grupo B
[Link](new JButton(“botón 3”)); administrador de diseño del Panel A controla solo las
cosas agregadas directamente al Panel A y no
[Link](panelB); controla nada anidado dentro de esos componentes agregados.
administradores de diseño
402 capítulo 13
Machine Translated by Google
usando columpio
Diseño de borde
Un administrador de BorderLayout divide un componente
de fondo en cinco regiones. Puede agregar solo un componente
por región a un fondo controlado por un administrador de
un componente
por región
BorderLayout. Los componentes dispuestos por este
administrador normalmente no llegan a tener su tamaño
preferido. BorderLayout es el administrador de diseño predeterminado
para un marco.
Diseño de flujo
Un administrador FlowLayout actúa como un procesador de
textos, excepto que tiene componentes en lugar de palabras.
componentes agregados de izquierda
Cada componente tiene el tamaño que desea y están dispuestos
a derecha, ajustándose a una línea
nuevo
de izquierda a derecha en el orden en que se agregan, con el cuando sea necesario
Diseño de caja
Un administrador BoxLayout es como FlowLayout en el
sentido de que cada componente tiene su propio tamaño y
los componentes se colocan en el orden en que se agregan.
componentes agregados
Pero, a diferencia de FlowLayout, un administrador de BoxLayout de arriba a abajo, uno por 'línea'
puede apilar los componentes verticalmente (u horizontalmente,
pero normalmente solo nos preocupamos verticalmente). Es
como un FlowLayout pero en lugar de tener un 'ajuste de
componentes' automático, puedes insertar una especie de
'tecla de retorno de componente' y forzar
los componentes para iniciar una nueva línea.
diseño de borde
BorderLayout se preocupa
por cinco regiones: este,
oeste, norte, sur y
centro
importar [Link].*;
BorderLayout está en el paquete [Link]
importar [Link].*;
vacío público ir () {
especificar la región
Marco JFrame = nuevo JFrame();
Botón JButton = nuevo JButton(“haz clic en mí”);
[Link]().add([Link], botón);
[Link](200,200);
[Link] (verdadero);
}
}
Barra cerebral
cerebro
con barra
404 capítulo 13
Machine Translated by Google
usando columpio
Primero, le pregunto
al botón su tamaño
Ahora tengo muchas
preferido.
palabras, así que preferiría
tener 60 píxeles de ancho y
25 píxeles de alto.
t
C
Btut t bj mi
ohnorte oh
El botón obtiene
su ancho preferido,
t
pero no su altura. Btut t C
bj mi
ohnorte oh
diseño de borde
vacío público ir () {
Marco JFrame = nuevo JFrame();
Botón JButton = new JButton(“No hay cuchara...”);
[Link]().add([Link], botón);
[Link](200,200);
[Link] (verdadero);
}
vacío público ir () {
Marco JFrame = nuevo JFrame(); Una fuente más grande
Botón JButton = nuevo JButton ("¡Haga clic en esto!"); obligará al marco a asignar más
Fuente bigFont = nueva fuente ("serif", [Link], 28); espacio para la altura del botón.
botó[Link](bigFont);
[Link]().add([Link], botón);
[Link](200,200);
[Link] (verdadero);
}
El ancho sigue siendo el mismo, pero
ahora el botón es más alto. La
región norte se estiró para
adaptarse a la nueva altura preferida del botón.
406 capítulo 13
Machine Translated by Google
usando columpio
t
C
Btut t bj mi
ohnorte oh
¡La región central se queda con lo que queda! (excepto en un caso especial
que veremos más adelante)
vacío público ir () {
Marco JFrame = nuevo JFrame();
[Link]().add([Link], este);
[Link]().add([Link], oeste);
[Link]().add([Link], norte);
[Link]().add([Link], sur);
[Link]().add([Link], centro);
[Link](300,300);
[Link] (verdadero);
}
en el este y el
píxeles
diseño de flujo
FlowLayout se preocupa
por el flujo de los componentes:
importar [Link].*;
importar [Link].*;
vacío público ir () {
Marco JFrame = nuevo JFrame(); Panel Haga el panel gris para que podamos
JPanel = nuevo JPanel(); ver dónde está en el marco.
[Link]([Link]);
[Link]().add([Link], panel);
[Link](200,200);
[Link] (verdadero);
}
}
408 capítulo 13
Machine Translated by Google
usando columpio
vacío público ir () {
Marco JFrame = nuevo JFrame(); Panel JPanel
= nuevo JPanel();
Agregue el botón al panel y agregue el
[Link]([Link]);
panel al marco. El administrador de diseño del
panel (flujo) controla el botón y el
Botón JButton = nuevo JButton ("dame una sorpresa");
administrador de diseño del marco (borde) controla el panel.
panel.añadir(botón);
[Link]().add([Link], panel);
[Link](250,200);
[Link] (verdadero);
}
Y el botón obtuvo su
panel panel
tamaño preferido en
ambas dimensiones, porque el panel
usos
diseño de flujo y el
El botón es parte del panel
(no del marco).
Según el tamaño de mi
Tengo un botón ahora fuente y el número de
así que mi administrador de caracteres, quiero que tengan 70
diseño tendrá que determinar píxeles de ancho y 20 píxeles de alto.
qué tan grande debo ser...
t
Btu mi C
t t oh ohbj
control S control S
a mi bjeC t
PAG
norte yo
oh
norte
el marco el panel
Administrador de diseño de bordes Administrador de diseño de flujo
diseño de flujo
vacío público ir () {
Marco JFrame = nuevo JFrame(); Panel JPanel
= nuevo JPanel();
[Link]([Link]);
panel.añadir(botón);
[Link](botónDos); agregue AMBOS al panel
[Link]().add([Link], panel);
[Link](250,200);
[Link] (verdadero);
}
Afila tu lápiz
410 capítulo 13
Machine Translated by Google
usando columpio
¡BoxLayout al rescate!
Mantiene los componentes
apilados, incluso si hay espacio para
colocarlos uno al lado del otro.
Pero ahora tendrás que cambiar el administrador de diseño del panel del FlowLayout
predeterminado a BoxLayout.
vacío público ir () {
Marco JFrame = nuevo JFrame(); Panel JPanel
= nuevo JPanel(); Cambie el administrador de diseño para que sea una
Botón JButton = nuevo JButton ("dame una sorpresa"); El constructor BoxLayout necesita conocer el
JButton botónDos = nuevo JButton(“bienaventuranza”);
ycomponente
que eje usarque está diseñando
(usamos
(es decir, el panel).
panel.añadir(botón);
pila vertical). Y_AXIS para un
[Link](botónDos);
[Link]().add([Link], panel);
[Link](250,200);
[Link] (verdadero);
}
administradores de diseño
no existen
Preguntas tontas
PUNTOS DE VIÑETA
establecer diseño (nulo) Si desea que un panel use algo más que flujo, debe llamar a
setLayout() en el panel.
412 capítulo 13
Machine Translated by Google
usando columpio
JTextField
JTextField
JLabel
Cómo usarlo
1 Sacar texto de él
[Link]([Link]());
2 Ponle texto
[Link](myActionListener);
[Link]();
área de texto
JTextArea
Cómo usarlo
Cree un JScrollPane y asígnele el
área de texto por la que se desplazará.
1 Haz que tenga solo una barra de desplazamiento vertical.
[Link](ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
[Link](ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
[Link](desplazador);
¡¡Importante!! Le asigna el área de texto al panel de desplazamiento (a través del
constructor
al panel. ¡Nodel panel de
agregas desplazamiento)
el área y luego agrega
de texto directamente el panel de desplazamiento
al panel!
2 Reemplazar el texto que contiene.
[Link]();
[Link]();
414 capítulo 13
Machine Translated by Google
usando columpio
Ejemplo de JTextArea
[Link](desplazador);
[Link]().add([Link], panel);
[Link]().add([Link], botón);
[Link](350,300);
[Link] (verdadero);
}
casilla de verificación
no existen
Preguntas tontas
JCheckBox
Constructor
JCheckBox check = new JCheckBox(“Va a 11”);
Cómo usarlo
[Link](esto);
[Link](verdadero);
[Link](falso);
416 capítulo 13
Machine Translated by Google
usando columpio
Lista J
[Link](desplazador);
[Link](4);
[Link](ListSelectionModel.SINGLE_SELECTION);
[Link](este);
Código Cocina
418 capítulo 13
Machine Translated by Google
usando columpio
Hacer el BeatBox
1 Cree una GUI que tenga 256 casillas de verificación (JCheckBox) que comienzan
sin marcar, 16 etiquetas (JLabel) para los nombres de los instrumentos y cuatro
botones.
Código BeatBox
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
JFrame el Marco; Estos son los nombres de los instrumentos, como una matriz de
cadenas, para construir las etiquetas de la GUI (en cada fila)
String[] nombres de instrumentos = {“Bambo”, “Charles cerrado”,
“Abrir charles”, “caja acústica”, “platillo crash”, “palmada”,
“High Tom”, “Hola Bongo”, “Maracas”, “Silbato”, “Conga Baja”,
“Cowbell”, “Vibraslap”, “Tom medio bajo”, “Agogo alto”,
“Abre Hola Conga”};
int[] instrumentos = {35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};
420 capítulo 13
Machine Translated by Google
usando columpio
[Link]().add(fondo);
[Link](50,50,300,300); [Link]();
[Link]
(verdadero); } // cerrar método
Código BeatBox
[Link](pista);
deshazte de la pista vieja, haz una nueva.
pista = [Link]();
Haga esto para cada una de las 16 FILAS (es decir, Bass, Congo, etc.)
para (int i = 0; i < 16; i++) {
lista de pistas = nuevo int[16];
Establezca la 'clave'. que representa qué instrumento es (bajo,
charles, etc. La matriz de instrumentos contiene los números MIDI
clave int = instrumentos[i]; reales para cada instrumento).
para (int j = 0; j < 16; j++) { Haga esto para cada uno de los BEATS de esta fila.
[Link](secuencia);
[Link](secuenciador.LOOP_CONTINUOUSLY); Especifiquemos el número de
[Link](); iteraciones del bucle o, en
[Link](120); este caso, bucles continuos.
} captura (Excepción e) {[Link]();}
} // cerrar el método buildTrackAndStart
¡¡AHORA JUEGA LA COSA!!
422 capítulo 13
Machine Translated by Google
usando columpio
si (clave! = 0) {
[Link](makeEvent(144,9,clave, 100, i)); Realice los eventos
[Link](makeEvent(128,9,clave, 100, i+1)); NOTA ON y NOT
} OFF y agréguelos a la pista.
}
}
public MidiEvent makeEvent(int comd, int chan, int uno, int dos, int tick) {
Evento MidiEvent = nulo;
intentar {
Mensaje Corto a = nuevo Mensaje Corto();
[Link](comd, chan, uno, dos);
evento = nuevo MidiEvent(a, marca);
Este es el método de utilidad del último
capítulos
CodeKitchen. Nada nuevo.
} catch(Excepción e) {[Link](); }
evento de regreso;
}
} // cerrar clase
3 5
2 ? 4
424 capítulo 13
Machine Translated by Google
usando columpio
Fragmentos de código
[Link]().add([Link],botón);
[Link]().add([Link], panel);
rompecabezas: crucigrama
GUICross 7.0
426 capítulo 13
Machine Translated by Google
usando columpio
Soluciones de ejercicio
[Link]().add([Link],botón);
[Link]().add([Link], panel);
Respuestas de rompecabezas
GUICross 7.0
PANEL DE DISEÑO S
W. CENTRO
METAL t G.W.
S mi OYENTE I
EVENTO AI OADD
t Ud. PAG YZ juego de rol
VCFLOWOE EL
ISAR l Ud. GOLPEAR
ESLANIMACIÓN C
I LMCC Ud. PAG
BBEYTEXTAREA A
LA I mi QN
ECHECKBOXR Ud. mi
KA norte ETIQUETA
S
ACCIÓN ESCUCHADOR
428 capítulo 13
Machine Translated by Google
guardar objetos
Captura el ritmo
1 Usar serialización
Escriba un archivo que contenga objetos aplanados
(serializados). Luego haga que su programa lea los
objetos serializados del archivo y los infle nuevamente para
convertirlos en objetos vivos, que respiran y que habitan en el montón.
Por ejemplo, un archivo delimitado por tabulaciones que puede utilizar una hoja
430 capítulo 14
Machine Translated by Google
Estado de ahorro
poder interno
Tipo de cadena
Arma[] armas
obtener arma()
usar arma()
potencia: 50
aumentar potencia()
1 Opcion uno // más tipo: elfo
Crea un archivo y escribe tres líneas de texto, una por carácter, El archivo serializado es mucho más difícil de leer para los
guardar objetos
1 Crear un FileOutputStream
FileOutputStream fileStream = new FileOutputStream(“[Link]”);
Hacer una
Objeto FileOutputStream.
sabe cómo conectarse
Flujo de salida de archivos
(y crear) un archivo.
2 Crear un ObjectOutputStream
ObjectOutputStream os = nuevo ObjectOutputStream(fileStream);
3 Escribe el objeto
serializa los objetos a los que hace referencia personaje
[Link](personajeUno); Uno, personaje Dos y personaje Tres, y los escribe en
el archivo “[Link]”.
[Link](personajeDos);
[Link](personajeTres);
4 Cierre el ObjectOutputStream
[Link]();
Al cerrar la secuencia en la parte superior, se cierran
las que están debajo, por lo que FileOutputStream (y el
archivo) se cerrarán automáticamente.
432 capítulo 14
Machine Translated by Google
destino
01101001
el objeto está aplanado (seriaizado) El objeto se escribe como bytes en
01101110
011010010110111001 01
está escrito para está encadenado a
Objeto
ObjectOutputStream (un flujo FileOutputStream (un Archivo
en cadena) flujo de conexión)
usted está aquí 433
Machine Translated by Google
objetos serializados
Los objetos en el montón tienen estado: el Los objetos serializados guardan los
valor de las variables de instancia valores de las variables de instancia, de
del objeto. Estos valores hacen que modo que una instancia (objeto) idéntica
una instancia de una clase sea diferente pueda volver a la vida en el montón.
de otra instancia de la misma clase.
00100101
Objeto con dos variables de Los valores de las variables de
instancia primitivas. 01000110 instancia para ancho y alto se
guardan en el archivo “[Link]”,
00100101
01000110
Los valores son junto con un poco más de
aspirados y
información que la JVM necesita
bombeados al arroyo. para restaurar el objeto (como
[Link] cuál es su tipo de clase).
ancho altura FileOutputStream fs = nuevo FileOutputStream(“[Link]”);
ObjectOutputStream os = nuevo ObjectOutputStream(fs);
[Link](miFoo);
Cree un FileOutputStream que se conecte
Foo miFoo = nuevo Foo();
al archivo “[Link]”, luego encadene
[Link](37);
[Link](70); un ObjectOutputStream a él y dígale a
ObjectOutputStream que escriba el objeto.
434 capítulo 14
Machine Translated by Google
Barra cerebral
cerebro
con barra
mi Ct
i bj mi
norte
gramo
mi oh
norte
eng
llantas
Motor
Neumático [] t
t irmi C
jmi
[ ] ar ray ohb
Car bj miCt
oh
objetos serializados
Cuando se serializa un objeto, se serializan todos los objetos a los que hace
referencia desde variables de instancia. Y todos los objetos a los que también
aquellos
se refieren los objetos están serializados. Y todos los objetos a los que se refieren
los objetos están serializados... ¡y la mejor parte es que sucede aquellos
automáticamente!
St r i t
norte
gramo bj mi C
oh
tamaño
perros
En t
nombre
Coh t
ar ohbj miC
Perro [ ]
yo
yo
columna
Cadena
kmi t
mi oh
nortenorte yo
bje C Cuello
St r i t
norte
gramo oh bj mi C
Perro Perro
Ct
tamaño
Doh [ j mi
] ar ray ohb
gramo
En t
nombre
Coh t
ar ohbj miC
yo
yo
columna
Cadena
Cuello
Doh bj miCt
gramo oh
436 capítulo 14
Machine Translated by Google
importar [Link].*; que necesita importarlo. No hay métodos para implementar, pero cuando dice
public class Box implementa Serializable { "implementa Serializable", le dice a la JVM, "está bien serializar
objetos de este tipo".
intentar {
FileOutputStream fs = nuevo FileOutputStream(“[Link]”);
ObjectOutputStream os = nuevo ObjectOutputStream(fs);
[Link](miBox); Hacer una
[Link](); ObjectOutputStream
} captura (Excepción ex) { encadenado a la conexión
arroyo.
[Link]();
} Dígale que escriba el objeto.
}
}
usted está aquí 437
Machine Translated by Google
objetos serializados
O todo el
El gráfico de objetos se
serializa correctamente o la
serialización falla.
No puedes serializar un
}
% estanque de java
}
[Link]: Pato
en [Link]([Link])
¡¡Ay!! ¡El pato no es serializable!
pato de clase pública { No implementa Serializable, por lo
// código de pato aquí que cuando intentas serializar un
} objeto Pond, falla porque la variable
de instancia de Pond's Duck no
se puede guardar.
438 capítulo 14
Machine Translated by Google
¿Es inútil
entonces? Estoy
completamente jodido si el
transitorio
importar [Link].*;
transitorio dice: "no guarde clase Chat implementa Serializable {
esta variable durante la cadena transitoria ID actual;
serialización, simplemente omítala".
La variable nombre
// más código
de usuario se guardará
}
como parte del estado del
objeto durante la serialización.
objetos serializados
440 capítulo 14
Machine Translated by Google
Hacer una
2 Crear un ObjectInputStream
ObjectInputStream os = nuevo ObjectInputStream(fileStream);
5 Cierre el ObjectInputStream
[Link]();
Al cerrar la secuencia en la parte superior, se cierran
las que están debajo, por lo que FileInputStream (y el
archivo) se cerrarán automáticamente.
deserializar objetos
01101110 011010010110111001
es leído por está encadenado a
01
Objeto
FileInputStream (un ObjectInputStream (un flujo
flujo de conexión) en cadena)
Archivo
442 capítulo 14
Machine Translated by Google
no existen
Preguntas tontas
ejemplo de serialización
// imagina un código que hace cosas con los caracteres que podrían cambiar sus valores de estado
intentar {
intentar {
Duende
tipo: troll oh bj miCt
armas: manos
oh bj miCt
444 capítulo 14
Machine Translated by Google
La clase GameCharacter
importar [Link].*;
guardar objetos
PUNTOS DE VIÑETA
Marque una variable de instancia con la palabra clave transitoria si desea que
la serialización omita esa variable. La variable se restaurará como nula (para
referencias de objetos) o valores predeterminados (para primitivas).
Durante la deserialización, la clase de todos los objetos del gráfico debe estar
disponible para la JVM.
de una variable estática como parte del estado de un objeto específico, ya que
todos los objetos de ese tipo comparten un solo valor: el de la clase.
446 capítulo 14
Machine Translated by Google
120,mago,hechizos,invisibilidad
[Link](algúnObjeto);
importar [Link].*;
clase WriteAFile {
Si el archivo "[Link]" no
público estático vacío principal (String[] args) {
existe, FileWriter lo creará.
intentar {
Escritor de FileWriter = nuevo FileWriter ("[Link]");
¡¡IOExcepción!!
[Link]();
¡Ciérralo cuando hayas terminado!
¿Cuál es el
primer país
atrás
extranjero al sur
de Detroit, Michigan?
Canadá (Ontario)
Tarjeta de prueba
Tarjeta de prueba(q, a)
pregunta
respuesta
obtenerPregunta()
obtener respuesta()
QuizCardBuilder QuizCardPlayer
Tiene un menú Archivo con la opción "Guardar" para guardar el Tiene un menú Archivo con una opción "Cargar" para cargar un
conjunto actual de tarjetas en un archivo de texto. conjunto de tarjetas desde un archivo de texto.
448 capítulo 14
Machine Translated by Google
clase interna
clase interna
clase interna
marco = nuevo JFrame ("Constructor de tarjetas de Esto es todo el código GUI aquí. Nada
prueba"); JPanel panel principal = nuevo especial, aunque es posible que
JPanel(); Fuente bigFont = nueva fuente ("sanserif", [Link], 24); desees consultar
MenuBar, Menu yel código de
MenuItems.
pregunta = nueva JTextArea(6,20);
[Link](verdadero);
[Link](verdadero);
[Link](bigFont);
panel [Link](qLabel);
panel [Link](qScroller);
[Link](aLabel);
[Link](aScroller);
[Link](siguienteBotón);
[Link](new NextCardListener()); JMenuBar menuBar =
nuevo JMenuBar(); JMenu fileMenu = nuevo
JMenu(“Archivo”); JMenuItem nuevoMenuItem =
nuevo JMenuItem(“Nuevo”);
450 capítulo 14
Machine Translated by Google
escribir archivos
La clase [Link]
¡Una dirección NO es lo
1 Crear un objeto Archivo que represente un mismo que la casa
archivo existente real! Un objeto Archivo
es como una dirección
Archivo f = nuevo archivo ("MiCó[Link]");
postal... representa el
nombre y la ubicación
de un archivo en particular,
2 Crea un nuevo directorio
pero no es el archivo en sí.
Directorio de archivo = nuevo archivo
("Capítulo 7"); [Link]();
destino
leyendo archivos
¿Cuánto es 2 + 2?/4
¿Cuánto es 20+22/42?
clase LeerArchivo {
público estático vacío principal (String[] args) {
Un FileReader es un flujo de conexión para
intentar { caracteres, que se conecta a un archivo de texto.
Archivo miArchivo = nuevo Archivo(“[Link]”);
FileReader fileReader = nuevo FileReader(miArchivo);
454 capítulo 14
Machine Translated by Google
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
vacío público ir () {
[Link](verdadero);
[Link](falso);
[Link](siguienteBotón);
[Link](new NextCardListener());
} // cerrar ir
456 capítulo 14
Machine Translated by Google
} demás {
// ¡no hay más cartas!
[Link](“Esa fue la última tarjeta”);
[Link](falso);
}
}
}
}
tarjeta vacía privada (String lineToParse) { Cada línea de texto corresponde a una
Cadena[] resultado = [Link](“/”); única tarjeta didáctica, pero tenemos que
Tarjeta QuizCard = nueva QuizCard(resultado[0], resultado[1]);
analizar la pregunta y la respuesta como
[Link](tarjeta);
partes separadas. Usamos el método String
[Link](“hizo una tarjeta”);
}
split() para dividir la línea en dos tokens (uno
para la pregunta y otro para la respuesta).
showNextCard privado vacío () { Veremos el método split() en la página siguiente.
tarjetaactual = [Link](currentCardIndex);
currentCardIndex++;
[Link]([Link]());
[Link](“Mostrar respuesta”);
isShowAnswer = verdadero;
}
} // cerrar clase
usted está aquí 457
Machine Translated by Google
verde
Cadena[] resultado = [Link](“/”); El método split() toma el “/” y lo usa para dividir
la cadena en (en este caso) dos partes. (Nota:
para (token de cadena: resultado) {
split() es MUCHO más poderoso que para lo que
[Link](token); lo usamos aquí. Puede realizar un análisis
extremadamente complejo con filtros, comodines, etc.)
}
Recorra la matriz e imprima cada ficha
(pieza). En este
ejemplo, sólo hay dos
fichas: "¿Qué es azul + amarillo?" y verde".
458 capítulo 14
Machine Translated by Google
no existen
Preguntas tontas
hazlo pegado
PUNTOS DE VIÑETA
eficiencia.
eficiencia.
guardar objetos
clase de perro
D oh gramo b j mi C t
oh
clase de perro
5 ¡¡ La serailización falla!!
La JVM dice: "no se puede
enseñar código nuevo a un perro viejo".
460 capítulo 14
Machine Translated by Google
Usando el serialVersionUID
5849794470654667210L;
Código Cocina
462 capítulo 14
Machine Translated by Google
Serializando un patrón
intentar {
FileOutputStream fileStream = nuevo FileOutputStream (nuevo archivo ("[Link]"));
ObjectOutputStream os = nuevo ObjectOutputStream(fileStream);
[Link] (estado de casilla de verificación);
} captura (Excepción ex) { Esta parte es pan comido. ¡Simplemente
[Link](); escriba/serialice la matriz
booleana!
}
} // cerrar método
} // cerrar clase interna
deserializar el patrón
Restaurando un patrón
Esta es otra clase interna
dentro de la clase BeatBox.
[Link]();
Ahora detenga lo que se esté reproduciendo
buildTrackAndStart();
actualmente y reconstruya la secuencia usando
el nuevo estado de las casillas de verificación en ArrayList.
} // cerrar método
} // cerrar clase interna
Afila tu lápiz
464 capítulo 14
Machine Translated by Google
Objeto Sí No ______________________________________
Cadena Sí No ______________________________________
Archivo Sí No ______________________________________
Fecha Sí No ______________________________________
Marco J Sí No ______________________________________
Entero Sí No ______________________________________
Sistema Sí No ______________________________________
466 capítulo 14
Machine Translated by Google
[Link]();
[Link]();
[Link]([Link]()+[Link]()+[Link]());
privado corto z = 5;
largo getY() {
clase Prueba de mazmorra {
devolver y;
[Link]();
importar [Link].*;
[Link](d);
} captura (Excepción e) {
d = (DungeonGame) [Link]();
ObjectOutputStream(fos); [Link](d);
% java MazmorraPrueba 12
8
público estático vacío principal (String [] argumentos) {
soluciones de ejercicio
FALSO
FALSO
Verdadero
FALSO
Verdadero
FALSO
FALSO
FALSO
FALSO
Verdadero
Verdadero
Verdadero
FALSO
FALSO
Verdadero
FALSO
FALSO
468 capítulo 14
Machine Translated by Google
importar [Link].*;
}
}
% java MazmorraPrueba 12
}
[Link]([Link]() + [Link]() + [Link]());
}
}
15 redes e hilos
Escriba un mensaje
skyler4: rápido y original, bueno para y presione el botón enviar
secuencia 12
para enviar su mensaje.
Y tu ritmo actual
evster2: como skyler2, pero más
Roble plegable patrón
skyler5: ¡DESEAS! demasiado alegre
intelectualmente
estimulantes. Cada se envía a todos.
participantes del mensaje.
Envía tu mensaje al servidor
472 capítulo 15
Machine Translated by Google
redes e hilos
¿Por qué
estoy aquí? No
esperes que
YO responda eso.
Cliente B
Cliente C
Cómo funciona:
1 cliente se conecta al servidor Esperando
Servidor, me gustaría
solicitudes de clientes
conectarme al servicio de chat.
Cliente A
Servidor
Participantes:
2 El servidor realiza una Bien, estás dentro. 1. Cliente A
conexión y agrega el cliente a la
Cliente A Servidor
lista de participantes.
Servidor, me gustaría
¿Por qué estoy aquí?
No esperes que
conectarme al servicio de chat. Participantes:
YO responda
1. Cliente A
3 Otro cliente se conecta eso. Entonces, ¿por qué estoy
Cliente B Servidor
Cliente A
participantes (incluido el remitente original) Servidor
Cliente B
conexiones de enchufe
1 conectar
El cliente se conecta al servidor
estableciendo una conexión Socket .
servidor de chat
Realice una conexión de socket
en [Link],
a [Link] en el puerto 5000
puerto 5000
Cliente A Servidor
2 enviar
El cliente envía un mensaje al servidor.
Máquina
[Link](unMensaje) servidor en
[Link]
Cliente A Servidor
3 recibir
El cliente recibe un mensaje del servidor.
Servidor
Cadena s = [Link]() máquina en
[Link]
Cliente A Servidor
474 capítulo 15
Machine Translated by Google
redes e hilos
dirección IP y número
de puerto TCP.
Cliente Servidor
puertos conocidos
20 23 25
37 Tiempo
Servidor
443 110 80
Los números de
puerto TCP del 0 al 1023
están reservados para
servicios conocidos. ¡No los
estamos escribiendo
usa el puerto 5000.
Simplemente elegimos un
número entre 1024 y 65535.
476 capítulo 15
Machine Translated by Google
redes e hilos
no existen
Preguntas tontas
“Mercado de Flatirons”
“Tienda de CD de Bob”
Barra cerebral
cerebro
con barra
¿Cómo se programa de
hablan servidor de chat
realmente estos dos?
Cliente Servidor
otras palabras, el
[Link]
puedo usar es la dirección IP de “localhost”, en
este código ejecuta en. Tu
esto
servidor en un cuando
único, estás probando tu cliente y
máquina independiente.
2 Haga un InputStreamReader encadenado al flujo de entrada
(conexión) de bajo nivel del Socket
Flujo InputStreamReader = nuevo InputStreamReader([Link]());
Encadene BufferedReader al
InputStreamReader (que estaba encadenado al flujo de
3 ¡ Crea un BufferedReader y lee! conexión de bajo nivel que obtuvimos del Socket).
fuente
destino caracteres almacenados en buffer convertidos en personajes bytes del servidor
datos sobre el
caracteres
caracteres 011010011 servidor
almacenados en buffer encadenado a encadenado a
478 capítulo 15
Machine Translated by Google
redes e hilos
destino
fuente
caracteres bytes al servidor
servidor de chat
"mensaje..."
011010011 programa
encadenado a
escribiendo a un cliente
Ese tono de
verde realmente no
te funciona...
1 conectar
El cliente se conecta al servidor y obtiene un flujo de entrada
de él
[Link]()
Cliente Servidor
2 leer
El cliente lee un mensaje del servidor.
servidor de asesoramiento
Servidor
Cliente A
480 capítulo 15
Machine Translated by Google
redes e hilos
DailyAdviceCódigo de cliente
Este programa crea un Socket, crea un BufferedReader (con la ayuda de otras
secuencias) y lee una sola línea de la aplicación del servidor (lo que sea que
se esté ejecutando en el puerto 4242).
importar [Link].*;
muchas cosas pueden salir mal aquí ejecuta este código. (El 'host local')
intentar {
[Link]();
}
[Link]();
}
conexiones de enchufe
Afila tu lápiz
fuente
destino
Afila tu lápiz
482 capítulo 15
Machine Translated by Google
redes e hilos
Cómo funciona:
escribiendo un servidor
String[] counselList = {“Toma bocados más pequeños”, “Ve por los jeans ajustados. No ellos no
hacerte ver gorda”, “Una palabra: inapropiado”, “Sólo por hoy, sé honesto. Dile a tu jefe lo que *realmente* piensas”, “Quizás quieras
reconsiderar ese corte de pelo”.};
vacío público ir () {
ServerSocket hace que esta aplicación
intentar {
deelservidor
en "escuche"
puerto 4242 en el las solicitudes de los clientes
ServerSocket serverSock = nuevo ServerSocket(4242); la maquina esta
en.
código se está ejecutando
El servidor entra en un bucle permanente,
esperando (y atendiendo) las solicitudes de los clientes.
mientras (verdadero) { el método de aceptación se bloquea (simplemente permanece
allí) hasta que llega una solicitud, y luego el método devuelve un
Calcetín de enchufe = [Link](); Socket (en algún puerto anónimo) para comunicarse con el cliente
484 capítulo 15
Machine Translated by Google
redes e hilos
PUNTOS DE VIÑETA
Los servidores utilizan un ServerSocket que espera las solicitudes de los clientes
JTextField saliente;
Escritor impresor;
calcetín;
vacío público ir () {
// crea una interfaz gráfica de usuario y registra un oyente con el botón enviar
// llama al método setUpNetworking()
}
486 capítulo 15
Machine Translated by Google
redes e hilos
importar [Link].*;
importar [Link].*; importaciones para las transmisiones
importar [Link].*; ([Link]), Socket ([Link]) y la GUI
importar [Link].*; cosa
importar [Link].*;
JTextField saliente;
Escritor impresor;
calcetín;
vacío público ir () {
JFrame frame = new JFrame(“Cliente de chat ridículamente simple”);
JPanel panel principal = nuevo JPanel();
saliente = nuevo JTextField(20);
cree la GUI, nada nuevo
JButton sendButton = nuevo JButton(“Enviar”);
aquí y nada relacionado
[Link](nuevo SendButtonListener()); [Link](saliente);
con redes o E/S.
[Link](enviarBotón);
[Link]().add([Link], mainPanel);
configurarRedes();
[Link](400,500);
[Link] (verdadero);
} // cerrar ir Estamos usando localhost
para que puedas probar el
setUpNetworking vacío privado() { intentar { cliente y el servidor en una máquina.
calcetín = nuevo enchufe ("[Link]", 5000); escritor = nuevo Aquí es donde creamos el Socket
PrintWriter([Link]()); [Link](“red establecida”); y el PrintWriter (se llama desde
el método go() justo antes de mostrar
} captura (IOException ex) {
la GUI de la aplicación)
[Link]();
}
} // cerrar setUpNetworking
mensaje saliente
2 Opción dos: leer algo del servidor cada vez que el usuario
envía un mensaje.
3 Opción tres: leer los mensajes tan pronto como se envían desde el servidor
488 capítulo 15
Machine Translated by Google
redes e hilos
hilos y hilo
Un Thread es una
clase Java que
representa un thread.
hilo Hilo
490 capítulo 15
Machine Translated by Google
redes e hilos
el hilo activo
Se inicia un nuevo
hilo y se convierte en el
2 main() inicia un nuevo hilo. El principal hilo activo.
El hilo se congela temporalmente mientras el nuevo
[Link]()
hilo comienza a ejecutarse.
correr( )
principal( )
Perro( ) [Link]( )
3 La JVM cambia entre el nuevo
hilo (hilo de usuario A) y el hilo principal original, principal( ) correr( )
hasta que ambos hilos se completen.
Hilo principal hilo de usuario A
lanzando un hilo
3 Iniciar el hilo
[Link]();
correr()
492 capítulo 15
Machine Translated by Google
redes e hilos
Un Runnable contiene el
Hilo
Interfaz ejecutable
clase ThreadTester {
Pase la nueva instancia Runnable al nuevo
constructor Thread. Esto le dice al hilo qué
público estático vacío principal (String[] args) { método poner en la parte inferior de la nueva pila.
En otras palabras, el primer método que
ThreadJob ejecutable = new MyRunnable();
se ejecutará el nuevo hilo.
Hilo miHilo = nuevo Hilo(threadJob);
1 miHilo .start();
No recibirá una nueva
[Link](“volver a principal”); llamada start() hilo de ejecución hasta que no
en la instancia de Thread. un hilo es
}
} seas realmente un hilo hasta que lo inicies. Antes de
eso, es sólo una instancia de Thread, como cualquier
otro objeto, pero no tendrá ningún "hilo" real.
2
1
hacer más( ) Barra cerebral
cerebro
con barra
[Link]()
ir( )
¿Cuál crees que será el resultado si ejecutas la clase
principal( )
correr( ) ThreadTester? (lo descubriremos en unas pocas páginas)
Hilo principal
nuevo hilo
494 capítulo 15
Machine Translated by Google
redes e hilos
"¿Puedo
agrandar
"Estoy esperando eso para ti?"
"¡Estoy listo para irme!"
comenzar".
EJECUTABLE CORRER
oportunidad.
OBSTRUIDO
Enviado a un estado temporal
no ejecutable hasta que
496 capítulo 15
Machine Translated by Google
redes e hilos
El programador de hilos
El programador
de subprocesos toma
todas las decisiones
sobre quién se ejecuta
y quién no. Suele
hacer que los hilos se
turnen, muy bien.
Pero no hay garantía al
respecto. Podría dejar
que un hilo corra
hasta el contenido de su
corazón mientras
que los otros hilos "mueren de hambre
programación de hilos
clase pública MyRunnable implementa Runnable { Ventana de edición de archivos Ayuda PickMe
% java ThreadTestDrive
ejecución pública vacía() { ir();
de vuelta en principal
}
arriba de la pila
público vacío ir() { hacerMás(); % java ThreadTestDrive
arriba de la pila
}
de vuelta en principal
public void doMore()
% java ThreadTestDrive
{ [Link](“parte superior de la pila”);
} arriba de la pila
}
de vuelta en principal
% java ThreadTestDrive
498 capítulo 15
Machine Translated by Google
redes e hilos
main() inicia el nuevo El planificador envía el hilo El programador deja El nuevo hilo desaparece
hilo principal fuera de que el nuevo hilo porque se completó su
tiempo
main() inicia el nuevo El planificador envía el hilo El programador deja que el el planificador el planificador Vuelve el nuevo hilo
hilo principal fuera de nuevo hilo se ejecute por envía el nuevo selecciona el principal
al estado de ejecución e
ejecución y vuelve a ser un tiempo, no lo hilo de nuevo a hilo para ser el hilo
imprime "la parte superior
ejecutable, de modo que suficiente para que se ejecutable. en ejecución de la pila".
el nuevo hilo puede complete el método run(). nuevamente. Principal
Hilo principal Hilo principal nuevo hilo nuevo hilo Hilo principal nuevo hilo
tiempo
conexiones de enchufe
no existen
Preguntas tontas
PUNTOS DE VIÑETA
500 capitulo 15
Machine Translated by Google
redes e hilos
Cuando el subproceso se
usando [Link]()
% java ThreadTestDrive
de vuelta en principal
arriba de la pila
% java ThreadTestDrive
de vuelta en principal
arriba de la pila
% java ThreadTestDrive
de vuelta en principal
arriba de la pila
% java ThreadTestDrive
de vuelta en principal
arriba de la pila
}
}
502 capítulo 15
Machine Translated by Google
redes e hilos
504 capítulo 15
Machine Translated by Google
redes e hilos
Matrimonio en problemas.
¿Podrá salvarse esta pareja?
A continuación, en un programa muy especial del Dr. Steve
Hoy tenemos una historia que se centra en las dos razones principales por las que las
parejas se separan: las finanzas y el sueño.
Ryan necesitaba $50, así que revisó el saldo de la cuenta y vio que
eran $100. Ningún problema. Entonces, planea retirar el Ryan se queda
dinero. ¡Pero primero se queda dormido! dormido después de
comprobar el saldo
Y ahí es donde I Entra mientras Ryan todavía duerme y quiere
pero antes de realizar el
ahora I retirar $100. Reviso el saldo y son $100 (porque Ryan
retiro. Al despertar,
todavía está dormido y aún no ha hecho su retiro), así que creo que inmediatamente
no hay problema. Entonces hago el retiro y nuevamente no hay realiza el retiro sin volver a consultar el saldo.
problema. Pero entonces Ryan se despierta, completa el retiro y ¡de repente
su
estamos en descubierto! Ni siquiera sabía que se había quedado dormido, así
que siguió adelante y completó su transacción sin volver a verificar el saldo. Tienes
que ayudarnos Dr.
¡Steve!
Cuenta bancaria
saldo interno
obtenerSaldo() RyanAndMonicaJob
retirar() Cuenta bancaria
correr()
hacerRetiro()
506 capítulo 15
Machine Translated by Google
redes e hilos
demás {
[Link](“Lo siento, no es suficiente para” + [Link]().getName());
}
} Colocamos un montón de declaraciones impresas para que
} podamos ver lo que sucede mientras se ejecuta.
mónica se va a dormir
Aquí hay un escenario:
Ryan se despertó.
Ryan completa la retirada Ryan comprueba el saldo, ve que hay
Ryan está a punto de retirarse suficiente dinero y luego se queda dormido.
ryan se va a dormir
Mónica se despertó. Mientras tanto, entra Mónica y consulta el saldo. Ella
Mónica completa el retiro. también ve que hay suficiente dinero. No tiene idea
Mónica está a punto de retirarse. de que Ryan se despertará y completará un
retiro.
mónica se va a dormir
Ryan se despertó.
Ryan completa la retirada Mónica se queda dormida.
Ryan se despertó.
Ryan completa la retirada Se debe impedir que Monica ingrese a la cuenta
¿Cómo ¡Girado en descubierto! hasta que Ryan se despierte y finalice su transacción.
pasó esto? Y viceversa.
Lo siento, no es suficiente para Ryan.
¡Girado en descubierto!
508 capítulo 15
Machine Translated by Google
redes e hilos
Cuando Ryan
2 Cuando Ryan quiere acceder al banco quiere acceder a la cuenta,
cuenta (para consultar el saldo y retirar dinero),
cierra la cerradura y
cierra la cerradura y se guarda la llave en el toma la llave.
bolsillo. Ahora nadie más podrá acceder a la
cuenta, ya que la clave ya no existe.
usando sincronizado
La palabra clave
sincronizada significa que un
hilo necesita una clave para
acceder al código sincronizado.
sincronizado
(Nota para los lectores expertos en física: sí, la convención de usar la palabra "atómica" aquí no refleja todo el asunto
de las partículas subatómicas. Piense en Newton, no en Einstein, cuando escuche la palabra "atómica" en el
contexto de hilos o Oye, no es NUESTRA convención. Si NOSOTROS estuviéramos a cargo, aplicaríamos el
Principio de Incertidumbre de Heisenberg a prácticamente todo lo relacionado con subprocesos).
510 capítulo 15
Machine Translated by Google
redes e hilos
Oye, el método
takeMoney() de este objeto
está sincronizado. Necesito
obtener la clave de este objeto
antes de poder entrar...
Pero si un objeto
tiene métodos
sincronizados, un hilo puede
ingresar a uno de los métodos
sincronizados SÓLO si la clave
para el bloqueo del objeto
está disponible. En otras
palabras, sólo si otro hilo aún no ha tomado
la sincronización importa
int i = saldo;
saldo = i + 1;
saldo++;
saldo privado;
cada hilo se ejecuta 50 veces,
ejecución pública vacía() { incrementando el equilibrio en
para(int i = 0; i < 50; i++) { cada iteración
incremento();
[Link](“el saldo es” + saldo);
}
}
512 capítulo 15
Machine Translated by Google
redes e hilos
B
Ahora el saldo es 2.
métodos de sincronización
¡Sincronízalo!
no existen
Preguntas tontas
B
doStuff() no necesita
sincronizarse, por lo que
no sincronizamos todo el método.
vacío público ir () {
hacer cosas();
sincronizado (esto) {
Cosas críticas();
másCosasCríticas();
}
}
514 capítulo 15
Machine Translated by Google
redes e hilos
El método está sincronizado, así que obtenga la clave para este objeto.
Coloque el valor del saldo en la variable i.
A Devuelve la llave.
[continúa corriendo...]
Todo lo que se
necesita para llegar a un
punto muerto son dos
objetos y dos hilos.
foo
AB
bar
A foo
B clave.
A método sincronizado en la barra
516 capítulo 15
Machine Translated by Google
redes e hilos
PUNTOS DE VIÑETA
Puede usar sleep() para asegurarse de que todos los subprocesos tengan la
oportunidad de ejecutarse, aunque no hay garantía de que cuando un subproceso se
active vaya al final de la línea ejecutable. Podría, por ejemplo, volver al frente.
En la mayoría de los casos, todo lo que necesita son llamadas a sleep() en el momento adecuado para
Puedes nombrar un hilo usando el (otra sorpresa más) método setName(). Todos los
subprocesos obtienen un nombre predeterminado, pero darles un nombre explícito puede
ayudarle a realizar un seguimiento de los subprocesos, especialmente si está depurando
con declaraciones impresas.
Puede tener serios problemas con los subprocesos si dos o más subprocesos tienen
acceso al mismo objeto en el montón.
Dos o más subprocesos que acceden al mismo objeto pueden provocar daños
en los datos si un subproceso, por ejemplo, deja el estado de ejecución mientras aún
está manipulando el estado crítico de un objeto.
Para que sus objetos sean seguros para subprocesos, decida qué declaraciones
deben tratarse como un proceso atómico. En otras palabras, decida qué métodos
deben ejecutarse hasta su finalización antes de que otro hilo ingrese el mismo método
en el mismo objeto.
Cada objeto tiene una única cerradura, con una única llave para esa cerradura. La
mayoría de las veces no nos importa ese candado; Los bloqueos entran en juego
sólo cuando un objeto tiene métodos sincronizados.
Incluso si un objeto tiene más de un método sincronizado, todavía hay una sola clave.
Una vez que cualquier hilo ha ingresado un método sincronizado en ese objeto, ningún
hilo puede ingresar ningún otro método sincronizado en el mismo objeto. Esta
restricción le permite proteger sus datos sincronizando cualquier método que manipule
los datos.
JTextArea entrante;
JTextField saliente;
Lector BufferedReader;
Escritor impresor;
calcetín;
} // cerrar ir
518 capítulo 15
Machine Translated by Google
redes e hilos
intentar {
calcetín = nuevo enchufe ("[Link]", 5000);
InputStreamReader streamReader = nuevo InputStreamReader([Link]());
lector = nuevo BufferedReader(streamReader);
escritor = nuevo PrintWriter([Link]()); [Link](“red
establecida”);
Estamos usando el socket para obtener los
} captura (IOException ex) {
flujos de entrada y salida. Ya estábamos
[Link]();
} usando el flujo de salida para enviar al
} // cerrar setUpNetworking servidor, pero ahora estamos usando el
flujo de entrada para que el nuevo hilo
'lector' pueda recibir mensajes del servidor.
Cliente ArrayListOutputStreams;
} // cerrar mientras
} catch(Excepción ex) {[Link]();}
} // cerrar ejecución } //
cerrar clase interna
520 capítulo 15
Machine Translated by Google
redes e hilos
while(true) { Socket
clientSocket = [Link](); Escritor PrintWriter = new
PrintWriter([Link]()); [Link](escritor);
} catch(Excepción ex)
{ [Link]();
}
} // cerrar ir
[Link]();
}
} // terminar mientras
preguntas de sincronización
no existen
Preguntas tontas
522 capítulo 15
Machine Translated by Google
redes e hilos
presionas
"mándalo"
Andy: ritmo #2
reproducirlo.
clase acumulada {
clase HiloDos
524 capítulo 15
Machine Translated by Google
redes e hilos
Acumular a = [Link]();
[Link](50);
Acumular a = [Link]();
[Link](1); [Link](50);
[Link](1000);
público int getCount() { devolver un;
[Link](“uno “+[Link]());
contador de actualización vacío público (int agregar) {
intentar {
ejecución pública vacía() { acumulación privada() { } ThreadOne t1 = nuevo ThreadOne();
soluciones de ejercicio
[Link]();
[Link]();
Los subprocesos de dos clases diferentes están
} actualizando el mismo objeto en una tercera clase,
crear una instancia estática
} porque ambos subprocesos acceden a una única instancia de Accum.
de la clase Accum La línea de código:
intentar { }
[Link](“uno “+[Link]());
526 capítulo 15
Machine Translated by Google
redes e hilos
Cinco minutos La reunión de esta mañana se centró en los sistemas de control de las esclusas de aire del orbitador.
Misterio A medida que las fases finales de construcción estaban llegando a su fin, el número de caminatas espaciales fue
Estaba previsto que aumentara dramáticamente, y el tráfico era alto tanto dentro como fuera del barco.
esclusas de aire. "Buenos días Sarah", dijo Tom, "tu momento es perfecto, apenas estamos comenzando la
revisión detallada del diseño".
“Como todos saben”, dijo Tom, “cada esclusa de aire está equipada con terminales GUI resistentes al
espacio, tanto por dentro como por fuera. Siempre que los caminantes espaciales entren o salgan del orbitador
Utilizarán estas terminales para iniciar las secuencias de las esclusas de aire”. Sarah asintió, "Tom,
¿puedes decirnos cuáles son las secuencias de métodos para entrar y salir?" Tom se levantó y flotó hacia
la pizarra. "Primero, aquí está el pseudocódigo del método de secuencia de salida", escribió rápidamente Tom
en la pizarra.
orbitadorAirlockExitSequence()
verificarEstadoPortal();
presurizarAirlock();
openInnerHatch();
confirmarAirlockOccupied();
cerrarInnerHatch();
descomprimirAirlock();
openOuterHatch();
confirmarAirlockVacated();
cerrarOuterHatch();
"Para garantizar que la secuencia no se interrumpa, hemos sincronizado todos los métodos llamados
por el método orbiterAirlockExitSequence()", explicó Tom. "¡Odiaríamos ver a un caminante espacial que regresa y
atrapa sin darse cuenta a un amigo con los pantalones espaciales bajados!"
Todos se rieron entre dientes mientras Tom borraba la pizarra, pero algo no le parecía bien a Sarah y
finalmente hizo clic cuando Tom comenzó a escribir el pseudocódigo de la secuencia de entrada en la pizarra.
“¡Espera un momento, Tom!”, gritó Sarah, “Creo que tenemos un gran defecto en el diseño de la secuencia de
salida, volvamos a revisarlo, ¡podría ser crítico!”
orbitadorEsclusa de aireSalidaSecuencia
orbita
erAirlockExitSequence( )
528 capítulo 15
Machine Translated by Google
16 colecciones y genéricos.
Lista de [Link]
Desafío #1
Luna Rosa/Nick Drake Ordenar las canciones en orden alfabético.
Salto mortal/Cero 7
Shiva Luna/Prem Joshua
Círculos/BT
Canal profundo/celtas afro
Pasajero/mezcla principal
Escuchar/Tahití 80
530 capítulo 16
Machine Translated by Google
[Link](lista de canciones);
}
532 capítulo 16
Machine Translated by Google
HashMap
LinkedList
Diseñado para brindar un mejor rendimiento al insertar o eliminar
elementos del medio de la colección. (En la práctica, lo que
normalmente sigue siendo una ArrayList).
Conjunto de hash
LinkedHashMap
[Link]()
[Link]
reemplazar todo booleano estático público ( lista de lista, objeto oldVal, objeto newVal)
534 capítulo 16
Machine Translated by Google
void getCanciones() {
intentar {
Archivo archivo = nuevo archivo ("[Link]");
Lector BufferedReader = nuevo BufferedReader (nuevo FileReader (archivo));
Línea de cadena = nula;
mientras ((línea= [Link]()) != nulo) {
agregarCanción(línea);
}
%java Jukebox1
ListadecancionesMá[Link]
536 capítulo 16
Machine Translated by Google
importar [Link].*;
Cambie a una ArrayList de
importar [Link].*;
objetos Song en lugar de String.
clase pública Jukebox3 {
[Link](lista de canciones);
[Link](lista de canciones);
[Link](lista de canciones);
}
void getCanciones() {
intentar {
Archivo archivo = nuevo archivo ("[Link]");
Lector BufferedReader = nuevo BufferedReader (nuevo FileReader (archivo));
Línea de cadena = nula;
mientras ((línea= [Link]()) != nulo) {
agregarCanción(línea);
}
} captura (Excepción ex) {
[Link]();
}
}
las cuatro piezas de información en la canción para esta línea), luego archivo
[Link]()
¡No se compilará!
%javac [Link]
[Link]: no se puede encontrar el símbolo
símbolo: método sort([Link]<Song>) ubicación: clase
[Link] [Link](songList);
^
1 error
538 capítulo 16
Machine Translated by Google
tipos genéricos
CON genéricos
540 capítulo 16
Machine Translated by Google
Aprender genéricos
clases genéricas
// más código
}
542 capítulo 16
Machine Translated by Google
ESTE código:
Significa ArrayList:
métodos genéricos
544 capítulo 16
Machine Translated by Google
Esto todavía no
explica por qué el método de
clasificación falló en una ArrayList de
canciones pero funcionó para una
ArrayList de cadenas...
% javac [Link]
[Link]: no se puede encontrar el símbolo
símbolo: método sort([Link]<Song>)
ubicación: clase [Link]
[Link](lista de canciones);
^
1 error
importar [Link].*;
importar [Link].*;
} void getCanciones() {
intentar {
Archivo archivo = nuevo archivo ("[Link]");
Lector BufferedReader = nuevo BufferedReader (nuevo FileReader (archivo));
Línea de cadena = nula;
mientras ((línea= [Link]()) != nulo) {
agregarCanción(línea);
}
} captura (Excepción ex) {
[Link]();
}
}
void addSong(String lineToParse) {
String[] tokens = [Link](“/”);
Canción nextSong = nueva canción(tokens[0], tokens[1], tokens[2], tokens[3]);
[Link](siguienteCanción);
}
}
546 capítulo 16
Machine Translated by Google
La canción NO es un subtipo de
Comparable, por lo que no puede ordenar() la
lista de canciones.
Al menos no todavía...
public static <T extiende Comparable<? super T>> clasificación vacía (lista <T> lista)
el método ordenar()
En genérico, "extiende"
significa "extiende o implementa"
public static <T extiende Comparable<? super T>> clasificación vacía (lista <T> lista)
548 capítulo 16
Machine Translated by Google
Afila tu lápiz
Devoluciones:
la interfaz comparable
} %java Jukebox3
550 capítulo 16
Machine Translated by Google
Si pasa un Comparador al
método sort(), el orden de
clasificación lo determina el
Comparador en lugar del propio
método compareTo() del elemento.
552 capítulo 16
Machine Translated by Google
importar [Link].*;
importar [Link].*;
public void go() { getSongs(); artista) hagan la comparación real, ya que las cadenas
ya saben cómo ordenarse alfabéticamente.
[Link](lista de canciones);
[Link](lista de canciones);
[Link](lista de canciones);
Cree una instancia de la clase
interna Comparator.
ArtistCompare artistaCompare = nuevo ArtistCompare(); [Link](lista
de canciones, comparación de artistas);
Invoque sort(), pasándole la lista
[Link](lista de canciones); y una referencia al nuevo
}
objeto Comparador personalizado.
void getCanciones() {
// código de E/S aquí
}
ejercicio de colecciones
importar __________________;
Afila tu lápiz
clase pública OrdenarMontañas {
_________________________________; [Link](“por
nombre:\n” + mtn); Comparación de alturas hc = nueva Comparación de
alturas();
_________________________________; [Link](“por
altura:\n” + mtn);
}
}
clase montaña {
__________________;
_________________;
Ayuda de la ventana de edición de archivos ThisOne'sForBob
%java OrdenarMontañas
______________________ {
como se ingresó:
_________________;
[Largos 14255, Elbert 14433, Granate 14156, Castillo 14265]
_________________;
por nombre:
}
554 capítulo 16
Machine Translated by Google
Afila tu lápiz
Respuestas posibles:
comparador,
Comparable,
comparar con( ),
comparar( ),
Sí,
No
[Link](myArrayList);
miListaArray
miListaArray
miListaArray
Comparador Comparable
[Link](myArrayList, myCompare);
miListaArray Comparable
miListaArray Comparador
miListaArray Comparable
miListaArray Comparador
miComparar
miComparar
%java Jukebox4
[Luna rosa: Nick Drake, Salto mortal: Zero 7, Shiva Moon: Prem Antes de clasificar.
Joshua, Círculos: BT, Canal profundo: Afro Celtas, Pasajero:
Headmix, Escuchar: Tahiti 80, Escuchar: Tahiti 80, Escuchar: Tahiti
80, Círculos: BT]
[Círculos: BT, Círculos: BT, Canal profundo: Afro Celts, Escuche: Después de ordenar
Tahití 80, Escuchar: Tahití 80, Escuchar: Tahití 80, Pasajero: usando el método
Mezcla de cabeza, Pink Moon: Nick Drake, Shiva Moon: Prem Joshua, compareTo() propio de la
Salto mortal: Zero 7] canción (ordenar por título).
ListadecancionesMá[Link]
556 capítulo 16
Machine Translated by Google
Duplicados OK.
la API de colecciones
Recopilación
(interfaz)
Colocar Lista
(interfaz) (interfaz)
Conjunto ordenado
(interfaz)
LLAVE
Mapa ordenado
(interfaz)
558 capítulo 16
Machine Translated by Google
importar [Link].*;
importar [Link].*;
vacío público ir () {
No cambiamos getSongs(), por lo que todavía coloca las canciones en una ArrayList
getCanciones();
[Link](lista de canciones);
Aquí creamos un nuevo HashSet
[Link](lista de canciones);
parametrizado para contener canciones.
[Link](lista de canciones);
%java Jukebox6
Antes de
ordenar ArrayList.
[Luna rosa, salto mortal, luna de Shiva, círculos, canal profundo,
Pasajero, Escucha, Escucha, Escucha, Círculos]
Después de
[Círculos, Círculos, Canal Profundo, Escuchar, Escuchar, Escuchar, ordenar ArrayList
Pasajero, Luna Rosa, Luna Shiva, Salto Voltereta] (por título).
igualdad de objetos
¿Qué hace que dos objetos sean iguales? Si dos objetos son foo y bar son
iguales y [Link](barra) foo debe ser
verdadero, ambos devuelven el bar debe
mismo valor de
código hash(). Para un set para tratar
dos objetos como duplicados, debes anular los
métodos hashCode() y equals() heredados de
la clase Object, para que puedas hacer que dos
objetos diferentes se vean como iguales.
Igualdad de referencia
Dos referencias, un objeto en el montón.
Igualdad de objetos
título: Círculos
Dos referencias, dos objetos en el montón, pero
código hash: 254
los objetos se consideran significativamente equivalentes.
Si desea tratar dos objetos Song diferentes como iguales (por ejemplo, título: Círculos
si decide que dos canciones son iguales si tienen variables de título código hash: 254
foo
coincidentes ), debe anular los métodos hashCode() y equals() heredados de
la clase Object.
Canción
Como dijimos anteriormente, si no anula hashCode(), el comportamiento
predeterminado (de Objeto) es darle a cada objeto un valor de código hash bar
560 capítulo 16
Machine Translated by Google
foo
742
Canción
Conjunto de hash
código hash()
bar
Objeto que ya está
título: Círculos EN el HashSet.
Canción 742 Código hash: 742
Canción
Conjunto de hash
bar
Objeto que ya está EN
título: Círculos el HashSet.
Canción Código hash: 742
}
%java Jukebox6
public String getArtist() { devolver artista;
562 capítulo 16
Machine Translated by Google
no existen
Preguntas tontas
Ley de objetos de Java para HashCode()
y es igual a()
El comportamiento predeterminado de
hashCode() es generar un número entero único para
cada objeto en el montón. Entonces, si no anula hashCode()
en una clase, dos objetos de ese tipo NUNCA podrán
considerarse iguales.
TreeSets y clasificación
importar [Link].*;
importar [Link].*;
clase pública Jukebox8 {
ArrayList<Canción> lista de canciones = nueva ArrayList<Canción>();
valor int;
564 capítulo 16
Machine Translated by Google
vacío público ir () {
Libro b1 = nuevo libro ("Cómo funcionan los gatos");
Libro b2 = nuevo Libro(“Remix your Body”);
Libro b3 = nuevo libro ("Buscando a Emo");
}
}
Libro de clase {
Título de cadena;
Libro público (Cadena t) { título = t;
}
}
ordenados y, una vez más, ¡no tenía idea de público int comparar con (Objeto b) {
Libro libro = (Libro) b;
cómo ordenar los objetos del Libro! No falla
return (tí[Link](libro.título));
en tiempo de compilación, porque el método
}
TreeSet add() no toma un tipo Comparable. }
El método TreeSet add() toma el tipo que usó
cuando creó el TreeSet. En otras palabras, si
dice new TreeSet<Book>() el método add() es
esencialmente add(Book). ¡Y no es necesario
que la clase Libro implemente Comparable!
Pero falla en tiempo de ejecución cuando agrega el segundo elemento al conjunto.
Esa es la primera vez que el conjunto intenta llamar a
}
}
566 capítulo 16
Machine Translated by Google
valor
Cada elemento en un mapa es en realidad
DOS objetos: a y a llave .
Puedes tener duplicado valoresvalores
, pero
“Bola” “Pez” “Bola3”
“Bola1” “Bola2” “Coche”
“Bola4”
llave
NO duplicado llaves .
Mapa
Ejemplo de mapa
importar [Link].*;
HashMap necesita DOS parámetros de tipo:
uno
mapa de prueba de clase pública { para la clave y otro para el valor.
[Link](puntuaciones);
[Link]([Link](“Bert”));
} El método get() toma una clave y devuelve
} el valor (en este caso, un número entero).
tipos genéricos
vacío foo(Animal[] a) { }
public void takeAnimals(Animal[] animales) { El punto crucial es que el método takeAnimals() puede
para(Animal a: animales) {
tomar un Animal[] o un Perro[], ya que Perro ESUN Animal.
[Link](); Polimorfismo en acción.
}
Recuerde, podemos llamar SÓLO a los métodos declarados en tipo animal, ya
}
} que el parámetro animales es de tipo Matriz animal y no hicimos ningún
casting. (¿A qué lo lanzaríamos?
Esa matriz podría contener tanto perros como gatos).
[Link](“comer animales”);
}
}
clase Perro extiende Animal {
corteza vacía() { }
La jerarquía de clases Animal simplificada.
}
clase Gato extiende Animal { void miau() { }
568 capítulo 16
Machine Translated by Google
tomarAnimales(animales);
para matriz. Este es el mismo código, los animales"
}
excepto que ahora variable se refiere a ArrayList en lugar de matriz.
%java PruebaGenerics2
comer animales
comer animales
comer animales
comer animales
comer animales
comer animales
polimorfismo y genéricos
vacío público ir () {
ArrayList<Animal> animales = new ArrayList<Animal>(); [Link](nuevo Perro());
[Link](new Cat());
[Link](nuevo Perro());
tomarAnimales(animales);
}
¿Funcionará esto ahora que cambiamos de
una matriz a una ArrayList?
Cuando lo compilamos:
%java PruebaGenerics3
[Link]: tomarAnimales([Link].
Parecía tan bien,
ArrayList<Animal>) en TestGenerics3 no se puede aplicar a ([Link]<Dog>)
takeAnimals(dogs); pero salió tan mal...
^
1 error
570 capítulo 16
Machine Translated by Google
[Link](new Cat());
¡¡Ay!! Simplemente colocamos un gato en lo que
}
podría ser una ArrayList exclusiva para perros.
vacío público ir () {
Perro[] perros = {nuevo Perro(), nuevo Perro(), nuevo Perro()};
tomarAnimales(perros);
}
%java PruebaGenerics1
Excepción en el hilo "principal" [Link]: Cat
¡Uf! Al menos la
JVM lo detuvo. en [Link]([Link])
en [Link] ([Link])
en [Link]([Link])
572 capítulo 16
Machine Translated by Google
comodines genéricos
Comodines al rescate
con de la lista,
En otras palabras, puedes hacer cosas con los elementos
pero no puedes poner cosas en la lista. nuevo
Así que estás seguro en tiempo de ejecución, porque el compilador no te
permitirá hacer nada que pueda ser horrible en tiempo de ejecución.
para(Animal a: animales) {
[Link]();
}
[Link](new Cat());
574 capítulo 16
Machine Translated by Google
Este:
público <T extiende Animal> void takeThing(ArrayList<T> lista)
no existen
Preguntas tontas
576 capítulo 16
Machine Translated by Google
importar [Link].*;
devolver [Link]([Link]);
}
}
} public static void main(String [] args) { new SortMountain().go(); ¿Notaste que la lista de alturas está
en secuencia DESCENDENTE? : )
[Link](mtn, nc);
[Link](“por nombre:\n” + mtn); Comparación de
alturas hc = nueva Comparación de alturas();
[Link](mtn, hc);
[Link](“por altura:\n” + mtn);
}
}
clase montaña {
Nombre de cadena;
altura interna;
Ayuda de la ventana de edición de archivos ThisOne'sForBob
%java OrdenarMontañas
Montaña(Cadena n, int h) { como se ingresó:
nombre = n;
[Largos 14255, Elbert 14433, Granate 14156, Castillo 14265]
altura = h; por nombre:
Respuestas posibles:
comparador,
Comparable,
comparar con( ),
comparar( ),
Sí,
No
[Link](myArrayList);
miListaArray Comparable
miListaArray comparar con( )
miListaArray
Comparador Comparable Sí
[Link](myArrayList, myCompare);
miListaArray Comparable si
miListaArray Comparador si
miListaArray No comparable
miListaArray Comparador no
miComparar Comparador
miComparar comparar( )
578 capítulo 16
Machine Translated by Google
Libera tu código
Implementación de Java
Implementando su aplicación
Un programa Java es un
conjunto de clases. Ese
es el resultado de su desarrollo.
HTTP
Vista de edición de archivos
cuando hayas terminado.
RMI
servlets
Ejecutable
Frasco
Inicio web Aplicación RMI
1 locales
La aplicación completa se ejecuta en la
computadora del usuario final, como un programa
independiente, probablemente GUI,
implementado como un JAR ejecutable (veremos
el JAR en unas pocas páginas).
Barra cerebral
cerebro
con barra
3 Remoto
Toda la aplicación Java se ejecuta en un
sistema servidor, y el cliente accede al sistema a
través de algún medio que no sea Java,
probablemente un navegador web.
582 capítulo 17
Machine Translated by Google
es
Que... ?
d
d
%cd MiProyecto/fuente
%javac d ../clases MiAplicació[Link]
Mi proyecto
le dice al compilador que coloque el lo último sigue siendo el
código compilado (archivos de clase) El código compilar desde
nombre del archivo java compilado llega aquí. ESTE directorio
en el directorio “clases: que es un a compilar
directorio arriba y abajo nuevamente
desde el directorio de trabajo actual.
d clases fuente
ejecuta tu principal()
desde aquí Lorper iure
101101
eugue
%javac d ../clases *.java 101101
10101000010 tatuaje vero
consenso
1010 10 0
01010 1 eugueroLore do
%cd MiProyecto/clases
(nota de solución de problemas: todo en este capítulo supone que el
%javamini ejecuta tu programade directorio de trabajo actual (es decir, el “.”) está en su classpath. Si ha
configurado explícitamente una variable de entorno classpath,
el directorio 'clases'. asegúrese de que contenga el “.”)
584 capítulo 17
Machine Translated by Google
FRASCO
MiAplicació[Link]
el directorio "clases".
[Link]
O código (.java)
en el JAR
%jar cvmf [Link] [Link] MiAplicació[Link]
aplicació[Link]
tarro ejecutable
HTTP
Vista de edición de archivos
100% locales Combinación 100% Remoto implementan como archivos JAR ejecutables.
no existen
Preguntas tontas
586 capítulo 17
Machine Translated by Google
[Link]
[Link]
[Link]
[Link]
Los paquetes evitan conflictos de nombres de clases
[Link]
Java
neto
texto
101101 10
1001 101 10
10 10010
101 101
101 101 101 101101 10
Formato numérico
útil
101 101 101
Enchufe
101101 10
evento
101101 10 1001 101 10
1001 101 10 10 10010
10 10010 101 101
101 101 101 101 101
101 101 101
Lista de arreglo
Diseño de flujo
101101 10
1001 101 10
10 10010
101 101
101 101 101
Evento de acción
denominación de paquetes
[Link]
Nombre del paquete nombre de la clase
está en mayúscula
[Link]áfico
588 capítulo 17
Machine Translated by Google
paquete [Link];
importar [Link].*;
clases fuente
clase pública PaqueteExercise {
// código que cambia la vida aquí
}
com com
3 Configure una estructura de directorio coincidente
No basta con que su clase
decir
esté en un paquete, simplemente
colocando una declaración de paquete en el código. Su
clase no está en un paquete hastarealmente
que coloque la clase
estructura
paquete
cabezaprimerajava
[Link], usted
debe coloque el código fuente de PackageExercise en un
debe
directorio llamado headfi rstjava, que estará en un directorio
llamado com.
Lorper iure
Se trata de compilar sin hacer eso, pero créanos: no vale la
posible
101101
101101
eugue
tatuaje vero
10101000010
pena los demás problemas que tendrás. Mantenga su 1010 10 0
consenso
eugueroLore do
01010 1
eliquis do del
código fuente en una estructura de directorios que coincida 1010101
10101010
dip
ejecuta tu programa de
%cd MiProyecto/clases el directorio 'clases'.
%java [Link]
cabezaprimerajava cabezaprimerajava
590 capítulo 17
Machine Translated by Google
Mi proyecto
clases fuente
euguero
[Link]
JAR y paquetes
FRASCO
clases
Hacer un JAR ejecutable
[Link]
clases
de utilizar el nombre de clase completo.
[Link]
Cree un archivo de texto llamado [Link] que tenga
com
una sola línea:
Clase principal: [Link]
101101
10 110 1 0
[Link]
592 capítulo 17
Machine Translated by Google
skyler
es/headfirstjava/
[Link] cabezaprimerajava
[Link]
101101
10 110 1
0 11 0
001 10
001 01
[Link]
Afila tu lápiz
Mi proyecto
clases fuente
[Link]
Correr:
101101
loper
10 110 1 0
11 0 001
iure
euge
%cd ___________
10 tatuaje vero
001 01 consenso
euguero
%Java _________________________________
clase foof
[Link]
Crear un frasco
%cd ___________
%______________________________________
Ejecutar un JAR
%cd ___________
% _____________________________________
594 capítulo 17
Machine Translated by Google
no existen
Preguntas tontas
PUNTOS DE VIÑETA
Organizar sus clases en paquetes evita colisiones de nombres con otras clases, si
antepone su nombre de dominio inverso al frente del nombre de una clase.
Para poner una clase en un paquete, coloque una declaración de paquete en la parte
superior del archivo de código fuente, antes de cualquier
declaración de importación: paquete [Link];
Para estar en un paquete, una clase debe estar en una estructura de directorios que
coincida exactamente con la estructura del paquete. Para una clase,
[Link], la clase Foo debe estar en un directorio llamado Wickedlysmart,
que está en un directorio llamado com.
% java [Link]
Puede agrupar sus clases en archivos JAR (Java ARchive). JAR se basa en el formato
pkzip.
Puede crear un archivo JAR ejecutable colocando un manifiesto en el JAR que indique
qué clase tiene el método main(). Para crear un archivo de manifiesto, cree un archivo
de texto con una entrada como la siguiente (por ejemplo): Clase principal:
[Link]
Asegúrese de presionar la tecla Intro después de escribir la línea MainClass, o es posible que
Toda la estructura de directorios del paquete (y solo los directorios que coinciden con el
paquete) deben estar inmediatamente dentro del archivo JAR.
596 capítulo 17
Machine Translated by Google
Ejecutable
Inicio
InicioWeb
Web Aplicación RMI
servlets
Frasco
Servidor web
1 El cliente hace clic en el enlace de una
página web a su aplicación JWS (un archivo .jnlp). “dame [Link]” Lorper iure
hacer clic eugue
tat vero
euguero
(este NO es el JAR).
hacer clic iure
iure
euge
tatuaje vero euge
tatuaje vero
consenso
consenso
euguero
El archivo .jnlp es un documento XML que euguero
MiAplicació[Link]
indica el nombre del archivo JAR MiAplicació[Link] MiAplicació[Link]
ejecutable de la aplicación.
[Link]. euguero
MiAplicació[Link] MiAplicació[Link]
tat vero
consenso
euguero
MiAplicació[Link]
MiAplicació[Link] MiAplicació[Link]
tat vero
consenso
598 capítulo 17
Machine Translated by Google
El archivo .jnlp
<información>
<icon href=”[Link]”/>
<permitido sin conexión/> Esto significa que el usuario puede ejecutar su programa sin
estar conectado a Internet. Si el usuario no está conectado, significa
</información> que la función de actualización automática no funcionará.
<recursos>
Esto dice que tu aplicación necesita la versión 1.3.
<j2se versión=”1.3+”/> de Java, o superior.
<applicationdesc mainclass=”HolaWebStart”/>
MiAplicació[Link]
loper iure
euguero
MiAplicació[Link]
tat vero
Lorper <iure
consenso
euge euguero
tatuaje vero
consenso [Link]
MiAplicació[Link] MiAplicació[Link]
Lorper iure
eugue
su archivo .jnlp
consenso
euguero
[Link]
<HTML>
<CUERPO>
</HTML>
600 capitulo 17
Machine Translated by Google
no existen
Preguntas tontas
PUNTOS DE VIÑETA
602 capítulo 17
Machine Translated by Google
ResumenCross 7.0
soluciones de ejercicio
El navegador solicita un
archivo .jnlp del servidor web.
Verdadero
FALSO
FALSO
Verdadero
FALSO
FALSO
Verdadero
FALSO
FALSO
FALSO
Verdadero
Verdadero
Verdadero
Verdadero
FALSO
FALSO
FALSO
604 capítulo 17
Machine Translated by Google
ResumenCross 7.0
DOGTMTRANSIENTW
I BATÓMICR oh I
AJARKNSINCRONIZADO
l EBE t t GRAMO
OCHAINEDR S AHORRAR
GETG EJECUTABLECT
S mi Pensilvania AU CS
B FILTRO DE IMPLEMENTACIÓN
BRN oh I F SUDOESTE
DIRECTORIO USUARIO DE ENCHUFE
NAE t PR A
PAQUETE CLASE BUCLE PAG
R mi LTL R PAG
BYTERESTOREEXTREME
AI ES EMXR
MANIFESTACIONES CAPSULAS
Repartido
Todo el mundo dice
cuantos montones
hacer cosas()
ir vacío() {
Barra b = nueva barra(); Fohoh bj miCt
oh
[Link]();
608 capítulo 18
Machine Translated by Google
JVM
diminuto, débil,
JVM
dolorosamente lento en los cálculos
Pequeño Grande
doCalcUsingDatabase()
B
A
valor de retorno
610 capítulo 18
Machine Translated by Google
montón de servidor
montón de clientes
Smirv miC
t
iCmi ohbj
Cimi
yo Ct
t ohbj mi
norte
montón de servidor
montón de clientes
r
Cimi
yo r
mi Smir iCmihmiyopagmi S Ct
mir
viCmi ohbj mi
v
t
norte
yo
h mi
pag
Cimi
yo
miC
t
t ohbj
norte
r
El objeto cliente cree
Cimi
yo mi r Smirv iCmihmiyopagmi S Ct
t mir
viCmi ohbj mi
yopag
que está hablando norte
h mi
con el Servicio Cimi
yo
miC
t
t ohbj
norte
612 capítulo 18
Machine Translated by Google
montón de servidor
montón de clientes
hacerBigThing()
r
Cimi
yo r
mi Smirv iCmihmiyopagmi S Ct
t mir
viCmi ohbj mi
yo
norte
h mipag
Cimi
yo
miC
t
t ohbj
norte
montón de servidor
montón de clientes "El cliente quiere llamar a un método"
hacerBigThing()
r
Cimi
yo mi r Smirv iCmihmiyopagmi S Ct
t mir
viCmi ohbj mi
yopag
norte
h mi
Cimi
yo
miC
t
norte
t ohbj
montón de servidor
montón de clientes "El cliente quiere llamar a un método"
hacerBigThing()
hacerBigThing()
Recuerde, este es el objeto
con el REAL
lógica del método. El tipo
mi r
Cimi
yo
yo mi
r Smirv iCmihmi
yopag
Smirv miC
t ¡Eso hace el verdadero trabajo!
t
norte
t h mipag iCmi ohbj
Cimi
yo C
norte
t ohbj mi
montón de servidor
montón de clientes
r
Cimiyo mi r Smirv iCmihmiyopagmi S Ct
t mir
viCmi ohbj mi
yopag
norte
h mi
Cimi t
j miC
yo
t ohb
norte
614 capítulo 18
Machine Translated by Google
[Link]
%rmic MiRemoteImpl
001 10
001 01
MyRemoteImpl_Stub.clase
101101
10 110 1 0
11 0
001 10
001 01
MyRemoteImpl_Skel.clase
Paso cuatro: Ventana de edición de archivos Ayuda Bebida
terminal separada
Paso cinco:
Iniciar el servicio remoto Ayuda de la ventana de edición de archivos BeMerry
%java MiRemoteImpl
[Link]
1 Ampliar [Link]
Su interfaz debe
anunciar que es para
llamadas a métodos
interfaz pública MyRemote extiende Remote {
remotos. Una interfaz no
puede implementar nada,
pero puede ampliar otras interfaces.
2 Declarar que todos los métodos arrojan una RemoteException
3 Asegúrese de que los argumentos y los valores de retorno sean primitivos o serializables
616 capítulo 18
Machine Translated by Google
2 Extender UnicastRemoteObject
talones y esqueletos
%rmic MiRemoteImpl
MyRemoteImpl_Stub.clase
101101
10 110 1
0 11 0
001 10
001 01
MyRemoteImpl_Skel.clase
1 Abra una terminal e inicie rmiregistry. Ayuda de la ventana de edición de archivos, ¿eh?
%rmiregistro
%java MiRemoteImpl
618 capítulo 18
Machine Translated by Google
La interfaz remota:
RemoteException y la interfaz
remota están en el paquete [Link]
importar [Link].*;
Su interfaz DEBE extender
interfaz pública MyRemote extiende Remote { [Link]
Todos sus métodos remotos deben
public String sayHello() lanza RemoteException;
declarar una RemoteException
}
UnicastRemoteObject está en
obteniendo el trozo
Cliente Servidor
di hola( )
3
Skmi mit oh Smirv miC
t
St tub iCmi ohbj
yo norte
Cimi
yo Ct trozo devuelto
t ohbj mi
norte
2
1 Registro RMI (en el servidor)
buscar() Remoto
Hola
intentar {
Servicio MyRemote = (MyRemote) [Link](“rmi://[Link]/Remote Hello”);
Cadena s = [Link]();
necesitas la dirección IP o el y el nombre utilizado para
nombre de host
vincular/volver a vincular el servicio
[Link](s);
} captura (Excepción ex) {
¡Parece una llamada a un método antiguo
[Link]();
} normal! (Excepto que debe reconocer la
RemoteException)
}
}
Cliente Servidor
miC
iCmi ohbj
St tub
Cimi t
j miC
yo
t ohb
norte
St tub
No olvide que el cliente 101101
101101
10 110 1 0
101101
10 110 1 0
usa la interfaz para llamar 10 110 1 0
101101
10 110 1
11 0 001 11 0 001
11 0 001 10 001 10 001
a métodos en el código 10
001 01
0 11 0
001 10
01 01
001 01
auxiliar. La JVM del cliente
Clase MyRemoteImpl MyRemoteImpl_Stub.clase
necesita la clase stub, pero [Link] MyRemoteImpl_Stub.clase
el cliente nunca hace 101101
10 110 1 101101
0 11 0 10 110 1 0
referencia a la clase stub 101101
10 110 1
001 10
001 01
11 0
en el código. El cliente 0 11 0
001 10
001 10
001 01
001 01
siempre utiliza la MyRemoteImpl_Skel.clase
interfaz remota, como Mi clase remota
Mi clase remota
si la interfaz remota FUERA el objeto remoto real.
El servidor necesita las clases Stub y
Skeleton, así como el servicio y la
La interfaz remota.
interfaz remota. Necesita la clase stub
porque recuerde, el stub se sustituye por el
servicio real, cuando el servicio real está
vinculado al registro RMI.
622 capítulo 18
Machine Translated by Google
Afila tu lápiz
PUNTOS DE VIÑETA
Un objeto en un montón no puede obtener una referencia Su servicio remoto debería extender UnicastRemoteObject.
Java normal a un objeto en un montón diferente (lo que significa (Técnicamente, existen otras formas de crear un objeto remoto, pero
ejecutarse en una JVM diferente) extender UnicastRemoteObject es la más sencilla).
La invocación de método remoto de Java (RMI) hace que parezca que Su clase de servicio remoto debe tener un constructor, y el
estás llamando a un método en un objeto remoto (es decir, un objeto constructor debe declarar una RemoteException (porque el
en una JVM diferente), pero no es así. constructor de la superclase declara una).
Cuando un cliente llama a un método en un objeto remoto, el Se debe crear una instancia de su servicio remoto y registrar el objeto
cliente en realidad está llamando a un método en un proxy del objeto en el registro RMI.
remoto. El proxy se llama "stub".
Para registrar un servicio remoto, utilice el método
Un stub es un objeto auxiliar del cliente que se encarga de los detalles estático [Link](“Nombre del servicio”, serviceInstance);
de la red de bajo nivel (sockets, flujos, serialización, etc.)
El registro RMI debe ejecutarse en la misma máquina que el servicio
empaquetando y enviando llamadas a métodos al
remoto antes de intentar registrar un objeto remoto en el registro RMI.
servidor.
Lo usamos
para nuestro
Escuché que tu ex
nuevo y genial sistema de esposa todavía usa
apoyo a las decisiones. enchufes lisos.
Lo uso
para backends serios de
comercio electrónico Bto
Disponemos de un
sistema de reservas de
624 capítulo 18
Machine Translated by Google
Ejecutable servlets
servlets
Frasco
Inicio Web Aplicación RMI servlets
Servidor web
Navegador web
“El cliente solicita RegisterServlet”
(cliente)
101101
10 110 1
0 11 0
001 10
bob
001 01
Mascotas
kathy
Sierra
[Link]
Servidor web
Navegador web
(cliente) “El cliente solicita RegisterServlet”
101101
10 110 1
0 11 0
001 10
Gracias
001 01
kathy
Sierra
[Link]
<HTML>
[Link]
usted está aquí 625
Machine Translated by Google
Servidor web
1 Descubra dónde deben colocarse sus servlets.
servlets
101101
10 110 1
0 11 0
001 10
001 01
[Link]
[Link]
[Link]
<HTML>
MiPá[Link]
Servidor web
5 Haga que su servlet y página HTML estén disponibles para su servidor
servlets
101101
10 110 1 0
11 0 001
<HTML>
10 001
<CUERPO>
Java
01
¡normas!
<CUERPO>
<HTML>
[Link]
MiPá[Link]
626 capítulo 18
Machine Translated by Google
Anule doGet para mensajes El servidor web llama a este método y le entrega la solicitud
HTTP GET simples. del cliente (puede obtener datos de ella) y un objeto de
'respuesta' que utilizará para enviar una respuesta (una página).
public void doGet (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
Página HTML con un enlace a este servlet haga clic en el enlace Este es un servlet increíble.
para activar el
servlet
<HTML>
<CUERPO>
servlets y JSP
no existen
Preguntas tontas
PUNTOS DE VIÑETA
628 capítulo 18
Machine Translated by Google
importar [Link].*;
importar [Link].*;
importar [Link].*;
[Link](“texto/html”);
PrintWriter fuera = [Link]();
[Link]();
}
}
Código PhraseOMatic
String[] wordListThree = {“proceso”, “punto de inflexión”, “solución”, “arquitectura”, “competencia central”, “estrategia”, “mente
compartida”, “portal”, “espacio”, “visión”, “paradigma ", "misión"};
// genera tres números aleatorios para extraer palabras aleatorias de cada lista
int rand1 = (int) ([Link]() * oneLength);
int rand2 = (int) ([Link]() * twoLength);
int rand3 = (int) ([Link]() * tresLongitud);
// ahora devuélvelo
“
retorno (“Lo que necesitamos es un + frase);
}
}
630 capítulo 18
Machine Translated by Google
servidor EJB
Cliente
ESQUELETO RMI
Talón RMI
r
Smirv iCmihmiyopagmi
Cimi r anorte
mi mi
t mir r ismibmi
yo
t yopag
h mi mij t norte
B bj miC
norte
t
pag
Cimi
yo
j miC
oh
t ohb
norte
DB
un poco de jini
632 capítulo 18
Machine Translated by Google
¡Hola a todos,
estoy aquí!
Regístreme
como algo que
implemente
2 Un servicio Jini ya en ejecución en ScientificCalculator. Aquí hay un
otra máquina solicita registrarse en este objeto serializado que representa mi
servicio de búsqueda recientemente servicio. Envíaselo a quien
anunciado. Se registra por capacidad, te lo pida...
en lugar de por nombre. En otras palabras,
se registra como la interfaz de servicio que
implementa. Envía un objeto serializado para
Servicio Jini
colocarlo en el servicio de búsqueda.
¿Tiene
Servicio de búsqueda de Jini algo que
implemente
ScientificCalculator?
aplicación java
Sí, tengo
algo.
Te envío el objeto
Servicio Jini
serializado.
ahora...
aplicación java
634 capítulo 18
Machine Translated by Google
Te
registraré y
aquí tienes tu otra máquina en la
contrato de Servicio Jini
red
arrendamiento. Si no lo renuevas, te dejo.
alquiler
Hmmmm...
No obtuve una
renovación del contrato de
arrendamiento de ese... debe estar
caído. Lo dejaré. Si vuelve,
automáticamente me redescubrirá.
Cuando selecciones un
servicio, ¡aparecerá aquí!
636 capítulo 18
Machine Translated by Google
Cómo funciona:
Servidor
1 El cliente se inicia y busca Navegador de servicios
en el registro RMI el (cliente)
servicio llamado r
“ServiceServer” y
rvmi
recupera el código Smi
"Por favor
Cmi
auxiliar. dame
la Smirvi
“Servidor de servicios”
cosa
llamada
bien, aquí
está
el talón"
Talón
r
mi
rv
mi
mi S
Smirvi C
"Está bien, aquí hay una variedad de servicios"
Servidor
Navegador de servicios
(cliente)
r
mi
rv
mi
mi S
Smirvi C
Servidor
Navegador de servicios
“getService(svcseleccionado)”
(cliente)
r
mi
rv
mi
Cmi
S
Smirvi
“OK, aquí está el servicio”
Navegador de servicios
(cliente)
638 capítulo 18
Machine Translated by Google
Servidor de servicio
1 interfaz ServiceServer implementa Remote
Una interfaz remota RMI antigua y normal para el servicio remoto (el obtenerListaServicios()
servicio remoto tiene el método para obtener la lista de servicios y obtenerServicio()
devolver un servicio seleccionado).
Servicio de 4 interfaces
Ésta es la clave de todo. Esta interfaz muy sencilla tiene un solo método,
getGuiPanel(). Cada servicio que se envía al cliente debe implementar esta
interfaz. ¡Esto es lo que hace que todo sea UNIVERSAL! Al implementar esta interfaz,
un servicio puede llegar incluso aunque el cliente no tenga idea de cuál es la clase (o
clases) real que componen ese servicio. Todo lo que el cliente sabe es que, sea lo Servicio
que sea, implementa la interfaz de Servicio, por lo que DEBE tener un método
obtenerGuiPanel()
getGuiPanel().
Servicio de dados
5 clase DiceService implementa el servicio
obtenerGuiPanel()
¿Tienes dados? Si no es así, pero los necesita, utilice este servicio para lanzar entre 1 y 6 dados virtuales por usted.
importar [Link].*;
Una interfaz remota RMI normal
La interfaz pública ServiceServer extiende Remote { define los dos métodos que
tendrá el servicio remoto.
Object[] getServiceList() lanza RemoteException;
640 capítulo 18
Machine Translated by Google
Servicio público getService (Objeto serviceKey) lanza RemoteException { Servicio theService = (Servicio)
[Link] (serviceKey); devolver el Servicio;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
[Link]().add([Link], serviceList);
[Link](new MyListListener());
[Link](500,500);
[Link] (verdadero);
panel [Link]();
Aquí
el es donde
usuario agregamos el servicio real a la GUI, después del
ha seleccionado
[Link]([Link]());
uno. oyente (Este método es llamado por el evento
panel [Link]();
panel [Link]();
JComboBox). Llamamos a getService() en
en servidor remoto el
} captura (Excepción ex) { (el código auxiliar de ServiceServer) y pasarle el
[Link](); Cadena que se mostró en la lista (que es la MISMA cadena que
} obtuvimos originalmente del servidor cuando llamamos a
getServiceList()). El servidor
} devuelve el servicio real
(serializado), que se deserializa automáticamente (gracias a RMI) y
simplemente llamamos a getGuiPanel() en
el servicio y agregamos
el resultado (un JPanel) al panel principal del navegador.
642 capítulo 18
Machine Translated by Google
Objeto[] getServicesList() {
Objeto obj = nulo;
Objeto[] servicios = nulo;
Realice la búsqueda de RMI y obtenga el talón
intentar {
obj = [Link](“rmi://[Link]/ServiceServer”);
}
captura (excepción ex) {
[Link]();
}
servidor = (Servidor de servicios) obj;
Transmita el código auxiliar al tipo de interfaz remota,
para que podamos llamar a getServiceList() en él.
intentar {
servicios = [Link]();
Etiqueta JLabel;
JComboBox número de dados;
}
[Link](diceOutput);
}
}
Afila tu lápiz
644 capítulo 18
Machine Translated by Google
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
clase pública PlayItListener implementa ActionListener { Este es todo el material musical de Code
acción vacía pública realizada (ActionEvent ev) { Kitchen en el capítulo 12, por lo que
no lo volveremos a comentar aquí.
intentar {
[Link](seq);
[Link]();
[Link](220);
} captura (Excepción ex) {[Link]();}
}catch(Excepción e) { } evento de
retorno; }
Gráficos2D g2 = (Gráficos2D) g;
[Link](nuevo Color(r,gr,b));
} // cerrar si } // cerrar
método } // cerrar clase
interna } // cerrar clase
646 capítulo 18
Machine Translated by Google
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
[Link](panel de entrada);
panel.añadir(botón);
[Link](etiquetadesalida);
panel de retorno;
}
¿No sería un
sueño si este fuera el final del libro?
¿Si no hubiera más viñetas, acertijos,
listas de códigos o cualquier otra
cosa?
Pero eso probablemente sea sólo
una fantasía...
648 capítulo 18
Machine Translated by Google
cuando presionas
"mándalo".
Andy: ritmo #2
GUI: se agregan dos nuevos componentes para el área de texto que muestra los mensajes
entrantes (en realidad, una lista de desplazamiento) y el campo de texto.
REDES: al igual que SimpleChatClient en este capítulo, BeatBox ahora se conecta al servidor y
obtiene un flujo de entrada y salida.
HILOS: nuevamente, al igual que SimpleChatClient, iniciamos una clase de 'lector' que sigue
buscando mensajes entrantes del servidor. Pero en lugar de solo texto, los mensajes que llegan
incluyen DOS objetos: el mensaje String y el ArrayList serializado (lo que contiene el estado de todas
las casillas de verificación).
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
importar [Link].*;
JFrame el Marco;
Panel principal de JPanel;
JList lista entrante;
Mensaje de usuario de JTextField;
ArrayList<JCheckBox> lista de casillas de verificación;
int númsiguiente;
Vector<String> listaVector = nuevo Vector<String>();
Nombre de usuario de cadena;
ObjectOutputStream hacia fuera;
ObjectInputStream en;
HashMap<String, boolean[]> otherSeqsMap = new HashMap<String, boolean[]>();
Secuenciador secuenciador;
Secuencia de secuencia;
Secuencia miSecuencia = nula;
Seguimiento de seguimiento;
650 apéndice A
Machine Translated by Google
} configurarMidi();
construirGUI(); } //
cerrar inicio
[Link](mensaje de usuario);
[Link](50,50,300,300);
[Link]();
[Link] (verdadero);
} // cerrar buildGUI
} // cerrar setUpMidi
652 apéndice A
Machine Translated by Google
pista = [Link]();
Cree una pista recorriendo las casillas de verificación para
obtener su estado y mapeándola a un instrumento (y
para (int i = 0; i < 16; i++) {
creando el MidiEvent para ello).
Esto es bastante complejo, pero es EXACTAMENTE como
trackList = nueva ArrayList<Integer>();
en los capítulos anteriores, así que consulte CodeKitchens
anteriores para obtener la explicación completa nuevamente.
para (int j = 0; j < 16; j++) {
JCheckBox jc = (JCheckBox) [Link](j + (16*i));
if ([Link]()) { int clave =
instrumentos[i]; [Link](new
Integer(clave));
} demás {
[Link](nulo); // porque este espacio debería estar vacío en la pista
}
} // cerrar bucle interno
makeTracks(lista de pistas);
} // cerrar el bucle exterior
[Link](makeEvent(192,9,1,0,15)); // así que siempre vamos a 16 tiempos completos intenta {
[Link](secuencia);
[Link](secuenciador.LOOP_CONTINUOUSLY);
[Link]();
[Link](120);
} captura (Excepción e) {[Link]();}
} // cerrar método
654 apéndice A
Machine Translated by Google
} catch(Exception ex) {[Link]();} } // cerrar ejecución } // JList. Agregar a un JList es una cosa de dos pasos:
cerrar clase interna mantienes un Vector de los datos de las listas
(Vector es un ArrayList anticuado), y luego
JList para usar
le dices al para saber qué mostrar en la lista.
clase pública MyPlayMineListener implementa ActionListener { ese Vector como su fuente
acción vacía pública realizada (ActionEvent a) {
if (miSecuencia! = nulo) {
secuencia = miSecuencia; // restaurar a mi original
}
} // cerrar acción realizada
} // cerrar clase interna Este método se llama cuando el usuario
selecciona algo de la lista. Cambiamos
Secuencia de cambio pública vacía (booleano [] estado de casilla de verificación) {
INMEDIATAMENTE el patrón al que seleccionaron.
para (int i = 0; i < 256; i++) {
JCheckBox comprobar = (JCheckBox) [Link](i);
si (checkboxState[i]) {
[Link](verdadero);
} demás {
[Link](falso);
}
} // cerrar bucle Todo el material MIDI es exactamente igual que antes.
} // cerrar secuencia de cambio estaba en la versión anterior.
public MidiEvent makeEvent(int comd, int chan, int uno, int dos, int tick) {
Evento MidiEvent = nulo; Pruebe
{Mensaje
Corto a = nuevo Mensaje Corto(); [Link](comd, chan,
uno, dos); evento = nuevo MidiEvent(a, marca); }
catch(Excepción e) { } evento de retorno; } // cerrar
makeEvent
Nada nuevo. Igual que la última versión.
} // cerrar clase
Afila tu lápiz
656 apéndice A
Machine Translated by Google
ArrayList<ObjectOutputStream> clientOutputStreams;
ObjectInputStream en;
Cliente de socketSocket;
o2 = [Link]();
vacío público ir () {
clientOutputStreams = new ArrayList<ObjectOutputStream>();
intentar {
ServerSocket serverSock = nuevo ServerSocket(4242);
while(true) { Socket
clientSocket = [Link](); ObjectOutputStream out = new
ObjectOutputStream([Link]()); [Link](fuera);
} // cerrar clase
658 apéndice A
Machine Translated by Google
apéndice B
Los diez temas principales que casi llegan al Libro Real...
manipulación de bits
660 apéndice B
Machine Translated by Google
#9 Inmutabilidad
¿Por qué te importa que las cadenas sean inmutables? ¿Por qué te importa que los Wrappers sean
inmutables?
hazlo pegado
afirmaciones
#8 Afirmaciones
Cómo hacer que las afirmaciones funcionen
“ +
afirmar (altura > 0): “altura = altura + + peso;
“
“ peso =
Afirmaciones
javac [Link]
662 apéndice B
Machine Translated by Google
void hacer cosas() { variable local con alcance para todo el método
int x = 0;
comienzo de un bloque de bucle for, y y tiene
para(int y = 0; y < 5; y++) {
como alcance solo el bucle for.
x=x *
y;
¡Aaaa! ¡No se compilará! ¡Está fuera de alcance aquí! (Esta no es la
} forma en que funciona en otros idiomas, ¡así que ten cuidado!)
invocaciones vinculadas
#6 Invocaciones vinculadas
sb = [Link](3,6).insert(2,”umme”).deleteCharAt(1);
“
[Link](“sb = + alguien);
// el resultado es sb = verano
[Link](3,6) eliminar()
borrar()
insertar()
insertar()
sb = [Link](3,6);
sb = [Link](2,”umme”);
sb = [Link](1);
clase Foo {
público estático vacío principal (String [] args) [
nuevo Foo().go(); queremos llamar a go(), pero no nos importa la
} instancia de Foo, por lo que no nos molestamos en
asignar el nuevo objeto Foo a una referencia.
ir vacío() {
// esto es lo que REALMENTE queremos...
}
664 apéndice B
Machine Translated by Google
estático
importar [Link].*;
importar [Link].*; Creamos un marco y agregamos un botón, y ahora
prueba de clase públicaAnon { necesitamos registrar un oyente de acción con el botón.
público estático vacío principal (String[] args) { Excepto que nunca creamos una clase que implemente
la interfaz ActionListener...
Marco JFrame = nuevo JFrame();
Botón JButton = nuevo JButton(“hacer clic”); Normalmente haríamos algo como esto: pasar una
[Link]().add(botón); referencia a una instancia de una clase interna... una
// botó[Link](quitListener); clase interna que implementa ActionListener (y el
método actionPerformed()).
Esta declaración:
Pero ahora, en lugar de pasar una referencia
botó[Link](nuevo ActionListener() { de objeto, pasamos... ¡¡toda la nueva
acción vacía pública realizada (ActionEvent ev) {
medicina
definición de clase!! En otras palabras,
[Link](0); escribimos la clase que implementa
} ActionListener JUSTO AQUÍ DONDE LA
}); NECESITAMOS. La sintaxis también crea
Tenga en cuenta que decimos “nuevo ActionListener()” una instancia de la clase automáticamente.
aunque ActionListener es una interfaz y, por lo tanto,
no puede HACER una instancia de ella. Pero esta
¡Termina aquí abajo!
sintaxis realmente significa “crear una nueva clase
(sin nombre) que implemente la interfaz
ActionListener y, por cierto, aquí está la implementación
} de los métodos de la interfaz .actionPerformed().
}
666 apéndice B
Machine Translated by Google
Niveles de acceso
público significa que cualquier código en cualquier lugar puede acceder al objeto
público (por "objeto" nos referimos a clase, variable, método, constructor, etc.).
protected funciona igual que el predeterminado (el código en el mismo paquete tiene acceso), EXCEPTO que
también permite que las subclases fuera del paquete hereden lo protegido.
acceso predeterminado significa que solo el código dentro del mismo paquete que la
clase con el elemento predeterminado puede acceder al elemento predeterminado.
privado significa que solo el código dentro de la misma clase puede acceder al objeto privado.
Tenga en cuenta que significa privado para la clase, no privado para el objeto. Un Perro puede ver las
cosas privadas de otro objeto Perro, pero un Gato no puede ver las partes privadas de un Perro.
Modificadores de acceso
público
protegido
privado
público
privado
predeterminado y protegido
por defecto
protegido
668 apéndice B
Machine Translated by Google
# 2 matrices multidimensionales
En t En t En t En t
En t
En t
matriz entera (int[]) matriz entera (int[])
matriz entera (int[])
En t
En t
matriz
entera (int[])
int[][] y = nuevo int [2][]; y[0] = nuevo // crea solo la primera matriz, con una longitud de 2
int [3]; y[1] = nuevo int [5]; // hace que la primera submatriz tenga 3 elementos de longitud
// hace que la segunda submatriz tenga 5 elementos de longitud
670 apéndice B
Machine Translated by Google
JFrameEXIT_ON_CLOSE
final estático
ALEMÁN 1
miembro de la banda seleccionado
12 3
miembro de la banda seleccionado 812
#1 Enumeraciones, cont.
¡No hay necesidad de preocuparse por el valor de esta variable! La sintaxis para referirse a una "instancia" de enumeración.
[Link]
si cambia
== ==
.igual()
Miembros n = [Link];
if ([Link]([Link])) [Link](“¡Jerrrry!”);
if (n == [Link]) [Link](“Perro Rata”); ¡Ambos funcionan bien!
Respuesta:
672 apéndice B
Machine Translated by Google
#1 Enumeraciones, completadas
Una versión realmente mejorada de una enumeración similar
público estático vacío principal (String [] argumentos) { Cada enumeración viene con
para (Nombres n: [Link]()) { un método "values()" incorporado
[Link](n);
que normalmente se usa en un
[Link](“, instrumento: “+ [Link]());
bucle "for", como se muestra.
[Link](“, canta: “ + [Link]());
}
}
} Ventana de edición de archivos Ayuda pirata
% java HfjEnum
Tenga en cuenta que el método básico
JERRY, instrumento: guitarra solista, canta: lastimeramente
BOBBY, instrumento: guitarra rítmica, canta: con voz ronca "sing()" solo se llama cuando el valor de
PHIL, instrumento: bajo, canta: ocasionalmente enumeración no tiene un cuerpo de
%
clase específico de constante.
Misterio El Capitán Byte de la nave espacial Flatland “Traverser” había recibido una transmisión urgente y ultrasecreta desde el
cuartel general. El mensaje contenía 30 códigos de navegación fuertemente cifrados que el Traverser necesitaría
para trazar con éxito un rumbo de regreso a través de sectores enemigos. Los hackarianos enemigos, de una
galaxia vecina, habían ideado un rayo diabólico de codificación de códigos que era capaz de crear objetos falsos en el
montón de la única computadora de navegación del Traverser. En
Además, el rayo alienígena podría alterar variables de referencia válidas para que se refirieran a estos
objetos falsos. La única defensa que tenía la tripulación del Traverser contra este malvado rayo hackariano era
para ejecutar un comprobador de virus en línea que podría integrarse en el estado del arte del Traverser
Código Java 1.4.
El Capitán Byte le dio al Alférez Smith las siguientes instrucciones de programación para procesar los críticos
códigos de navegación:
“Coloque los primeros cinco códigos en una matriz de tipo ParsecKey. Coloque los últimos 25 códigos en una matriz
bidimensional de cinco por cinco de tipo QuadrantKey. Pase estas dos matrices al método plotCourse() de la clase
pública final ShipNavigation. Una vez que se devuelve el objeto del curso, ejecute el comprobador de virus en línea
contra todas las variables de referencia del programa y luego ejecute el programa NavSim y tráigame los resultados”.
Unos minutos más tarde, el alférez Smith regresó con la salida de NavSim. “Salida de NavSim lista para revisión,
señor”, declaró el alférez Smith. “Bien”, respondió el Capitán, “por favor revise su trabajo”. “¡Sí señor!”, respondió el
Alférez, “Primero declaré y construí un array de tipo ParsecKey con el siguiente código; ParsecKey [] p = nueva
ParsecKey[5]; , a continuación declaré y construí una matriz de tipo QuadrantKey con el siguiente código: QuadrantKey
[] [] q = new QuadrantKey [5] [5]; .
A continuación, cargué los primeros 5 códigos en la matriz ParsecKey usando un bucle 'for' y luego cargué los últimos 25
códigos en la matriz QuadrantKey usando bucles 'for' anidados. A continuación, ejecuté el comprobador de virus con las
32 variables de referencia, 1 para la matriz ParsecKey y 5 para sus elementos, 1 para la matriz QuadrantKey y 25 para
sus elementos. Una vez que la verificación de virus regresó sin detectar virus, ejecuté el programa NavSim y volví a
ejecutar el comprobador de virus, solo para estar seguro... ¡Señor! “
El Capitán Byte le dio al Alférez una larga y fría mirada y dijo con calma: "Alférez, está confinado en una celda por
poner en peligro la seguridad de este barco. No quiero volver a ver su cara en este puente hasta que haya aprendido
correctamente su Java". ! ¡Teniente Boolean, reemplace al Alférez y haga este trabajo correctamente!
674 apéndice B
Machine Translated by Google
El índice
Índice
Símbolos
A
Ver
Ver
Ver también
El índice
Ver
Ver también
Ver
Ver
índice 678
Machine Translated by Google
El índice
Ver también
mi
métodos 305
El índice
Ver
argumento 300
GRAMO
F
Ver también
Ver también
índice 680
Machine Translated by Google
El índice
Ver también
Ver también
El índice
Ver
Ver
Ver
k
Ver
l
Ver
índice 682
Machine Translated by Google
El índice
Ver
Ver
Ver
norte
Ver también
Ver
METRO
oh
El índice
Ver
PAG
Ver
Ver
Ver
Ver
índice 684
Machine Translated by Google
El índice
Ver también
Ver también
Ver
q
R
S
Ver
Ver
Ver
Ver
Ver también
El índice
Ver también
Ver también
Ver
Ver
Ver
Ver también
índice 686
Machine Translated by Google
El índice
Ud.
Ver también
V
Ver
W.
Ver
Ver
El índice
índice 688
Machine Translated by Google









