|
643
|
Programación / Java / Re: Duda sobre combinar métodos de una clase en otra
|
en: 4 Abril 2019, 11:03 am
|
En el constructor de la clase Celular puedes añadir un parámetro tipo Calculadora, o un setter.
Vía herencia también. Cuando llegue a la casa te ayudo más estoy en la caverna del curro. Bien aquí vamos, vamos a usar Herencia con la palabra reservada extends en la clase Celular
Otra vía es por medio de interfaces
Investigar - herencia simple de clases
- Uso de super
- Modificador de acceso protected
[/list] package foro; import java.lang.Math.*; import java.util.logging.Logger; /** * Clase Calculadora */ public class Calculadora { private String sistemaOperativo ; private String versionSistemaOperativo ; public static final Logger LOGGER = Logger.getLogger(ProyectoCelular.class.getSimpleName()); public Calculadora() { super(); } this.marca = marca; this.modelo = modelo; this.sistemaOperativo = sistemaOperativo; this.versionSistemaOperativo = versionSistemaOperativo; } /** * * @param a * @param b * @return La suma entre a y b */ public float sumar(float a, float b) { return a + b; } /** * * @param a * @param b * @return La resta entre a y b */ public float restar(float a, float b) { return a - b; } /** * * @param a * @param b * @return La multiplicación entre a y b */ public double multiplicar(double a, double b) { if (a == 0 || b == 0) { return 0; } else { return a * b; } } /** * * @param a * @param b * @return La división entre a y b */ public double dividir(float a, float b) { return a / b; } /** * * @param n * @return El factorial de un numero */ public int factorial(int n) { if (n < 1) { return 1; } else { return n * factorial(n - 1); } } /** * @return the marca */ return marca; } /** * @param marca the marca to set */ public void setMarca (String marca ) { this.marca = marca; } /** * @return the modelo */ return modelo; } /** * @param modelo the modelo to set */ public void setModelo (String modelo ) { this.modelo = modelo; } /** * @return the sistemaOperativo */ public String getSistemaOperativo () { return sistemaOperativo; } /** * @param sistemaOperativo the sistemaOperativo to set */ public void setSistemaOperativo (String sistemaOperativo ) { this.sistemaOperativo = sistemaOperativo; } /** * @return the versionSistemaOperativo */ public String getVersionSistemaOperativo () { return versionSistemaOperativo; } /** * @param versionSistemaOperativo the versionSistemaOperativo to set */ public void setVersionSistemaOperativo (String versionSistemaOperativo ) { this.versionSistemaOperativo = versionSistemaOperativo; } @Override final StringBuilder sb = new StringBuilder("\nCalculadora"); sb.append("\nmarca='").append(marca).append("\n"); sb.append(", modelo='").append(modelo).append("\n"); sb.append(", sistemaOperativo='").append(sistemaOperativo).append("\n"); sb.append(", versionSistemaOperativo='").append(versionSistemaOperativo).append("\n"); return sb.toString(); } }
Cuando establecemos herencia, de una clase con un constructor definido como el tuyo, debemos invocarlo con super() y si tiene parámetros setearselos en este caso la clase celular tiene 2 atributos propios de ella, el color y precio, entonces, bastaría con dejar los setters/getters de color y precio, ya que los otros se heredan
La visibilidad de los atributos/variables de instancia, siendo protected tendrán visibilidad en el mismo paquete, para verlas desde otro paquete deben ser publicas, pero por convención en java, deberían ser en lo posible declaradas como private, accediendo a ellas via getters
package foro; /** * Clase Celular */ public class Celular extends Calculadora { // extendemos a Calculadora //private String marca; //private String modelo; // estas dos variables no hacen falta, porque se heredan tambien private double precio; /** * Nuevo constructor vacio */ public Celular() { super(); // super invoca al constructor de la clase Calculadora } /** * con este super invocamos al constructor de la clase Calculadora, seteandole los parametros * correspondientes chavalina. */ super(marca,modelo, sistemaOperativo,versionSistemaOperativo); this.color = color; this.precio = precio; } /** * @return the marca */ return marca; } /** * @param marca the marca to set */ public void setMarca (String marca ) { this.marca = marca; } /** * @return the modelo */ return modelo; } /** * @param modelo the modelo to set */ public void setModelo (String modelo ) { this.modelo = modelo; } /** * @return the color */ return color; } /** * @param color the color to set */ public void setColor (String color ) { this.color = color; } /** * @return the precio */ public double getPrecio() { return precio; } /** * @param precio the precio to set */ public void setPrecio(double precio) { this.precio = precio; } @Override final StringBuilder sb = new StringBuilder(); sb.append(super.toString()); sb.append("\ncolor='").append(color).append("\n"); sb.append(", precio=").append(precio); return sb.toString(); } }
package foro; public class ProyectoCelular { public static void main (String[] args ) { // Esto es el main todavia no lo terminé final Celular celular = new Celular(); /** * Configurando por medio de setters NO-THREAD-SAFE */ celular.setColor("Rojo"); celular.setMarca("Samsung"); celular.setModelo("I9300"); celular.setPrecio(200); celular.setSistemaOperativo("Android KitKat"); celular.setVersionSistemaOperativo("4.4.4"); /** * Todos ellos retornan un valor * que puedes mostrar con la consola o logger, logger es lo mas correcto */ celular.factorial(2); celular.dividir(2,3); celular.sumar(2,3); celular.restar(5,1); celular.multiplicar(5,5); Calculadora.LOGGER.info(celular.toString()); } }
Estamos en presencia de un constructor telescópico, muchos parámetros a veces difícil de usar, coste de mantenimiento, legibilidad etc, patrón Builder es la solución.
A simple vista pensarías, bueno me creo otro constructor y le añado parámetros, pero vienes de nuevo y añades otro y así, nunca terminara, o este mismo contructor añadirle mas parámetros.
O la típica vía de usar setters, NO-THREAD-SAFE, es decir no Inmutable(Como String, StringBuffer, la api LocalDate del paquete java.time), si usas ese bean en un Thread podrian pasar cosas raras y difíciles de resolver. tema que, podemos tratar luego.
/** * con este super invocamos al constructor de la clase Calculadora, seteandole los parámetros * correspondientes chavalina. */ super(marca,modelo, sistemaOperativo,versionSistemaOperativo); this.color = color; this.precio = precio; }
Recuerda retomar este hilo y estudiarlo bien , donde tienes otro ejemplo de herencia https://foro.elhacker.net/java/metodo_mostrar_todos_los_atributos_de_un_objeto_por_pantallaresuelto-t494141.0.htmlEn la clase Celular te puse unos bugs que debes de resolver, recuerda que hay métodos en la clase Celular que no te hacen falta, es decir, puedes quitarlos, debido a que los heredas
|
|
|
644
|
Programación / Java / Re: pequeñas dudas de java
|
en: 4 Abril 2019, 10:58 am
|
Hola chicos, como puedo aprender mas rapido Java? que quiere decir cuando creo un metodo dentro de una clase principal como public static void me lo toma cuando lo llamo desde el main de esa clase pero cuando lo declaro como public void no me lo toma?
Leete un buen libro como deitel, saber buscar en Google,aprende bien lo básico pero bien. Aquí coloque varios libros en Manuela de Java de Java
Y con respecto a los métodos estaticos y de objetos pues, es que ambos funcionan distinto. en el main puedes invocar a métodos estaticos, y los metodos no estaticos por medio de una Objeto creado que pueda invocar a su método correspondiente.
Y eso se da porque el metodo main es estatico en si.
Cosa distinta en un contructor, que puedes invocar sin mucho problema, muchos frameworks no tienen como entrypoint a el metodo main, sino que usan otros, y tambien contructores
|
|
|
645
|
Programación / Java / Re: Juego de la vida - Simulacion en Java
|
en: 1 Abril 2019, 01:10 am
|
Puedes hacerlo de modo procedimental o con clases, a tu gusto... Si lo haces con clases, por ejemplo crearía una clase 'tablero', en el constructor se recibe las filas y columnas (o cantidad) si ambos valores serán iguales. También un parámetro para indicar cuandos e considera el mundo muerto, es decir si hay 25x25 casillas (625 células, podría consdierarse muerto (por ejemplo), si quedna menos de 50), un valor de cero o menor, podría indicar que vive mientras queden células vivas... Acto seguido se crea un array bidimensional de NxM casillas... int Filas, Columnas, MundoMuere
funcion New(int F, int C, int MM) filas = f columnas = C Si (MM < 0) luego MM=0) MundoMuere = MM
dimensionar Mapa(filas, columnas) fin funcion
ó: funcion New(int Casillas) Una enumeración de 2-3 estados. Celula viva = '*' , célula muerta = ' ', celula 'enferma' = '-' (caso de que quisieras complicarlo y que una célula necesitara x estados (por ejemplo 1, y al siguiente muere) seguidos de transición por debajo del umbral de vida). es decir si no tiene los vecinos esperados y está viva, enferma, pero si está enferma muere. enumeración EstadoCelula ESTADO_VIVA = 0 ESTADO_ENFERMA = 1 ' de 1 a 8, podría alojar 8 transiciones antes de morir, o pasar directamente del 1 al 9, o del 0 al 9 ESTADO_MUERTA = 9 FIN ENUMERACION Un array con los valores a dibujar (char/string) char representa(0 a 9) // con estos valores representa(0) = "*" // viva representa(1) = "-" //enferma // representa(2) = "-" //... si se prefieriese dibujar estados de enfermedad diferentes o todos con '1' representa(9) = " " //muerta
// tambén se puede hacer otro array con colores, para dibujar de diferente color vivas de 'enfermas'. Otra enumeración de los valores de transicion: (Tu pon los valores que quieras, de hecho es bueno modificarlos, para ver como se comporta). enumeracion Transicion TR_MUERE_INANICION = 1 // con 3 o menos células muere. // TR_VIVE = 2,3,4,5,6 / se entiende que viven con el rango dentro de ambos extremos. TR_MUERE_SOBREPOBLACION = 7 fin enumeracion Una estructura retiene el estadO (de esos valores enumerados) y el recuento de vecinos. Estructura DatosDeCelula EstadoCelula Estado Transicion NumVecinos fin estructura
Array de DatosDeCelula Mapa()
Una función se encarga de contar los vecinos, para cada célula: Funcion ContarVecinos() int i, j, k, n
bucle para j desde 0 a filas-1 bucle para k desde 0 a Columnas -1 Mapa(j,k).Vecinos = ContarMisVecinos(j,k) siguiente siguiente fin funcion
// contar los vecinos para esta célula... Transicion = funcion ContarMisVecinos(int fila, int Columna) int x, y, w, h int j, k Transicion vecinos
Si (fila <2) // tiene 1 o 0 vecinos a la izquierda x = 0 w = fila + 2 Si (fila > filas-3) // tiene 1 ó 0 vecinos a la derecha x= fila - 2 w = filas -1 sino x= fila - 2 w = fila + 2 fin si
Si (columna <2) // tiene 1 o 0 vecinos arriba y = 0 h = columna + 2 Si (columna > Columnas-3) // tiene 1 ó 0 vecinos abajo y = columna - 2 h = columnas -1 sino y = columna - 2 h = columna + 2 fin si
bucle para j desde y hasta h bucle para k desde x hasta w Si (mapa(j,k).estado = ESTADO_VIVA ) luego vecinos +=1 siguiente siguiente
devolver vecinos fin funcion
Luego otra función que actualice el estado en base a sus vecinos: funcion UpdateMapa int j, k, vivas
bucle para j desde 0 a filas -1 bucle para k desde 0 hasta columnas -1 si (Mapa(j,k).vecinos <= TR_MUERE_INANICION) o si (Mapa(j,k).vecinos <= TR_MUERE_SOBREPOBLACION) // es una sola línea con la anterior, queda cortada en 2 por ser larga... mapa(j,k).estado = ESTADO_MUERTA si no // hay que señalarla viva, porque antes podría estar muerta mapa(j,k).estado = ESTADO_VIVA vivas +=1 fin si
// char que representa el estado, fila, columna, color Dibujar(representa(mapa(j,k).estado ) ,j, k , color) siguiente siguiente
Si (vivas <= MundoMuere) luego finpartida // no quedan células suficientes... fin si fin funcion Y una función dibujar para dibujar cada casilla (si no es muy complejo lo que deba hacer, puede subsumirse en la función anterior... (en 'dibujar...'). Básicamente eso es lo principal, generar las células al azar al comienzo de la partida, y algún otro detalle resulta ya nimio... p.d.: Se me olvidada... al contar los vecinos, debe descontarse 1, si la célula en cuestión esta 'viva' (ella no debe contarse como su vecina). Es más fácil el doble bucle sin considerarla y luego descontarla que filtrarlo en el propio bucle (pués sucede 1 de las hasta 9 veces por cada casilla). Interesante respuesta doc, vere si tengo un tiempo para mudarlo a Java
|
|
|
646
|
Programación / Java / Re: Suma de dos matrices - Me devuelve "[[D@7d4991ad"
|
en: 1 Abril 2019, 00:30 am
|
Casi casi lo tiene dog , recorrer con doble ciclo for como haces con el método suma, porque debes recorrer cada indice, me da aburrimiento máximo llenarla, pero aleatoria nom y así ahorras tiempo en desarrollo, no apto para produccion Pero me imagino que entiendes no? ejemplo las coordenada [0,0] de la matris1 se sumara con la [0,0] de la matris 2 y asipublic class Bidimensional { private double[][] matriz; private int renglones; private int columnas; public Bidimensional(int renglones, int columnas) { // constructor y pido el ingreso de valores a matrices Scanner entrada = new Scanner (System. in); this.matriz = new double [renglones][columnas]; for(int i=0 ; i<renglones; i++) { for(int j=0; j<columnas; j++) { matriz [i ][j ]= Double. valueOf(TWO_DIGITS. format(1 + SR. nextDouble())); System. out. print("Ingresar el numero de matriz ["+i +":"+j +"]: "); System. out. println(matriz [i ][j ]); } } } public double[][] suma(Bidimensional m2) // operacion de suma { for(int i=0; i<2; i++) { for(int j=0; j<2; j++) { matriz[i][j]= matriz[i][j] + m2.matriz[i][j]; } } return matriz; } public double format(final double num) { return Double. valueOf(TWO_DIGITS. format(num ). replace(",", ".")); } public static void main (String ... blalba) { final Bidimensional matris = new Bidimensional(2,2); final Bidimensional matris2 = new Bidimensional(2,2); final double[][] resultado = matris.suma(matris2); //Recorrer el Array de doble dimension, con java 8, java 7 usa doble for . flatMapToDouble(Arrays::stream ) .map(this::format) . forEach(System. out::println ); } }
Ingresar el numero de matriz [0:0]: 1.32 Ingresar el numero de matriz [0:1]: 1.8 Ingresar el numero de matriz [1:0]: 1.62 Ingresar el numero de matriz [1:1]: 1.71 Ingresar el numero de matriz [0:0]: 1.53 Ingresar el numero de matriz [0:1]: 1.6 Ingresar el numero de matriz [1:0]: 1.6 Ingresar el numero de matriz [1:1]: 1.57 2.85 3.4 3.22 3.28 Process finished with exit code 0
Tambien te sirve asi, y cualquier otra manera que funcione XD public double[][] suma(Bidimensional m2) // operacion de suma { for(int i=0; i<matriz.length; i++) { for(int j=0; j<m2.matriz[i].length; j++) { matriz[i][j]= matriz[i][j] + m2.matriz[i][j]; } } return matriz; }
Y asi
for(int i=0; i<matriz.length; i++) { for(int j=0; j<matriz[i].length; j++) { matriz[i][j]= matriz[i][j] + m2.matriz[i][j]; } }
|
|
|
647
|
Programación / Java / Re: Metodo mostrar todos los atributos de un objeto por pantalla(RESUELTO)
|
en: 30 Marzo 2019, 18:37 pm
|
No deberias gastar tiempo en escribir los getters / setters o el metodo toString(). Los editores deberian hacerlo por ti. IntelliJ lo hace, al menos.
Otra alternativa es ni siquiera escribir el codigo, sino anotar la clase y que magicamente esos metodos se escriban y existan aunque no los veas. AutoValue y Lombok son 2 exponentes de esto.
Magicamente? o gracias a Reflection vía anotaciones? generando codigo en runtime, la chavala esta aprendiendo, por eso mi ejemplo.
Aunque me falto decirle eso. yo genere getters/setters/toString() con intelliJIDea, eclipse también lo hace, netBeans me imagino que también debería.
@CalgaryCorpus seria bueno que le pusieras un ejemplo de Project Lombok para que la ayudes.
Y de paso ah dia de hoy grandes Frameworks webs de java, potentes, tienen su implementacion de toString() sin api de terceros como lombok entre otras, de paso que toString() sirve para no mostrar el codigo hash directamente a alguien que espie dichos objetos. @Beginner Web , creas las variables de instancia que quieras, luego, teclas Alt + insertar, debería aparecerte este cuadro de contexto con las opciones que se muestran, no aparece toString() porque ya lo use, versión de NetBeans que tengo
* Product Version: NetBeans IDE 8.2 (Build 201610071157)
|
|
|
648
|
Programación / Java / Re: Metodo mostrar todos los atributos de un objeto por pantalla(RESUELTO)
|
en: 30 Marzo 2019, 14:50 pm
|
//Este es una clase public class Persona{ private String nombre; private int edad;
Constructor va aquí Getters & Setters aquí }
//Este es el main public class Personal{
public static void main(){ Persona objeto1=new Persona("Ana",14);
//Esto es algo tedioso de hacer varios objetos de distintas clases //Podia crear un metodo en la clase Persona que muestre todo, pero quiero saber si hay otra técnica por defecto sout para mostrar el nombre de objeto1; sout para mostrar la edad de objeto1;
}
}
Me parece que me conviene crear metodos en las clases para pedir los datos y otro para mostrarlos asi escribo menos en el main
Que tal chavalina? Usa GeshiSi hay mejores maneras de hacerlo por ejemplo una, lo que necesitas es algo de herencia simpleimport java.util.logging.Logger; /** * */ @FunctionalInterface public interface IPersonal { Logger LOGGER =Logger.getLogger(IPersonal.class.getSimpleName()); void introducirDatos(); default <T> void mostrar(final T value) { } /** * usar dentro de un metodo estatico * @param value * @param <T> */ static <T> void mostrar2(final T value) { } default <T> void log(final T t) { LOGGER.severe(t.toString()); } /** * usar dentro de un metodo estatico * @param t * @param <T> */ static <T> void log2(final T t) { LOGGER.severe(t.toString()); } }
import java.util.Objects; import java.util.Scanner; /** * */ public abstract class AbstractBasePersona implements IPersonal { protected int edad; protected static final Scanner LEER = new Scanner (System. in); public AbstractBasePersona() { this.edad = 0; this.nombre = ""; } public AbstractBasePersona (final String nombre, final int edad ) { this.nombre = Objects.requireNonNull(nombre,"Nombre no debe ser null"); this.edad = Objects.requireNonNull(edad,"Edad no debe ser null"); } return nombre; } public void setNombre (String nombre ) { this.nombre = nombre; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } @Override public void introducirDatos() { mostrar("Introduce nombre: "); nombre = LEER.next(); //bug scanner LEER.nextLine(); mostrar("Introduce edad"); while(!LEER.hasNextInt()) { LEER.next(); mostrar("Valor invalido!, solo numeros"); } edad = LEER.nextInt(); } @Override final StringBuilder sb = new StringBuilder("\nPersona"); sb.append("\nNombre: ").append(nombre).append("\n"); sb.append("Edad: ").append(edad); return sb.toString(); } }
public class PersonalDeInformatica extends AbstractBasePersona { private boolean esDeInformatica; public PersonalDeInformatica() { super(); } public PersonalDeInformatica (final String nombre, final int edad, boolean esDeInformatica ) { super(nombre,edad); this.esDeInformatica = esDeInformatica; } @Override public void introducirDatos() { /** * Introducir los datos basicos por defecto, Nombre y Edad */ super.introducirDatos(); // pedimo si es personal de informatica mostrar("Personal del Informtica ?"); esDeInformatica = LEER.nextBoolean(); //setemos el tipo de persona setEsDeInformatica(esDeInformatica); } public boolean isEsDeInformatica() { return esDeInformatica; } public void setEsDeInformatica(boolean esDeInformatica) { this.esDeInformatica = esDeInformatica; } @Override final StringBuilder sb = new StringBuilder(); sb.append(super.toString()); sb.append("\nEs de informatica ? ").append(esDeInformatica); return sb.toString(); } }
/** * */ public class PersonalDeLimpieza extends AbstractBasePersona { private boolean esDeLimpieza; //por defecto la variable de instancia boolean, es false public PersonalDeLimpieza() { super(); } public PersonalDeLimpieza (final String nombre, final int edad, final boolean esDeLimpieza ) { super(nombre,edad); this.esDeLimpieza = esDeLimpieza; } public boolean isEsDeLimpieza() { return esDeLimpieza; } public void setEsDeLimpieza(boolean esDeLimpieza) { this.esDeLimpieza = esDeLimpieza; } @Override public void introducirDatos() { //invocamo al introducir datos de la superClaseAbstracta super.introducirDatos(); // pedimo si es personal de limpieza mostrar("Personal del limpieza ?"); esDeLimpieza = LEER.nextBoolean(); //setemos el tipo de persona setEsDeLimpieza(esDeLimpieza); } @Override final StringBuilder sb = new StringBuilder(); sb.append(super.toString()); sb.append("\nPersonal de Limpieza ? ").append(isEsDeLimpieza()).append("\n"); return sb.toString(); } }
import java.util.LinkedList; /** * */ private final LinkedList<IPersonal> iPersonalLinkedList = new LinkedList<>(); init(); } private void init() { final PersonalDeLimpieza personalDeLimpieza = new PersonalDeLimpieza(); personalDeLimpieza.introducirDatos(); final PersonalDeInformatica personalDeInformatica = new PersonalDeInformatica(); personalDeInformatica.introducirDatos(); /** * Anadimos a todos los objetos que extienden/implementan a IPersonal * para procesarlos de manera polimorfica gracias, a que cada uno, * sobreEscribe a toString(). */ iPersonalLinkedList.add(personalDeLimpieza); iPersonalLinkedList.add(personalDeInformatica); /** * Se invocara al metodo toString() de cada Objeto, implicitanmente */ //java 8 iPersonalLinkedList.forEach(e -> e.mostrar(e)); //java 7 /*for(IPersonal tmp : iPersonalLinkedList) { tmp.mostrar(tmp.toString()); }*/ } public static void main (String ... blabla) { } }
Salida Introduce nombre: Ana Introduce edad 14 Personal del limpieza ? false Introduce nombre: rubn Introduce edad 30 Personal del Informtica ? true Persona Nombre: Ana Edad: 14 Personal de Limpieza ? false Persona Nombre: rubn Edad: 30 Es de informatica ? true Process finished with exit code 0
Un ejemplo sencillo, luego chekeate el patrón Builder , y Abstract Generic Builder , con interfaces también (te aseguro que te gustara, y trabajaras mejor con inmutabilidad)
|
|
|
649
|
Seguridad Informática / Seguridad / Re: localizar celular por imei
|
en: 30 Marzo 2019, 14:38 pm
|
me robaron mi celular lo puedo encontrar mediante mi imei
Anda donde tu operador, y reportalo como robado, pero quizás ese maleante o X, pueda reparar ese imei y pueda usarlo siendo mas fácil en Android, en IOs tendría que cambiar la nandFlash donde esta la configuración del imei, pero no lo creo de verdad.
|
|
|
|
|
|
|