Java Orientado a Objetos: Fin - orientacion a objs
This commit is contained in:
parent
f9e231a45d
commit
0f56c54d51
@ -1,7 +1,7 @@
|
|||||||
public class EjercicioMatriz {
|
public class EjercicioMatriz {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
for (int col = 0; col <= 10; col++){
|
for (int fila = 0; fila <= 10; fila++){
|
||||||
for (int fila = 0; fila < col; fila++){
|
for (int columna = 0; columna < fila; columna++){
|
||||||
System.out.print("* ");
|
System.out.print("* ");
|
||||||
}
|
}
|
||||||
System.out.println();
|
System.out.println();
|
||||||
|
@ -2,8 +2,10 @@ public class TestDescuento {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
double valorCompra = 250.0;
|
|
||||||
int dscto;
|
int dscto;
|
||||||
|
double valorDescuento, valorCompra, totalCompra;
|
||||||
|
valorCompra = 250.0;
|
||||||
|
|
||||||
if (valorCompra >= 100.0 && valorCompra <= 199.99){
|
if (valorCompra >= 100.0 && valorCompra <= 199.99){
|
||||||
dscto = 10;
|
dscto = 10;
|
||||||
} else if (valorCompra >= 200.0 && valorCompra <= 299.99) {
|
} else if (valorCompra >= 200.0 && valorCompra <= 299.99) {
|
||||||
@ -13,10 +15,11 @@ public class TestDescuento {
|
|||||||
} else {
|
} else {
|
||||||
dscto = 0;
|
dscto = 0;
|
||||||
}
|
}
|
||||||
double valorDescuento = valorCompra * (dscto / 100.00 );
|
|
||||||
double totalCompra = valorCompra - valorDescuento;
|
valorDescuento = valorCompra * (dscto / 100.00 );
|
||||||
|
totalCompra = valorCompra - valorDescuento;
|
||||||
System.out.println("Total compra : $"+valorCompra+"\n"+
|
System.out.println("Total compra : $"+valorCompra+"\n"+
|
||||||
"Descuento : "+dscto+"%\n"+
|
"Descuento : "+dscto+"%\n"+
|
||||||
" Total Final : $"+totalCompra);
|
" Total Final : $"+totalCompra);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
29
008_java_oo/intellij_idea/proyecto_bytebank/src/Cliente.java
Normal file
29
008_java_oo/intellij_idea/proyecto_bytebank/src/Cliente.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
public class Cliente {
|
||||||
|
private String nombre;
|
||||||
|
private String documento;
|
||||||
|
private String telefono;
|
||||||
|
|
||||||
|
public String getNombre() {
|
||||||
|
return nombre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNombre(String nombre) {
|
||||||
|
this.nombre = nombre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDocumento() {
|
||||||
|
return documento;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocumento(String documento) {
|
||||||
|
this.documento = documento;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTelefono() {
|
||||||
|
return telefono;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTelefono(String telefono) {
|
||||||
|
this.telefono = telefono;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
public class CrearCuenta {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta primeraCuenta = new Cuenta(1);
|
||||||
|
primeraCuenta.depositar(1000);
|
||||||
|
//primeraCuenta.pais = "Zambia"; No compila, no existe el atributo
|
||||||
|
System.out.println(primeraCuenta.getSaldo());
|
||||||
|
|
||||||
|
Cuenta segundaCuenta = new Cuenta(1);
|
||||||
|
//segundaCuenta.saldo = 500;
|
||||||
|
System.out.println(segundaCuenta.getSaldo());
|
||||||
|
//System.out.println(segundaCuenta.titular); null
|
||||||
|
//System.out.println(segundaCuenta.agencia); 0
|
||||||
|
}
|
||||||
|
}
|
67
008_java_oo/intellij_idea/proyecto_bytebank/src/Cuenta.java
Normal file
67
008_java_oo/intellij_idea/proyecto_bytebank/src/Cuenta.java
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// Entidad Cuenta
|
||||||
|
public class Cuenta {
|
||||||
|
private double saldo;
|
||||||
|
private int agencia;
|
||||||
|
private int numero;
|
||||||
|
private Cliente titular = new Cliente();
|
||||||
|
private static int contador = 0;
|
||||||
|
public Cuenta(int agencia) {
|
||||||
|
if (agencia <= 0) {
|
||||||
|
System.out.println("No se permiten valores negativos");
|
||||||
|
this.agencia = 1;
|
||||||
|
} else {
|
||||||
|
this.agencia = agencia;
|
||||||
|
}
|
||||||
|
contador++;
|
||||||
|
System.out.println("Cuentas creadas: "+contador);
|
||||||
|
}
|
||||||
|
public void depositar(double valorDeposito){
|
||||||
|
this.saldo += valorDeposito;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean retirar(double valorRetiro) {
|
||||||
|
if (this.saldo >= valorRetiro) {
|
||||||
|
this.saldo -= valorRetiro;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean transferir(double montoTransferencia, Cuenta cuenta){
|
||||||
|
if (montoTransferencia <= this.saldo) {
|
||||||
|
this.saldo -= montoTransferencia;
|
||||||
|
cuenta.depositar(montoTransferencia);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getSaldo() {
|
||||||
|
return this.saldo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAgencia(){
|
||||||
|
return this.agencia;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNumero(int numero){
|
||||||
|
this.numero = numero;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNumero(){
|
||||||
|
return this.numero;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitular(Cliente titular){
|
||||||
|
this.titular = titular;
|
||||||
|
}
|
||||||
|
public Cliente getTitular(){
|
||||||
|
return titular;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getContador(){
|
||||||
|
return Cuenta.contador;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
public class PruebaAcceso {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta cuenta = new Cuenta(1);
|
||||||
|
cuenta.retirar(300);
|
||||||
|
System.out.println(cuenta.getSaldo());
|
||||||
|
cuenta.depositar(300);
|
||||||
|
System.out.println(cuenta.getSaldo());
|
||||||
|
System.out.println(cuenta.getAgencia());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
public class PruebaConstructor {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta cuenta = new Cuenta(555);
|
||||||
|
//cuenta.setAgencia(-15);
|
||||||
|
System.out.println(cuenta.getAgencia());
|
||||||
|
Cuenta cuenta2 = new Cuenta(333);
|
||||||
|
Cuenta cuenta3 = new Cuenta(444);
|
||||||
|
System.out.println(Cuenta.getContador());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
public class PruebaEncapsulamiento {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta cuenta = new Cuenta(1);
|
||||||
|
Cliente cliente = new Cliente();
|
||||||
|
cliente.setNombre("Zerafín");
|
||||||
|
cliente.setDocumento("abcDEFghiJKL");
|
||||||
|
cuenta.setTitular(cliente);
|
||||||
|
|
||||||
|
System.out.println(cliente.getNombre());
|
||||||
|
System.out.println(cuenta.getTitular().getNombre());
|
||||||
|
|
||||||
|
Cliente titular = cuenta.getTitular();
|
||||||
|
System.out.println(titular.getNombre());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
public class PruebaMetodos {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta cuenta1 = new Cuenta(1);
|
||||||
|
cuenta1.depositar(300);
|
||||||
|
System.out.println(cuenta1.retirar(200));
|
||||||
|
System.out.println(cuenta1.getSaldo());
|
||||||
|
|
||||||
|
Cuenta cuenta2 = new Cuenta(1);
|
||||||
|
cuenta2.depositar(2000);
|
||||||
|
|
||||||
|
boolean puedeTransferir = cuenta2.transferir(400, cuenta1);
|
||||||
|
if (puedeTransferir) {
|
||||||
|
System.out.println("Transferencia exitosa");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
public class TestReferencia {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta primeraCuenta = new Cuenta(1);
|
||||||
|
primeraCuenta.depositar(200);
|
||||||
|
|
||||||
|
//Cuenta segundaCuenta = new Cuenta();
|
||||||
|
// System.out.println(primeraCuenta); // Cuenta@23fc625e
|
||||||
|
// System.out.println(segundaCuenta); // Cuenta@3f99bd52
|
||||||
|
|
||||||
|
Cuenta segundaCuenta = primeraCuenta;
|
||||||
|
segundaCuenta.depositar(100);
|
||||||
|
System.out.println("Saldo primera cuenta: " + primeraCuenta.getSaldo());
|
||||||
|
System.out.println("Saldo segunda cuenta: " + segundaCuenta.getSaldo());
|
||||||
|
|
||||||
|
segundaCuenta.depositar(400);
|
||||||
|
System.out.println("Saldo primera cuenta: " + primeraCuenta.getSaldo());
|
||||||
|
|
||||||
|
// Obtener referencia del objeto
|
||||||
|
System.out.println(primeraCuenta); // Cuenta@23fc625e
|
||||||
|
System.out.println(segundaCuenta); // Cuenta@23fc625e
|
||||||
|
|
||||||
|
if (primeraCuenta == segundaCuenta) {
|
||||||
|
System.out.println("Son el mismo objeto");
|
||||||
|
} else {
|
||||||
|
System.out.println("Son diferentes");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
public class TestReferencia2 {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cliente diego = new Cliente();
|
||||||
|
diego.setNombre("Diego");
|
||||||
|
diego.setDocumento("123.123.123-1");
|
||||||
|
|
||||||
|
Cuenta cuentaDiego = new Cuenta(1);
|
||||||
|
cuentaDiego.setTitular(diego);
|
||||||
|
System.out.println(cuentaDiego.getTitular().getDocumento());
|
||||||
|
|
||||||
|
// referencia
|
||||||
|
System.out.println(cuentaDiego.getTitular()); // Cliente@2a84aee7
|
||||||
|
System.out.println(diego); // Cliente@2a84aee7
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
public class TestReferencia3 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta cuentaDeDiego = new Cuenta(1);
|
||||||
|
//cuentaDeDiego.titular = new Cliente();
|
||||||
|
cuentaDeDiego.getTitular().setNombre("Diego");
|
||||||
|
System.out.println(cuentaDeDiego.getTitular().getNombre());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,189 @@
|
|||||||
|
# Java Entendiendo la [Orientación a Objetos](https://app.aluracursos.com/course/java-parte2-introduccion-orientada-objetos)
|
||||||
|
|
||||||
|
Diferencias con el paradigma **procedural**: se utilizó como práctica de
|
||||||
|
programación antes de la introducción de lenguajes orientados a objetos.
|
||||||
|
La necesidad de validar el numeroIdentidad en un formulario se utilizó como
|
||||||
|
ejemplo para discutir los principales problemas que pueden aparecer en este paradigma.
|
||||||
|
|
||||||
|
En particular, a medida que otros formularios y desarrolladores necesitan la misma
|
||||||
|
validación de numeroIdentidad, no fue fácil ver que ya había procedimientos y
|
||||||
|
funciones que hicieron este trabajo, ya que los datos y las funciones no tenían
|
||||||
|
un vínculo tan fuerte. Esto podría dar lugar a otra nueva función o fragmento de
|
||||||
|
código con una responsabilidad similar.
|
||||||
|
|
||||||
|
Además, conocemos la **idea central** del paradigma **orientado a objetos**, que
|
||||||
|
es **crear unidades de código que combinen los datos asociados con cierta
|
||||||
|
información con las funcionalidades aplicadas a esos datos** (por ejemplo,
|
||||||
|
numeroIdentidad + validación). Son los atributos y métodos.
|
||||||
|
|
||||||
|
## Introduccion a Orientación a Objetos
|
||||||
|
|
||||||
|
[proyecto_bytebank](./intellij_idea/proyecto_bytebank/src/)
|
||||||
|
|
||||||
|
- Se practican los conceptos de **Objeto**, **Atributos**, **Instancias**. Y se
|
||||||
|
ejemplifica un atributo de clase con valor predeterminado.
|
||||||
|
[Cuenta.java](./intellij_idea/proyecto_bytebank/src/Cuenta.java) y
|
||||||
|
[CrearCuenta.java](./intellij_idea/proyecto_bytebank/src/CrearCuenta.java)
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Entidad Cuenta
|
||||||
|
public class Cuenta {
|
||||||
|
double saldo;
|
||||||
|
//int agencia = 33;
|
||||||
|
int agencia;
|
||||||
|
int numero;
|
||||||
|
String titular;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class CrearCuenta {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta primeraCuenta = new Cuenta();
|
||||||
|
primeraCuenta.saldo = 1000;
|
||||||
|
//primeraCuenta.pais = "Zambia"; No compila, no existe el atributo
|
||||||
|
System.out.println(primeraCuenta.saldo);
|
||||||
|
|
||||||
|
Cuenta segundaCuenta = new Cuenta();
|
||||||
|
segundaCuenta.saldo = 500;
|
||||||
|
System.out.println(segundaCuenta.saldo);
|
||||||
|
//System.out.println(segundaCuenta.titular); null
|
||||||
|
//System.out.println(segundaCuenta.agencia); 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Se ejemplifica como un Objeto es una una referencia en memoria
|
||||||
|
[testReferencia](./intellij_idea/proyecto_bytebank/src/TestReferencia.java)
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class TestReferencia {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta primeraCuenta = new Cuenta();
|
||||||
|
primeraCuenta.saldo = 200;
|
||||||
|
|
||||||
|
//Cuenta segundaCuenta = new Cuenta();
|
||||||
|
// System.out.println(primeraCuenta); // Cuenta@23fc625e
|
||||||
|
// System.out.println(segundaCuenta); // Cuenta@3f99bd52
|
||||||
|
|
||||||
|
Cuenta segundaCuenta = primeraCuenta;
|
||||||
|
segundaCuenta.saldo = 100;
|
||||||
|
System.out.println("Saldo primera cuenta: " + primeraCuenta.saldo);
|
||||||
|
System.out.println("Saldo segunda cuenta: " + segundaCuenta.saldo);
|
||||||
|
|
||||||
|
segundaCuenta.saldo += 400;
|
||||||
|
System.out.println("Saldo primera cuenta: " + primeraCuenta.saldo);
|
||||||
|
|
||||||
|
// Obtener referencia del objeto
|
||||||
|
System.out.println(primeraCuenta); // Cuenta@23fc625e
|
||||||
|
System.out.println(segundaCuenta); // Cuenta@23fc625e
|
||||||
|
|
||||||
|
if (primeraCuenta == segundaCuenta) {
|
||||||
|
System.out.println("Son el mismo objeto");
|
||||||
|
} else {
|
||||||
|
System.out.println("Son diferentes");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Definicion de metodos con retorno y uso de *this* para atributos de clase
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Entidad Cuenta
|
||||||
|
public class Cuenta {
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
public void depositar(double valorDeposito){
|
||||||
|
this.saldo += valorDeposito;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean retirar(double valorRetiro) {
|
||||||
|
if (this.saldo >= valorRetiro) {
|
||||||
|
this.saldo -= valorRetiro;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean transferir(double montoTransferencia, Cuenta cuenta){
|
||||||
|
if (montoTransferencia <= this.saldo) {
|
||||||
|
this.saldo -= montoTransferencia;
|
||||||
|
cuenta.depositar(montoTransferencia);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class PruebaMetodos {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Cuenta cuenta1 = new Cuenta();
|
||||||
|
cuenta1.depositar(300);
|
||||||
|
System.out.println(cuenta1.retirar(200));
|
||||||
|
System.out.println(cuenta1.saldo);
|
||||||
|
|
||||||
|
Cuenta cuenta2 = new Cuenta();
|
||||||
|
cuenta2.depositar(2000);
|
||||||
|
|
||||||
|
boolean puedeTransferir = cuenta2.transferir(400, cuenta1);
|
||||||
|
if (puedeTransferir) {
|
||||||
|
System.out.println("Transferencia exitosa");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Ejemplo de `NullPointerException` al intentar acceder a un atributo de clase
|
||||||
|
de una instancia, cuyo valor es una Clase no instanciada.
|
||||||
|
[TestReferencia3.java](./intellij_idea/proyecto_bytebank/src/TestReferencia3.java)
|
||||||
|
|
||||||
|
- Encapsulamiento, modificadores de acceso
|
||||||
|
[Cuenta.java](./intellij_idea/proyecto_bytebank/src/Cuenta.java) y
|
||||||
|
[PruebaEncapsulamiento.java](./intellij_idea/proyecto_bytebank/src/PruebaEncapsulamiento.java).
|
||||||
|
Atributos privados, restringiendo el acceso a los atributos.
|
||||||
|
|
||||||
|
Encapsulación de código:
|
||||||
|
- **getters** Métodos de lectura de atributos
|
||||||
|
- **setters** Métodos para modificar atributos
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
- Variables de clase **static**. No pertenecen a la instancia.
|
||||||
|
```java
|
||||||
|
public class Cuenta {
|
||||||
|
...
|
||||||
|
private static int contador = 0;
|
||||||
|
|
||||||
|
|
||||||
|
public static int getContador(){
|
||||||
|
return Cuenta.contador;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Constructor** [Cuenta.java](./intellij_idea/proyecto_bytebank/src/Cuenta.java)
|
||||||
|
Permite recibir argumentos e inicializar atributos desde la creación de un objeto.
|
||||||
|
Con esto, la inicialización de los atributos recibidos en el constructor se vuelve
|
||||||
|
obligatoria. Atributos de clase, atributos estáticos. Métodos de clase, métodos
|
||||||
|
estáticos. Ausencia de referencia del **this** dentro de los métodos estáticos.
|
||||||
|
|
||||||
|
```java
|
||||||
|
public Cuenta(int agencia) {
|
||||||
|
if (agencia <= 0) {
|
||||||
|
System.out.println("No se permiten valores negativos");
|
||||||
|
this.agencia = 1;
|
||||||
|
} else {
|
||||||
|
this.agencia = agencia;
|
||||||
|
}
|
||||||
|
contador++;
|
||||||
|
System.out.println("Cuentas creadas: "+contador);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Lectura: Alura blog [¿Que es POO?](https://www.aluracursos.com/blog/poo-que-es-la-programacion-orientada-a-objetos)
|
@ -191,9 +191,9 @@ flowchart LR
|
|||||||
subgraph <b>JDK</b>
|
subgraph <b>JDK</b>
|
||||||
subgraph <b>JRE</b>
|
subgraph <b>JRE</b>
|
||||||
c(JVM)
|
c(JVM)
|
||||||
style c fill:#f9f,stroke:#333,stroke-width:2px
|
style c fill:#f9f,stroke:#000,stroke-width:2px
|
||||||
d(Librerías)
|
d(Librerías)
|
||||||
style d fill:#f9f,stroke:#333,stroke-width:2px
|
style d fill:#f9f,stroke:#000,stroke-width:2px
|
||||||
end
|
end
|
||||||
a(Tools)
|
a(Tools)
|
||||||
end
|
end
|
||||||
@ -441,6 +441,8 @@ Funcionamiento del cast implícito y explícito en la sgte. tabla.
|
|||||||
|
|
||||||
### Char y String
|
### Char y String
|
||||||
|
|
||||||
|
String [format()](https://www.javatpoint.com/java-string-format)
|
||||||
|
|
||||||
[EjemploCaracteres.java](./intellij_idea/java_primeros_pasos/src/EjemploCaracteres.java)
|
[EjemploCaracteres.java](./intellij_idea/java_primeros_pasos/src/EjemploCaracteres.java)
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@ -696,8 +698,8 @@ public class TablaMultiplicacion {
|
|||||||
```java
|
```java
|
||||||
public class EjercicioMatriz {
|
public class EjercicioMatriz {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
for (int col = 0; col <= 10; col++){
|
for (int fila = 0; fila <= 10; fila++){
|
||||||
for (int fila = 0; fila < col; fila++){
|
for (int columna = 0; columna < fila; columna++){
|
||||||
System.out.print("* ");
|
System.out.print("* ");
|
||||||
}
|
}
|
||||||
System.out.println();
|
System.out.println();
|
||||||
|
Loading…
Reference in New Issue
Block a user