Abstracción y polimorfismo

package com.trifulcas.herencia.abstraccion;

public abstract class Empleado {
	private String nombre;
	// Visible dentro de la propia clase y sus derivadas
	protected double sueldo;
	private double irpf=.85;
	
	
	public Empleado(String nombre, double sueldo) {
		super();
		this.nombre = nombre;
		this.sueldo = sueldo;
	}
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the sueldo
	 */
	public double getSueldo() {
		return sueldo;
	}
	/**
	 * @param sueldo the sueldo to set
	 */
	public void setSueldo(double sueldo) {
		this.sueldo = sueldo;
	}
	
	@Override
	public String toString() {
		return "Empleado [nombre=" + nombre + ", sueldo=" + sueldo + "]";
	}
	
	public double sueldoNeto() {
		return sueldo*irpf;
	}
	
}

package com.trifulcas.herencia.abstraccion;

public class Administrativo extends Empleado {
	private String departamento;
	private int antiguedad=0;
	
	/**
	 * @return the departamento
	 */
	public String getDepartamento() {
		return departamento;
	}


	/**
	 * @param departamento the departamento to set
	 */
	public void setDepartamento(String departamento) {
		this.departamento = departamento;
	}


	/**
	 * @return the antiguedad
	 */
	public int getAntiguedad() {
		return antiguedad;
	}


	/**
	 * @param antiguedad the antiguedad to set
	 */
	public void setAntiguedad(int antiguedad) {
		this.antiguedad = antiguedad;
	}


	public Administrativo(String nombre, double sueldo) {
		super(nombre, sueldo);
		// TODO Auto-generated constructor stub
	}

	@Override
	public double sueldoNeto() {
		// Llamo al método de la clase madre que estoy sobreescribiendo
		// con la palabra reservada super
		return super.sueldoNeto()+antiguedad*100;
	}
}

package com.trifulcas.herencia.abstraccion;

public class Comercial extends Empleado {
	
	private double comision;
	private double ventas;
	
	public Comercial(String nombre, double sueldo, double comision) {
		// Llamo al constructor de la clase madre
		super(nombre, sueldo);
		// Inicializo las propiedades de mi propia clase
		this.comision=comision;
	}
	
	/**
	 * @return the comision
	 */
	public double getComision() {
		return comision;
	}
	/**
	 * @param comision the comision to set
	 */
	public void setComision(double comision) {
		this.comision = comision;
	}
	/**
	 * @return the ventas
	 */
	public double getVentas() {
		return ventas;
	}
	/**
	 * @param ventas the ventas to set
	 */
	public void setVentas(double ventas) {
		this.ventas = ventas;
	}
	// El sueldo de un comercial es el sueldo menos el irpf
	// mas la comisión por las ventas
	// SObre escribo el método
	@Override
	public double sueldoNeto() {
		// Llamo al método de la clase madre que estoy sobreescribiendo
		// con la palabra reservada super
		return super.sueldoNeto()+comision*ventas;
	}
	
	
}

// La clase Empleado es abstracta, por lo tanto no puedo instanciar
		// Da error Empleado emp=new Empleado("foo",3000);

		// Pero eso no impide que, en aras del polimorfismo, tengamos variables
		// (e incluso listas) de tipo empleado
		ArrayList<Empleado> empresa=new ArrayList<>();
		
		// Estas variables se pueden instanciar porque sus clases no son abstractas
		Comercial ana=new Comercial("Ana",2000,.02);
		Administrativo eva=new Administrativo("Eva",2000);
		Comercial pep=new Comercial("Pepe",1000,.04);
		
		// Y las podemos añadir a una lista de empleados porque derivan de ella
		// (Igual que lo podíamos hacer antes)
		// Esto no es problemático, porque no instanciamos Empleado, sino las clases derivadas
		empresa.add(pep);
		empresa.add(eva);
		empresa.add(ana);
		
		// Podemos recorrer la lista con una variable 'empleado'
		for(Empleado emp:empresa) {
			System.out.println(emp.getSueldo());
		}

Solución 2.0

package com.trifulcas.herencia;

public class Vehiculo {
	private int velocidad;
	private int direccion;
	protected int velocidadMaxima;
	protected int aceleracion;
	protected int giro;

	public Vehiculo() {
		velocidadMaxima = 200;
		aceleracion=10;
		giro=10;
	}

