

package javaapplication6; //Nombre del paquete de estas clases

//Declaracion de la importacion de paquetes
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//Fin de la declaracion de paquetes

//Primera Clase que creamos la cual obedece al nombre de primerejemplo
//notese que se crean 2 atributos y dos metodos
class primerejemplo{
  String nombre; //Atributo de la clase primerejemplo tipo cadena de caracteres
  double nota; //Atributo de la clase primerejemplo tipo numerico decimal
/*metodo de la clase primerejemplo y que sirve para incializar la variable nombre
 notese que recibe un parametor que se llama nom y que es de tipo String(cadena de caracteres)
 ademas que existe otro metodo que se llama igual dependera del parametro que le enviemos al metodo 
 para saber cual utilizar si le enviamos un parametro de tipo string entonces inicializara la variable nombre
 la palabra public significa que puede ser accedida por cualquier objeto de la clase y la palabra void que no 
 va a retornar nada.
 */
  public void inicializar(String nom){
     nombre = nom;
  }
  /*fijense con este nuevo metodo se llama igual que el anterior se aplica el concepto de polimorfismo
   recibe un parametro de tipo double el cual se llama nom y es asignado a la variable nota y lo mismo que la anterior
   *es accesida por todos los objetos creados de la clase y ademas no nos devuelve ningun valor
   */
  public void inicializar(double nom){
      nota = nom;
  }
}
//Hasta aqui finaliza la definicion de la primera clase que tenia el nombre de primerejemplo

/*Procedemos a crear la segunda clase esta obedece al nombre de segundoejemplo pero note algo... esta lleva despues de la 
 *definicion la palabra extends esto quiere decir que "hereda de la clase" y luego le definimos de que clase esta heredando 
 *en este caso seria de la clase primerejemplo por lo tanto fijese  bien en algo
 la clase por si propia cuenta con 1 atributo y un metodo que en este caso se llama igual que la clase por lo tanto es un constructor de la clase
 *pero por ser heredada de la clase primerejemplo con cuantos mas atributos y metodos cuenta esta clase?
 *pues con todos los que se definieran en la clase que esta heredando para este caso con 2 atributos y 2 metodos mas
 *al final la clase contaria con la siguiente definicion 
 *clase segundo ejemplo:
 *Atributos : 3 - 2 heredados de la clase primerejemplo(nombre,nota) y 1 Propio(edad)
 *Metodos : 3 - 2 heredados de la clase primerejemplo(incializar(string),incializar(double)) y 1 propio(segundoejemplo(int))
 */
class segundoejemplo extends primerejemplo{
    int edad;
    /*definimos un metodo constructor y fiejese que para realizarlo se cumplen dos caracteristicas
     la primera es que se llame igual que la clase es decir segundoejemplo, la segunda es que esta no retorne ningun valor si se fijan 
     solo le ponemos el  alcance(public) y lueego el mismo nombre de la clase y le especificamos si recibira o no parametros
     para este caso este constructro recibe como parametro un valor double
     **/
    
    public segundoejemplo(int miedad){
    edad = miedad;
    }
}    
//fin de la definicion de la segunda clase

/*comenzamos con la clase principal fijense que esta se debe de llamar igual al nombre del archivo
 *es decir si el archivo se llama Co11.java la clase se debe de llamar class Co11 y ademas su alcance 
 debe de ser publico esta clase pude llevar varios metodos pero el que mas nos interesa es el principal 
 en este y para todos los casos se llamara main el cual es de tipo publico es decir que puede se accesido por cualquier clase 
 es static lo que significa que es un metodo de la clase, es decir un metodo que puede ser utilizado aunque no se haya creado ningun
 objeto de la clase Main(este es el nombre de la clase es decir el del archivo Main.java)
 la palabra Void significa que no retorna nada y el nombre de main()es por que la ejecucion del programa 
 siempre busca el metodo main el cual recibe un parametro que es de tipo String y ademas en un vector el cual para este caso se llama Args
 usted le puede cambiar el nombre si lo desea y los valores de este args se pueden definir en las propiedades del proyecto
*/

//nombre de la clase 
public class Main{
//metodo principal de la clase        
    public static void main(String[] args) throws IOException  {
     segundoejemplo x = new segundoejemplo(15);// en esta linea estamos creando un objeto que es de la clase segundo ejemplo, el cual tendra los atributos
                                               // y metodos de la clase segundoejemplo y por herencia los de la clase primerejemplo 
     x.inicializar("Christian");//llamamamos al metodo inicializar y si se fijan le enviamos un parametro de tipo string en decir que se ejecuta el metodo que 
                                //recibe como parametro un string 
     x.inicializar(9.5);//llamamamos al metodo inicializar y ahora le enviamos un parametro de tipo numerico en decir que se ejecuta el metodo que 
                       //recibe como parametro un double 
/*Imprimimos el mensaje y note que utilizamos los atributos de nombre y edad eso es por que los metodos de inicializar ya inicializaron esos atributos 
de lo contrario nos imprimiria null
*/
     System.out.println("Nombre " + x.nombre + " Edad " + x.edad + " Su nota es : " + x.nota);
     
/*
  estas dos lineas sirven para capturar desde el teclado la primera crea un objeto de que sirve para hacer posible la entrada de datos 
el objeto se llama para este caso inst y es de tipo InputStreamReader si se fijan al otro lado esta clase tiene un metodo constructor que espera un parametro
este debe de ser un parametro que maneje las entradas del sistema este parametro es System.in 
*/ 
     InputStreamReader inst = new InputStreamReader(System.in);
/*Luego creamos un objeto de tipo bufer estos objetos nos permiten almacenar cualquier cosa el objeto se llama lectura(para este caso)
y esta clase(BufferedReader) tiene como parametro el objeto que creamos en la linea anterior para este caso inst que creamos arriba 
*/
     BufferedReader lectura = new BufferedReader(inst);
     String nombre;//declaramos una variable String que se llama nombre
     nombre = lectura.readLine();//atraves del objeto lectura tenemos accceso a los metodos para leer desde el teclado para este caso lo que leemos se lo asignamos a la variable nombre
     System.out.println("esto seria lo capturado " + nombre);//Aca lo imprimimos
    }
    
    
}