三大特性:封装、继承、多态
封装
什么是封装
设为私有属性 报错了
公共访问方法 可以添加两个方法,来访问私有对象 并且,可以在方法做一些限制,让输入的数据保持合法
set和get方法的快速生成快捷键
将实例变量变为私有
Alt + shift + s 自动生成
封装总结
综合案例实现
1、创建用户类
创建实例
创建无参构造方法和带参构造方法
创建set和get方法
2.创建银行类 == 是比较内存地址是否相同,equals 是比较内存地址上面的值是否相同
package com.zyy.fourth;
import java.util.Scanner;
public class Bank {
private User[] users = new User[5];
private int size;
public void initial() {
User user1 = new User();
user1.setCardNo("6333000123");
user1.setIdentity("5000431");
user1.setUsername("张三");
user1.setPassword("123456");
user1.setPhone("3456123");
user1.setBalance(10000);
User user2 = new User("6333000752", "5000900", "李四", "632134", "7824619", 20000);
users[size++] = user1;
users[size++] = user2;
}
public Bank() {
initial();
System.out.println("用户初始化完成");
}
public void login() {
Scanner input = new Scanner(System.in);
System.out.println("请输入卡号: ");
String cardNo = input.next();
System.out.println("请输入密码: ");
String password = input.next();
User u = null;
for (int i = 0; i < size; i++) {
if (users[i].getCardNo().equals(cardNo)&&users[i].getPassword().equals(password)) {
u = users[i];
break;
}
}
if (u != null) {
showMinu(u);
}else {
System.out.println("卡号或密码错误...");
}
}
public void showMinu(User u) {
Scanner input = new Scanner(System.in);
do {
System.out.println("================欢迎进入xxx银行=====" + u.getUsername() + "==========");
System.out.println("===1.存款 2.取款 3.转账 4.查询余额 5.修改密码 0.退出===");
System.out.println("请输入要操作的选项: ");
int choice = input.nextInt();
switch (choice) {
case 1:
this.save(u);
break;
case 2:
this.withDrow(u);
break;
case 3:
this.trans(u);
break;
case 4:
this.printBalance(u);
break;
case 5:
this.modifyPassword(u);
break;
case 0:
return;
default:
break;
}
} while (true);
}
public void save(User u) {
Scanner input = new Scanner(System.in);
System.out.println("请输入要存钱的金额: ");
double m = input.nextDouble();
if(m > 0) {
u.setBalance(u.getBalance() + m);
System.out.println("存钱成功 余额: " + u.getBalance());
}
else {
System.out.println("存钱失败");
}
}
public void withDrow(User u) {
Scanner input = new Scanner(System.in);
System.out.println("请输入要取钱的金额: ");
double m = input.nextDouble();
if(m > 0 && m <= u.getBalance()) {
u.setBalance(u.getBalance() - m);
System.out.println("取钱成功 余额: " + u.getBalance());
}
else {
System.out.println("取钱失败");
}
}
public void trans(User u) {
User toUser = null;
Scanner input = new Scanner(System.in);
System.out.println("请输入对方的卡号: ");
String cardOn = input.next();
for (int i = 0; i < size; i++) {
if(users[i].getCardNo().equals(cardOn)) {
toUser = users[i];
break;
}
}
if(toUser != null) {
System.out.println("请输入要转账的金额: ");
double m = input.nextDouble();
if(m <= u.getBalance()) {
u.setBalance(u.getBalance() - m);
toUser.setBalance(toUser.getBalance() + m);
System.out.println("转账成功");
}
else {
System.out.println("金额有误");
}
}
else {
System.out.println("没有该用户");
}
}
public void printBalance(User u) {
System.out.println("余额为: " + u.getBalance());
}
public void modifyPassword(User u) {
Scanner input = new Scanner(System.in);
System.out.println("请输入要修改的密码: ");
String password = input.next();
if(password.length() == 6) {
u.setPassword(password);
}
else {
System.out.println("输入密码有误");
}
}
}
继承
父类的选择与抽取
父类抽取案例
以上图为例 狗狗类
鸟类
鱼类
蛇类
父类–动物类 我们会发现,这几种类都有相同的实例变量和方法,因此,我们可以整合起来,创建一个父类
此时,将狗、鸟、鱼、蛇类继承父类–动物类 将与父类重复的内容删掉
比如狗继承动物,动物继承生物,那么狗就有生物的属性和方法
不可继承的部分
访问修饰符
public-公开
protected-保护 什么都不加,实例变量属性默认是protected private-私有
方法的覆盖
快速添加重写 直接输入父类的方法名 不遵循重写规则,就会报错
super的使用方法1
加上super
super访问属性
子类对象的创建过程
先构造父类 A,然后构造子类B
super的使用方法2
super调用父类的无参构造方法 super();必须是第一句,系统自动加上 super调用父类的带参构造方法
this与super的区别
多态
多态的概念
多态的方法覆盖
使用的是子类的方法
多态的应用
场景1 如果我有更多的动物,这样写实在是太累了,因此,我们就可以用Animal父类来代替这些子类
应用场景2
向上转型 与 向下转型
向上转型(装箱)
向下转型(拆箱)
类型转换异常与instanceof关键字
没有转型成真正原来的类型
多态总结
|