	public void acelerar() {
		velocidad += aceleracion;
		if (velocidad > velocidadMaxima) {
			velocidad = velocidadMaxima;
		}
	}

	public void frenar() {
		velocidad -= aceleracion;
		if (velocidad < 0) {
			velocidad = 0;
		}
	}

	public void izquierda() {
		direccion += giro;
		if (direccion >= 360) {
			direccion -= 360;
		}
	}

	public void derecha() {
		direccion -= giro;
		if (direccion < 0) {
			direccion += 360;
		}
	}

	@Override
	public String toString() {
		return "Vehiculo [velocidad=" + velocidad + ", direccion=" + direccion + "]";
	}

}

package com.trifulcas.herencia;

public class Coche extends Vehiculo {
	public Coche() {
		velocidadMaxima=150;
	}
	
}

package com.trifulcas.herencia;

public class Bicicleta extends Vehiculo {
	public Bicicleta() {
		aceleracion=3;
	}
}

package com.trifulcas.herencia;

public class Tanque extends Vehiculo {
	public Tanque() {
		giro=90;
	}
}

Soluciones ejercicios

package com.trifulcas.herencia;

public class Producto {
	protected String nombre;
	protected String familia;

	public Producto(String nombre, String familia) {
		super();
		this.nombre = nombre;
		this.familia = familia;
	}

	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * @return the familia
	 */
	public String getFamilia() {
		return familia;
	}

	/**
	 * @param familia the familia to set
	 */
	public void setFamilia(String familia) {
		this.familia = familia;
	}

	@Override
	public String toString() {
		return "Producto [nombre=" + nombre + ", familia=" + familia + "]";
	}

}

package com.trifulcas.herencia;

public class Asiento extends Producto {
	protected int numeroPatas;
	
	public Asiento(String nombre, String familia, int numeroPatas) {
		super(nombre, familia);
		this.numeroPatas=numeroPatas;
	}

}

package com.trifulcas.herencia;

public class Silla extends Asiento{

	public Silla(String nombre, String familia, int numeroPatas) {
		super(nombre, familia, numeroPatas);
		
	}

}

package com.trifulcas.herencia;

public class Sillon extends Asiento {

	public Sillon(String nombre, String familia, int numeroPatas) {
		super(nombre, familia, numeroPatas);
	}

}

package com.trifulcas.herencia;

public class Vehiculo {
	protected int velocidad;
	protected int direccion;
	
	public void acelerar() {
		velocidad+=10;
		if (velocidad>200) {
			velocidad=200;
		}
	}
	public void frenar() {
		velocidad-=10;
		if (velocidad<0) {
			velocidad=0;
		}
	}
	public void izquierda() {
		direccion+=10;
		if (direccion>=360) {
			direccion-=360;
		}
	}
	public void derecha() {
		direccion-=10;
		if (direccion<0) {
			direccion+=360;
		}
	}
	@Override
	public String toString() {
		return "Vehiculo [velocidad=" + velocidad + ", direccion=" + direccion + "]";
	}
	
}

package com.trifulcas.herencia;

public class Coche extends Vehiculo {
	public void acelerar() {
		velocidad+=10;
		if (velocidad>150) {
			velocidad=150;
		}
	}
}

package com.trifulcas.herencia;

public class Bicicleta extends Vehiculo {
	public void acelerar() {
		velocidad+=3;
		if (velocidad>200) {
			velocidad=200;
		}
	}
	public void frenar() {
		velocidad-=3;
		if (velocidad<0) {
			velocidad=0;
		}
	}
}

package com.trifulcas.herencia;

public class Tanque extends Vehiculo {
	public void izquierda() {
		direccion+=90;
		if (direccion>=360) {
			direccion-=360;
		}
	}
	public void derecha() {
		direccion-=90;
		if (direccion<0) {
			direccion+=360;
		}
	}
}

Empleados v 2.0

package com.trifulcas.herencia;

public class Empleado {
	private String nombre;
	// Visible dentro de la propia clase y sus derivadas
	protected double sueldo;
	private double irpf=.85;
	
	
	public Empleado(String nombre, double sueldo) {
		super();
		this.nombre = nombre;
		this.sueldo = sueldo;
	}
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the sueldo
	 */
	public double getSueldo() {
		return sueldo;
	}
	/**
	 * @param sueldo the sueldo to set
	 */
	public void setSueldo(double sueldo) {
		this.sueldo = sueldo;
	}
	
