@[toc] 代码这种不能只看,还得多敲啊
day05
pack关键字的使用
- 为了更好的实现项目中的管理,提供包的概念
- 使用package声明类或接口所属的包,声明在源文件的首行
- 包,属性标识符,遵循标识符的命名规则,规范(xxxyyyyzzzz),见名知意
- 每"."一次,代表一层文件目录
import关键字的使用
-
在源文件中显示的同时import结构导入指定包下的类、接口
-
声明在包的声明和类的声明之间
-
需要导入多个结构,并列写出就可以
-
也可以使"xxx.*"的方式导入xxx这个包下的所有结构
-
如果使用的类或接口是lang包下定义的,则可以省略Import
-
如果使用的类或者接口是在同一包内,就可以省略
-
如果在源文件中,使用了不同包下的同名的类,则必须至少有一个用全类名的方式显示。
-
import static组合的使用,调用指定类或者接口下静态的属性或者方法。
com.atguigu.exer.Account account;//全类名的方式
MVC设计模式
是一种常见的设计模式之一:将程序分为三个层次:视图模型层,控制器层与数据模型层。
客户信息管理系统的练习
package com.atguigu.java;
//用来封装客户信息
public class Customer {
private String name;
private char gender;
private int age;
private String phone;
private String email;
public Customer() {
}
public Customer(String name, char gender, int age, String phone, String email) {
this.name = name;
this.gender = gender;
this.age = age;
this.phone = phone;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.atguigu.java;
//customer对象的管理模块,内部用数组管理一组customer对象
//并进行增删改查
//
public class CustomerList {
private Customer[] customers;
private int total = 0;
public CustomerList(int totalCustomer) {
customers = new Customer[totalCustomer];
}
public CustomerList() {
}
public boolean addCustomer(Customer customer){
if(total >= customers.length){
return false;
}
customers[total++] = customer;
return true;
}
public boolean replaceCustomer(int index,Customer customer){
if(index < 0 || index >= total){
return false;
}
customers[index] = customer;
return true;
}
public boolean deleteCustomer(int index){
if(index < 0 || index >= total){
return false;
}
for(int i = index;i < total - 1;i++){
customers[i] = customers[i++];
}
customers[--total] = null;
return true;
}
public Customer[] getAllCustomers(){
Customer[] custs = new Customer[total];
for(int i = 0;i < total;i++){
custs[i] = customers[i];
}
return custs;
}
public Customer getCustomer(int index){
if(index < 0 || index >= total){
return null;
}
return customers[index];
}
public int getTotal(){
return total;
}
}
package com.atguigu.java;
import java.util.Scanner;
public class CustomerView {
private CustomerList customerList = new CustomerList(10);
private Scanner sc = new Scanner(System.in);
public CustomerView(){
Customer customer = new Customer("张三",'男',20,"123450150","12312@136.com");
customerList.addCustomer(customer);
}
public void enterMainMenu(){
boolean isFlag = true;
while (isFlag) {
System.out.println("\n-------------客户信息管理软件---------------");
System.out.println(" 1 添加客户");
System.out.println(" 2 修改客户");
System.out.println(" 3 删除客户");
System.out.println(" 4 客户列表");
System.out.println(" 5 退出 ");
System.out.print(" 请选择(1-5):");
int index = sc.nextInt();
if(!(index == 1 || index == 2 || index == 3 || index == 4 || index == 5)){
System.out.println("选择错误请重新输入");
continue;
}
switch (index){
case 1:
addNewCustomer();
break;
case 2:
modifyCustomer();
break;
case 3:
deleteCustomer();
break;
case 4:
showAllCustomer();
break;
case 5:
System.out.println("确认是否退出:Y/N");
char isExit = sc.next().toUpperCase().charAt(0);
if(isExit == 'Y'){
System.exit(0);
}
}
}
}
public void addNewCustomer(){
System.out.println("添加客户的操作");
System.out.print("姓名:");
String name = sc.next();
System.out.print("性别:");
char gender = sc.next().charAt(0);
System.out.print("年龄:");
int age = sc.nextInt();
System.out.print("电话:");
String phone = sc.next();
System.out.print("邮箱:");
String email = sc.next();
Customer customer = new Customer(name,gender,age,phone,email);
boolean flag = customerList.addCustomer(customer);
if(!flag){
System.out.println("添加失败");
return;
}
System.out.println("添加成功");
}
public void modifyCustomer(){
System.out.println("-----------------修改客户---------------");
Customer customer = null;
int number = 0;
for(;;) {
System.out.println("请输入选择待修改客户编号(-1退出)");
int index = sc.nextInt();
if(index == -1){
return;
}
customer = customerList.getCustomer(index-1);
if(customer == null){
System.out.println("无法找到指定用户");
}else {
//找到了指定的用户
number = index-1;
break;
}
}
//修改用户
System.out.print("姓名(" + customer.getName() + "):");
String name = sc.next();
System.out.print("性别(" + customer.getGender() + "):");
char gender = sc.next().charAt(0);
System.out.print("年龄(" + customer.getAge() + "):");
int age = sc.nextInt();
System.out.print("电话(" + customer.getPhone() + "):");
String phone = sc.next();
System.out.print("邮箱(" + customer.getEmail() + "):");
String email = sc.next();
Customer customer1 = new Customer(name,gender,age,phone,email);
boolean flag = customerList.replaceCustomer(number,customer1);
if(!flag){
System.out.println("修改失败");
return;
}
System.out.println("修改成功");
}
public void deleteCustomer(){
System.out.println("-----------------删除客户---------------");
int number;
for(;;){
System.out.println("请选择删除客户编号(-1退出)");
number = sc.nextInt();
if(number == -1){
return;
}
Customer customer = customerList.getCustomer(number - 1);
if(customer == null){
System.out.println("无法找到指定指定用户");
}else{
break;
}
}
System.out.print("是否删除(Y/N):");
char isDelete = sc.next().toUpperCase().charAt(0);
if(isDelete == 'Y'){
customerList.deleteCustomer(number - 1);
System.out.println("删除成功");
}else{
return;
}
}
public void showAllCustomer(){
System.out.println("-----------------客户列表---------------");
int total = customerList.getTotal();
if(total == 0){
System.out.println(" 没有客户记录");
}else{
System.out.println("编号\t姓名\t性别\t年龄\t电话\t\t\t邮箱");
Customer[] customers = customerList.getAllCustomers();
for (int i = 0; i < customers.length; i++) {
Customer c = customers[i];
System.out.println(i+1 + "\t" + c.getName() + "\t" + c.getGender() + "\t" + c.getAge() + "\t" + c.getPhone() + "\t" + c.getEmail());
}
}
System.out.println("-----------------客户列表完成---------------");
}
public static void main(String[] args) {
CustomerView view = new CustomerView();
view.enterMainMenu();
}
}
面向对象的特征之二:继承性
继承的好处
- 减少了代码的冗余,提高了复用性
- 便于功能的扩展
- 为之后多态的使用,提供了前提
继承的格式 :
class A extends B(){}
A:子类、派生类、subclass
B:父类,超类,基类、superclass
体现:一旦子类A继承父类B以后,子类A中就获取到了父类B声明的结构,属性,方法。
子类继承父类以后,还可以声明自己特有的属性或方法,实现功能的扩展。
Java中关于继承性的规定
- 一个父类可以被多个子类继承
- Java中类的单继承:一个类只能有一个父类
- 子类直接继承父类:直接父类。间接继承父类:间接父类。
- 子类继承父类后,自动获取直接父类和所有间接父类中声明的属性和方法。
方法重写(override/overwirte)
- 重写,子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作。
- 应用:重写方法后,当创建子类对象以后,通过子类对象调用父类中的同名同参数的方法时,执行的是子类重写父类的方法。
- 重写的规定:
- 子类重写的方法的方法名和形参列表要和父类被重写的方法一致
- 子类重写的方法的权限修饰符不小于父类的方法权限 子类不能重写父类中被定义为private的方法
- 返回值类型:
- 父类被重写的方法的返回值类型时void,其子类重写的方法也必须是void
- 返回值类型为A时,子类方法的返回值类型可以是A或者A的子类
- 返回值类型为基本数据类型时,子类方法的返回值类型必须为一样的基本数据类型
super关键字
- super可以理解为父类的
- 通过super关键字可以调用父类的属性、构造器、方法。
- super的使用
- 我们可以在子类的方法或构造器中,通过"super.属性"或"super.方法"的方式去显式调用父类的属性或方法。
- 当子类和父类定义了同名的属性,需要用super.属性去调用父类的属性
- 子类重写了父类的方法,需要用父类的方法也需要用super.方法去调用
super构造器创建了子类对象,一定会直接或间接的调用父类的接口,一直调用知道Object类,这就是为什么类都有toString方法。
虽然创建了子类的对象是,调用了父类的构造器,但内存中只new了一个子类对象
面向对象特征之三:多态性
理解多态性:可以理解为一个事物的多种状态。
对象的多态性:父类的引用指向子类的对象。
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法—虚拟方法调用 有了对象的多态性以后,我们在编译器只能调用父类中声明的方法,而在运行时实际调用的子类的方法 总结:编译看左边,运行看右边
多态的前提:类的继承关系、方法要重写
对象的多态性,只适用于方法,不适用于属性
instanceof关键字
a instanceof A :判断对象a是不是类A的实例,是返回true,否返回false
使用情景是为了避免转型时出现ClassCastException,instanceof判断完之后再转型可以避免这一情况
如果B是A的父类 那么 a instanceof A为true时,a intanceof B也会为true。