Foros del Web » Programación para mayores de 30 ;) » Java »

El esqueleto de Java

Estas en el tema de El esqueleto de Java en el foro de Java en Foros del Web. Hola buenas llevo un tiempo programando en java unos meses. Y yo cuando aprendo algo me gusta aprenderlo no memorizarlo (aunque la gente crea que ...
  #1 (permalink)  
Antiguo 22/11/2013, 04:46
 
Fecha de Ingreso: noviembre-2012
Mensajes: 53
Antigüedad: 11 años, 5 meses
Puntos: 1
El esqueleto de Java

Hola buenas llevo un tiempo programando en java unos meses.
Y yo cuando aprendo algo me gusta aprenderlo no memorizarlo (aunque la gente crea que los programadores sólo memorizamos cadenas).

Y me he topado con cosas en Java que no podría explicarme (sobretodo con las clases prediseñadas de java) os cuento los casos:

Scanner:
para invocar un objeto Scanner hacemos asi:
Código:
Scanner variable=new Scanner(System.in)
Vale eso crea el objeto etc... Pero lo que va entre parentesis son los parámetros del constructor.
Ese es el caso yo se que puedo crear un constructor con parámetros pero de tipo int tipo String etc
ejemplo:
Código:
matematicas calcula=new Matematicas(minombre);
Pero Scanner no es una variable entera o string es como ejecutar una funcion dentro de los parentesis y me gustaría poder hacerlo en una clase para poder comprender lo que hace realmente.


Dos funciones en una

Código:
   
        StringBuffer Texto=new StringBuffer();
        String texto="wola";
        Texto=Texto.append(texto).reverse();
Si vemos la última línea le digo que Texto es igual al contenido de texto y con un punto le digo que además ejecute el método para darle la vuelta.

En cambio si yo creo dos métodos no me dejara usarlos a la vez. Os lo explicaré:
Código:
public class numeros
public static int genera()
return 0;

public static int suma8(int numero)
numero+=8;
return numero;
En la clase principal no podré hacer esto:
Código:
int num;
num=numeros.genera().suma8(num)
no me dejaría hacer eso tendria que hacer esto:
Código:
int num;
num=numeros.genera();
num=numeros.suma8(num);
¿Por que si deja en el método de la clase StringBuffer hacerlo ?


PD: he omitido llaves y demás código para ir al grano del asunto.
Esas eran mis dudas un saludo
  #2 (permalink)  
Antiguo 22/11/2013, 05:20
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: El esqueleto de Java

1. System.in es un atributo/propiedad, en este caso un objeto. ¿Desde cuando no se pueden pasar objetos como parámetro a una función/constructor?

2. Una función puede devolver un objeto, si ese objeto tiene métodos puedes llamar a esos métodos directamente. Es equivalente a

StringBuffer s = Texto.append(texto)
StringBuffer s2 =s.reverse()

Necesitas repasar lo básico, no tienes claro qué es una primitiva y qué es objeto ni los componentes de una función.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Última edición por Xerelo; 22/11/2013 a las 05:57
  #3 (permalink)  
Antiguo 23/11/2013, 03:45
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: El esqueleto de Java

Hola:

Aunque es lo mismo que comenta Xerelo, lo explico de otra forma por si puede ayudar.

Scanner es una clase que tiene un constructor que acepta un InputStream como parámetro http://docs.oracle.com/javase/7/docs...l/Scanner.html y System.in es justamente un Input Stream http://docs.oracle.com/javase/7/docs...ng/System.html , así que no hay nada extraño en

Scanner variable=new Scanner(System.in)

simplemente estás haciendo un new de la clase Scanner pasándole un parámetro del mismo tipo que admite.

En cuanto a este tipo de encadenamiento

Texto=Texto.append(texto).reverse();

se puede hacer si append devuelve la misma clase, en vez de un resultado. Por ejemplo

Código Java:
Ver original
  1. public class Acumulador {
  2.     private int acumulado=0;
  3.     public int getAcumulado() {
  4.         return acumulado;
  5.     }
  6.     public Acumulador acumula(int valor) {
  7.         acumulado+=valor;
  8.         return this;  // este return es lo que permite encadenar metodos cuando se llama a acumula()
  9.     }
  10. }

De esta forma, como el método acumula() devulve un Acumulador, puedes encadenar llamadas

Código Java:
Ver original
  1. Acumulador acumulador = new Acumulador();
  2. // Podriamos hacer llamadas de la forma habitual
  3. acumulador.acumula(11);
  4. // pero como acumula() devuelve un Acumulador, podemos llamar más métodos de Acumulador
  5. int total = acumulador.acumula(12).acumula(14).acumula(1).getAcumulado();

Por supuesto, y como comenta Xerelo de forma más general, un método puede devolver cualquier tipo de objeto, no necesariamente un this, y así podrías llamar, de forma encadenada o no, a métodos de ese tipo de objeto distinto

variableClaseA.metodoDeA().metodoDeB().metodoDeC()

siempre que metodoDeA() devuelva un objeto de tipo B y metodoDeB() devuelva un objeto de tipo C.

Y aunque no va exactamente con la pregunta, simplemente comentar que esta llamada encadena de objetos de distintos tipos en general y salvo para casos muy concretos, no es buena costumbre de programación. La línea anterior

variableClaseA.metodoDeA().metodoDeB().metodoDeC()

hace que la clase a la que pertenece tenga que ver las clase A, B y C, además de tener que cambiarla si cambia cualquiera de los métodos. Siempre es aconsejable "ocultar" información y si variableClaseA.hazCosas() se encarga de llamar a metodoDeB() y metodoDeB() se encarga por dentro de llamar a metodoDeC(), tu código quedaría como

variableClaseA.hazCosas()

y solo necesita ver clase A y solo necesita cambiarse si cambia el método hazCosas().

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 23/11/2013 a las 03:54
  #4 (permalink)  
Antiguo 24/11/2013, 07:59
 
Fecha de Ingreso: noviembre-2012
Mensajes: 53
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: El esqueleto de Java

Gracias por responder ya me he aclarado las dudas sobretodo con la explicación de Chuidiang.

Seguiré esforzandome y programando hasta que lo comprenda todo.

Un saludo

Etiquetas: dudas, metodos, scanner
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:38.