	@Override
	public String toString() {
		return "Empleado [nombre=" + nombre + ", sueldo=" + sueldo + "]";
	}
	
	public double sueldoNeto() {
		return sueldo*irpf;
	}
	
}

package com.trifulcas.herencia;

public class Comercial extends Empleado {
	
	private double comision;
	private double ventas;
	
	public Comercial(String nombre, double sueldo, double comision) {
		// Llamo al constructor de la clase madre
		super(nombre, sueldo);
		// Inicializo las propiedades de mi propia clase
		this.comision=comision;
	}
	
	/**
	 * @return the comision
	 */
	public double getComision() {
		return comision;
	}
	/**
	 * @param comision the comision to set
	 */
	public void setComision(double comision) {
		this.comision = comision;
	}
	/**
	 * @return the ventas
	 */
	public double getVentas() {
		return ventas;
	}
	/**
	 * @param ventas the ventas to set
	 */
	public void setVentas(double ventas) {
		this.ventas = ventas;
	}
	// El sueldo de un comercial es el sueldo menos el irpf
	// mas la comisión por las ventas
	// SObre escribo el método
	@Override
	public double sueldoNeto() {
		// Llamo al método de la clase madre que estoy sobreescribiendo
		// con la palabra reservada super
		return super.sueldoNeto()+comision*ventas;
	}
	
}

package com.trifulcas.herencia;

public class Administrativo extends Empleado {
	private String departamento;
	private int antiguedad=0;
	
	/**
	 * @return the departamento
	 */
	public String getDepartamento() {
		return departamento;
	}


	/**
	 * @param departamento the departamento to set
	 */
	public void setDepartamento(String departamento) {
		this.departamento = departamento;
	}


	/**
	 * @return the antiguedad
	 */
	public int getAntiguedad() {
		return antiguedad;
	}


	/**
	 * @param antiguedad the antiguedad to set
	 */
	public void setAntiguedad(int antiguedad) {
		this.antiguedad = antiguedad;
	}


	public Administrativo(String nombre, double sueldo) {
		super(nombre, sueldo);
		// TODO Auto-generated constructor stub
	}

	@Override
	public double sueldoNeto() {
		// Llamo al método de la clase madre que estoy sobreescribiendo
		// con la palabra reservada super
		return super.sueldoNeto()+antiguedad*100;
	}
}

Empleado ana = new Empleado("Ana", 3000);

		System.out.println(ana);
		System.out.println(ana.sueldoNeto());

		Comercial eva = new Comercial("Eva", 2500, 0.05);

		eva.setComision(0.05);
		eva.setVentas(10000);
		System.out.println(eva);
		System.out.println(eva.sueldoNeto());
		
		Administrativo pepe=new Administrativo("Pepe",2000);
		pepe.setAntiguedad(20);
		System.out.println(pepe.sueldoNeto());

// Estoy creando una lista de empleados
		ArrayList<Empleado> empresa=new ArrayList<>();
		
		// Añado ana porque es empleado
		empresa.add(ana);
		// Puedo añadir eva porque deriva de empleado
		empresa.add(eva);
		// Puedo añadir a pepe por la misma razón
		empresa.add(pepe);
		
		// Polimorfismo
		// Polimorfismo es utilizar métodos comunes en clases derivadas
		// Aunque tengan comportamientos diferentes
		// Yo puedo hacer lo siguiente:
		for(Empleado emp:empresa) {
			System.out.println(emp.getNombre() + " - " + emp.sueldoNeto());
			
		}

Sobreescritura

package com.trifulcas.herencia;

public class Empleado {
	private String nombre;
	private double sueldo;
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the sueldo
	 */
	public double getSueldo() {
		return sueldo;
	}
	/**
	 * @param sueldo the sueldo to set
	 */
	public void setSueldo(double sueldo) {
		this.sueldo = sueldo;
	}
	
	@Override
	public String toString() {
		return "Empleado [nombre=" + nombre + ", sueldo=" + sueldo + "]";
	}
	
	public double sueldoNeto() {
		return sueldo*.85;
	}
	
}

package com.trifulcas.herencia;

public class Comercial extends Empleado {
	private double comision;
	private double ventas;
	/**
	 * @return the comision
	 */
	public double getComision() {
		return comision;
	}
	/**
	 * @param comision the comision to set
	 */
	public void setComision(double comision) {
		this.comision = comision;
	}
	/**
	 * @return the ventas
	 */
	public double getVentas() {
		return ventas;
	}
	/**
	 * @param ventas the ventas to set
	 */
	public void setVentas(double ventas) {
		this.ventas = ventas;
	}
	// El sueldo de un comercial es el sueldo menos el irpf
	// mas la comisión por las ventas
	// SObre escribo el método de la clase madre
	@Override
	public double sueldoNeto() {
		return getSueldo()*.85+comision*ventas;
	}
	
}

Empleado ana=new Empleado();
		ana.setNombre("Ana");
		ana.setSueldo(3000);
		System.out.println(ana);
		System.out.println(ana.sueldoNeto());
		
		Comercial eva=new Comercial();
		eva.setNombre("Eva");
		eva.setSueldo(2500);
		eva.setComision(0.05);
		eva.setVentas(10000);
		System.out.println(eva);
		System.out.println(eva.sueldoNeto());

Herencia primera parte: Un ejemplo

En java las clases pueden tener clases derivadas o dicho de otra manera una clase puede extender a otra.
La clase derivada o hija HEREDA todas las propiedades de la clase madre.

package com.trifulcas.herencia;

public class Animal {
	private String nombre;
	private int patas;
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the patas
	 */
	public int getPatas() {
		return patas;
	}
	/**
	 * @param patas the patas to set
	 */
	public void setPatas(int patas) {
		this.patas = patas;
	}
	public void hacerRuido() {
		System.out.println("Grrr");
	}
}

package com.trifulcas.herencia;

public class Mamifero extends Animal {
	private int mesesLactancia;

	/**
	 * @return the mesesLactancia
	 */
	public int getMesesLactancia() {
		return mesesLactancia;
	}

	/**
	 * @param mesesLactancia the mesesLactancia to set
	 */
	public void setMesesLactancia(int mesesLactancia) {
		this.mesesLactancia = mesesLactancia;
	}
	
}

package com.trifulcas.herencia;

public class Insecto extends Animal {

}

package com.trifulcas.herencia;

public class Perro extends Mamifero {
	private String raza;

	/**
	 * @return the raza
	 */
	public String getRaza() {
		return raza;
	}

	/**
	 * @param raza the raza to set
	 */
	public void setRaza(String raza) {
		this.raza = raza;
	}
	
}

	Animal prueba=new Animal();
		prueba.setNombre("Bicho");
		prueba.setPatas(18);
		// Mamifero extiende la clase animal
		// Y por lo tanto HEREDA todas sus propiedades y métodos
		Perro michucho=new Perro();
		// toString lo hereda de Object
		System.out.println(michucho.toString());
		// setNombre lo hereda de animal
		michucho.setNombre("firulai");
		// setMeseslactancia de mamifero
		michucho.setMesesLactancia(8);
		// setRaza de Perro
		michucho.setRaza("Bulldog");
		
		/*
		 * ANIMAL
		 * 
		 * MAMIfERO
		 * 
		 * PERRO Hereda todas las propiedades de mamifero y animal
		 * 
		 */

Ejemplo clases anidadas

package com.trifulcas.oop;

public class Asignatura {
	private String nombre;
	private int nota;
	public Asignatura(String nombre, int nota) {
		super();
		this.nombre = nombre;
		this.nota = nota;
	}
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the nota
	 */
	public int getNota() {
		return nota;
	}
	/**
	 * @param nota the nota to set
	 */
	public void setNota(int nota) {
		this.nota = nota;
	}
	@Override
	public String toString() {
		return "Asignatura [nombre=" + nombre + ", nota=" + nota + "]";
	}
	
}

package com.trifulcas.oop;

import java.util.ArrayList;

// La sintaxis de una clase es muy sencilla 'class'
public class Alumno {
	private String nombre;
	private String email;
	ArrayList<Asignatura> asignaturas;
	Alumno(String nombre){
		this.nombre=nombre;
		asignaturas=new ArrayList<>();
	}
	public void addAsignatura(Asignatura asignatura) {
		asignaturas.add(asignatura);
	}
	public void removeAsignatura(String nombre) {
		for (Asignatura asignatura:asignaturas) {
			if (asignatura.getNombre().equals(nombre)) {
				asignaturas.remove(asignatura);
			}
		}
	}
	public Asignatura mejorNota() {
		if (asignaturas.size()==0) {
			return null;
		}
		Asignatura mejor=asignaturas.get(0);
		for (Asignatura asignatura:asignaturas) {
			if (asignatura.getNota()>mejor.getNota()) {
				mejor=asignatura;
			}
		}
		return mejor;
	}
	/**
	 * @return the asignaturas
	 */
	public ArrayList<Asignatura> getAsignaturas() {
		return asignaturas;
	}
	/**
	 * @param asignaturas the asignaturas to set
	 */
	public void setAsignaturas(ArrayList<Asignatura> asignaturas) {
		this.asignaturas = asignaturas;
	}
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}
	/**
	 * @param email the email to set
	 */
	public void setEmail(String email) {
		this.email = email;
	}
	@Override
	public String toString() {
		return "Alumno [nombre=" + nombre + ", email=" + email+",asignaturas="+asignaturas + "]";
	}
	
	
}

package com.trifulcas.oop;

import java.util.ArrayList;

public class Aula {
	private String nombre;
	private ArrayList<Alumno> alumnos;
	public Aula(String nombre) {
		super();
		this.nombre = nombre;
		alumnos=new ArrayList<>();
	}
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the alumnos
	 */
	public ArrayList<Alumno> getAlumnos() {
		return alumnos;
	}
	/**
	 * @param alumnos the alumnos to set
	 */
	public void setAlumnos(ArrayList<Alumno> alumnos) {
		this.alumnos = alumnos;
	}
	@Override
	public String toString() {
		return "Aula [nombre=" + nombre + ", alumnos=" + alumnos + "]";
	}
	
}

Asignatura js=new Asignatura("Javascript",5);
		Asignatura c=new Asignatura("C#",7);
		Asignatura java=new Asignatura("Java",8);
		Alumno ana=new Alumno("Ana");
		ana.addAsignatura(java);
		ana.addAsignatura(js);
		ana.addAsignatura(c);
		System.out.println(ana);
		System.out.println(ana.mejorNota());
		
		Aula thecorner=new Aula("TheCorner");
		thecorner.getAlumnos().add(ana);
		System.out.println(thecorner);

Tarea: crear una alumna llamada eva que tenga las siguientes asignaturas: java,7 : React,8 : HTML : 6 y añadirlo a thecorner

Solución ejercicios clases

package com.trifulcas.oop;

public class Libro {
	private String titulo;
	private String autor;
	private int numeroDePaginas;
	public Libro(String titulo, String autor, int numeroDePaginas) {
		super();
		this.titulo = titulo;
		this.autor = autor;
		this.numeroDePaginas = numeroDePaginas;
	}
	/**
	 * @return the titulo
	 */
	public String getTitulo() {
		return titulo;
	}
	/**
	 * @param titulo the titulo to set
	 */
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	/**
	 * @return the autor
	 */
	public String getAutor() {
		return autor;
	}
	/**
	 * @param autor the autor to set
	 */
	public void setAutor(String autor) {
		this.autor = autor;
	}
	/**
	 * @return the numeroDePaginas
	 */
	public int getNumeroDePaginas() {
		return numeroDePaginas;
	}
	/**
	 * @param numeroDePaginas the numeroDePaginas to set
	 */
	public void setNumeroDePaginas(int numeroDePaginas) {
		this.numeroDePaginas = numeroDePaginas;
	}
	@Override
	public String toString() {
		return "Libro [titulo=" + titulo + ", autor=" + autor + ", numeroDePaginas=" + numeroDePaginas + "]";
	}
	
	
}

package com.trifulcas.oop;

public class TV {
	private String marca;
	private int canal;
	private int volumen;

	public TV(String marca) {
		this.marca = marca;
		reiniciarTV();
	}

	/**
	 * @return the marca
	 */
	public String getMarca() {
		return marca;
	}

	/**
	 * @param marca the marca to set
	 */
	public void setMarca(String marca) {
		this.marca = marca;
	}

	/**
	 * @return the canal
	 */
	public int getCanal() {
		return canal;
	}

	/**
	 * @param canal the canal to set
	 */
	public void setCanal(int canal) {
		if (canal >= 1 && canal <= 50) {
			this.canal = canal;
		}
	}

	public void aumentar() {
		if (volumen < 100) {
			volumen++;
		}
	}

	public void disminuir() {
		if (volumen > 0) {
			volumen--;
		}
	}

	public void reiniciarTV() {
		canal = 1;
		volumen = 50;
	}

	@Override
	public String toString() {
		return marca + " en el canal " + canal + ", volumen " + volumen;
	}

}

package com.trifulcas.oop;

public class Complejo {
	private float real;
	private float imaginaria;
	public Complejo(float real, float imaginaria) {
		this.real = real;
		this.imaginaria = imaginaria;
	}
	public Complejo() {
		real=0;
		imaginaria=0;
	}
	/**
	 * @return the real
	 */
	public float getReal() {
		return real;
	}
	/**
	 * @param real the real to set
	 */
	public void setReal(float real) {
		this.real = real;
	}
	/**
	 * @return the imaginaria
	 */
	public float getImaginaria() {
		return imaginaria;
	}
	/**
	 * @param imaginaria the imaginaria to set
	 */
	public void setImaginaria(float imaginaria) {
		this.imaginaria = imaginaria;
	}
	public void sumar(Complejo c) {
		real+=c.real;
		imaginaria+=c.imaginaria;
	}
	public boolean igual(Complejo c) {
		return real==c.real && imaginaria==c.imaginaria;
	}
	public float getAbsoluto() {
		return (float) Math.sqrt(imaginaria*imaginaria+real*real);
	}
	@Override
	public String toString() {
		return  + real +" + " + imaginaria + "i";
	}
	
}

Libro quijote = new Libro("Quijote", "Cervantes", 800);
		System.out.println(quijote);
		TV pana = new TV("Panasonic");
		System.out.println(pana);
		for (int i = 0; i < 100; i++) {
			pana.aumentar();
		}
		pana.setCanal(270);
		System.out.println(pana);
		Complejo a=new Complejo(1,2);
		Complejo b=new Complejo(3,4);
		System.out.println(a.getImaginaria());
		System.out.println(a.getAbsoluto());
		System.out.println(a);
		a.sumar(b);
		System.out.println(a);

Setters y Getters

package com.trifulcas.oop;

public class Cliente {
	private String nombre;
	private String email;
	private String direccion;
	private String password;
	private double sueldo;

	public Cliente(String nombre, String email, String direccion) {
		this.nombre = nombre;
		this.email = email;
		this.direccion = direccion;
	}

	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return "Don "+nombre;
	}

	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		if (nombre.length() > 2) {
			this.nombre = nombre;
		}
	}

	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}


	/**
	 * @return the direccion
	 */
	public String getDireccion() {
		return direccion;
	}

	/**
	 * @param direccion the direccion to set
	 */
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * @return the direccion
	 */
	public double getSueldoBruto() {
		return sueldo*.85;
	}

	/**
	 * @param direccion the direccion to set
	 */
	public void setSueldoBruto(double sueldo) {
		this.sueldo = sueldo/.85;
	}
	@Override
	public String toString() {
		return "Cliente [nombre=" + nombre + ", email=" + email + ", direccion=" + direccion + "]";
	}

}

Cliente pepe=new Cliente("José Pérez","pepe@pepe.com","Agla 6");
		
		System.out.println(pepe);
		
		System.out.println(pepe.getNombre());
		pepe.setNombre("J");
		System.out.println(pepe);
		System.out.println(pepe.getEmail());
		// No puedo pepe.setMail
		// Mail es de solo lectura
		// password es de solo escritura
		pepe.setPassword("1234");
		// No puedo System.out.println(pepe.getPassword());

Ejemplo modificadores acceso

public class Coche {
	public String marca;
	private int velocidad=0;
	private int velocidadMaxima=150;
	
	public Coche(String marca) {
		this.marca = marca;
	}
	public void acelerar() {
		System.out.println("brum brum");
		
		velocidad+=10;
		if (velocidad>velocidadMaxima) {
			velocidad=velocidadMaxima;
		}
	}
	public void frenar() {
		System.out.println("Ñññic");
		
		velocidad-=10;
		if (velocidad<0) {
			velocidad=0;
		}
	}
	@Override
	public String toString() {
		return "Coche [marca=" + marca + ", velocidad=" + velocidad + "]";
	}
	
}
Coche seat=new Coche("Seat Panda");
		System.out.println(seat);
		seat.frenar();
		System.out.println(seat);
		for(int i=0;i<20;i++) {
			seat.acelerar();
			System.out.println(seat);
		}