文章目录

  • 面向对象
  • 方法
    • 概念
    • 如何调用方法
    • 通过类名调用
      • Math类
    • 通过对象调用
    • 在同一个类中,方法A调用方法B
    • 自定义方法
    • 方法的分类
    • 总结
  • 两种编程思想
    • 面向过程编程
    • 面向对象编程
    • 不同思想处理同一个问题
    • 总结
  • 类和对象
    • 类Class
    • 定义类
    • 对象Object
    • 创建对象
    • 类和对象的关系
  • 成员变量和局部变量
    • 成员变量
    • 局部变量
  • 构造方法
    • 概念
    • 特点
  • 包package
    • 包的命名
    • 导入包
  • 面向对象的三大特性--封装
    • 封装
    • 步骤
    • 使用IDEA自动生成getter/setter方法
  • Java程序运行时的内存变化
  • 面向对象三大特性--继承
    • 继承
    • 继承的特点
  • 方法重写override
    • 方法重写要求
  • 方法重载overload
    • 方法重载要求
  • 重载与重写相关面试题
    • this和super关键字
      • 当做对象使用
      • 当做构造方法使用
      • 注意
  • 访问修饰符
    • 访问权限表
  • final关键字
    • 修饰属性
    • 修饰方法
    • 修饰类
  • Object类
  • 对象造型/对象转型
    • 向下转型
    • 向上转型
  • 重写equals方法
    • 在IDEA中自动生成equals方法
  • 面向对象三大特性--多态
    • 概念
    • 多态的应用
    • 多态的实现条件
    • 多态案例--花木兰替父从军
  • 抽象abstract
    • 修饰方法
    • 修饰类
    • abstract关键字特点
      • 修饰类:被修饰的类称为抽象类
      • 修饰方法:被修饰的方法称为抽象方法
      • 抽象相关面试题
  • 接口interface
    • extends和implements
      • 类A extends 类B
      • 类A implements 接口A,接口B...
      • 接口A extends 接口B
      • 类A extends 类B implements 接口A,接口B...
    • 什么时候使用接口
    • 定义接口
    • 接口的特点
    • 接口应用案例
      • USB接口
      • Computer类
      • USB接口实现类--Mouse类
      • USB接口实现类--Keyboard类
      • main方法所在类
  • 抽象类和接口的异同
  • 创建对象时的内存变化
  • static静态的
    • 什么时候使用static
    • 如何访问静态成员
    • 静态常量
    • 静态方法
    • 静态代码块
    • static特点
  • 成员变量、局部变量、静态常量
    • 成员变量:定义在类中的变量
    • 局部变量:定义在方法中的变量
    • 静态常量:被final、static修饰的成员变量
  • 可变参数
    • 特点
    • 举例
  • 枚举enum
    • 定义枚举类型
    • 案例-定义枚举类型Week
  • 内部类
    • 匿名内部类
    • 举例
  • 学习中的sample
    • 模拟“电子宠物”
    • 使用面向对象思想实现简易图书管理系统
    • 模拟游戏角色PK
      • 游戏角色类
      • 玩家类
  • 错题解析
  • 面向对象总结

面向对象

方法

概念

一段独立的代码,能完成一件事情,可以被重复调用。

方法可以减少重复的代码。

如何调用方法

通常情况下,方法通过对象或类名使用".“操作符进行调用,也可能不用”."直接调用。

//sc就是Scanner类的一个对象
Scannser sc = new Scanner(System.in);
//通过对象sc调用Scanner类中的nextInt()方法
int inp = sc.nextInt();
//Arrays是一个类,这里通过类名调用
Arrays.sort(数组);

通过类名调用

Math类

Math类是Java提供的一个工具类,用于数学相关的运算。 其中的方法都是被static关键字修饰的静态方法,调用时,直接通过类名调用。

public class MathTest {public static void main(String[] args) {//绝对值System.out.println(Math.abs(-5));//MaxSystem.out.println(Math.max(1, 2));//MinSystem.out.println(Math.min(1, 2));//powSystem.out.println(Math.pow(2, 3));//sqrtSystem.out.println(Math.sqrt(16));//cbrtSystem.out.println(Math.cbrt(8));//ceilSystem.out.println(Math.ceil(5.12));//floorSystem.out.println(Math.floor(2.12));//roundSystem.out.println(Math.round(5.4));System.out.println(Math.round(5.5));//PI,ESystem.out.println(Math.PI);System.out.println(Math.E);//[3~10)System.out.println(Math.floor(Math.random() * 7 + 3));}
}

通过对象调用

创建对象:类名 对象名 = new 类名();

//创建一个Random类的对象rd
Random rd = new Random();
//生成[0,10)范围内的随机数
int num = rd.nextInt(10);

在同一个类中,方法A调用方法B

public class FunctionTest {public void a(){}
public void b(){//调用本类中的另一个方法
a();
}
}

自定义方法

自定义方法要写在类中。

访问休止符 返回值类型 方法名(参数类型 参数名 ,参数类型 参数名。。。){方法体;
}
  • 返回值类型、方法名和参数列表(小括号中的内容)是组成方法的三要素
  • 返回值类型可以是任意数据类型(原始类型/引用类型)
  • 小括号中的内容称为参数列表只需写参数类型和参数名,多个参数用逗号隔开。可以没有参数,但 必须要有小括号
  • 访问修饰符可以不写,会有默认的修饰符
  • 不同的返回值类型,要在方法体中返回(return)对应类型的结果,如果没有返回值,用void

方法的分类

  • 无参无返回
 //say helloworld!void sayhelloworld() {System.out.println("Hello World!");}
  • 无参有返回
 //return helloworld!String returnhelloworld() {return "Hello World!";}
  • 有参无返回
    //say hellovoid sayhello(String name) {System.out.println("hello," + name);}
  • 有参有返回
    //return random range[int a ,int b)int randomrane(int a, int b) {return (int) Math.floor(Math.random() * Math.abs(a - b) + Math.min(a, b));}

总结

  • 无返回值的方法,返回值部分要写成void

  • 有返回值的方法,方法体中要写上return,且要在return后写上对应返回值类型的数据

  • 有返回值的的方法在调用时,需要接收返回的数据才能使用该数据

  • 方法定义时的参数称为形式参数,简称为形参,方便在方法体中使用。方法调用时传递的值称为实 际参数,简称为实参,只需要保证满足形参的数据类型即可,与形参名无关

  • 没有返回值的方法体中,也可以使用return关键字,但后面不能有值。只要出现return关键字,就不再执行后续代码


两种编程思想

面向过程编程

Procedure Oriented Programming 简称POP

是一种基本的编程思想,是将一件事按流程逐步实现。

这种思想强调事情完成的过程,分析步骤写出相应的代码。

如猜数游戏,每一个步骤都是能按顺序用代码描述出来,逻辑清晰。 但如果逻辑复杂,如xxx管理系统,则无法使用POP的思想实现。

C语言就是一门标志性的面向过程编程语言。

Java基础部分写的所有代码,都是面向过程的,都是一步步按流程执行。

面向对象编程

Object Oriented Programming 简称OOP

是当主流的编程思想,是创建解决问题的对象,赋予对象对应的行为和特征,让这些对象互相配合(调用 对象的方法)完成。

这种思想致力于将计算机中的世界,描述的和现实中一致的思想。

不同思想处理同一个问题

如洗衣服

POP:得到衣服、得到搓衣板、得到洗衣粉、得到水、搓洗。。。

OOP:创建一个能洗衣服的工具:洗衣机,让洗衣机拥有洗衣粉的行为(方法),调用该行为即可。 如组装电脑 POP:整理装机配置单、自己去商城购买、自己带回家、自己组装

OOP:A推荐配置单、B去商城购买、C送回家、D组装

总结

  • 面向过程:亲力亲为,侧重于分析完成事情的过程。

  • 面向对象:所有事情交给相应的对象完成,侧重于如何创建解决问题的对象。


类和对象

类Class

具有相同属性和行为的对象的集合,称为"一类"。可以理解为模板。

属性:描述对象的特征,在程序中,通过定义变量的形式表现属性。

行为:描述对象的动作,在程序中,通过定义方法的形式表现行为。

在程序中,通过定义一个class来定义一个类。在类中定义变量描述属性,定义方法描述行为。

定义类

[修饰符] class 类名{

//属性(变量)

//行为(方法)

}

/** 定义一个类(模板)--Car小轿车类* 属性:变量* 品牌* 颜色* 。。。* 行为:方法* 行驶* 停止 * 娱乐* 飞行*/public class Car {//定义属性String brand;//品牌String color;//颜色int seat=5;//座位数//定义行为void go(){System.out.println("在行驶");}void stop(){System.out.println("停下来了");}void fly(){System.out.println("飞起来了");}
}

对象Object

对象是类的一个实例,是类的具体表现。

创建对象

类名 对象名 = new 构造方法([参数]);

创建的对象,通过"."操作符访问类中的非私有属性和方法。

/** 创建工厂类(程序入口),该类可以创建车的对象*/
public class Factory {public static void main(String[] args) {//类名 对象名 = new 类名([参数]);//创建车类的对象c1Car c1 = new Car();//给对象的属性赋值c1.brand = "宝马";c1.color = "白色";System.out.println("车名:" + c1.brand + ",颜色:" + c1.color + ",座位数:" + c1.seat);c1.go();c1.fly();c1.stop();Car c2 = new Car();c2.brand = "五菱宏光";c2.color = "黑色";c2.seat = 7;System.out.println("我有一辆" + c2.seat + "座的" + c2.color + c2.brand);}
}

类和对象的关系

对象是类的具体表现,类是对象的集合(模板)。 如包饺子的模具就是一个类,每次用这个模具包出来的饺子都是一个一个对象。 先定义类,才能通过该类创建对象。


成员变量和局部变量

成员变量

定义在类中的变量,称为成员变量,拥有默认值

数据类型 默认值
整型 0
浮点型 0.0
布尔型 false
字符型 空字符
引用类型(数组、类、接口) null
public class Car{String brand;//这就是一个成员变量,默认值为nullvoid info(){//这里brand虽然没有赋值,但是它是一个成员变量,属于引用类型,默认值为nullSystem.out.println("车名:"+brand);//如果不赋值,最终打印"车名:null"}
}

局部变量

定义在方法中的变量,称为局部变量。默认有默认值,赋值后才能使用

public class Test{public static void main(String[] args){//这里的num和name就是一个局部变量,没有默认值int num;System.out.println(num);//这里无法通过编译,因为num没有赋值String name="小明";System.out.println(name);//这样才能正常输出
}void sayHello(){//这里的name也是一个局部变量String name;System.out.println(name);//这时也无法通过编译}
}

成员变量局部变量面试题

  • 简述成员变量和局部变量的区别以及生命周期

    • 成员变量是定义在类中的变量,有默认值,不用赋值也能使用

    • 局部变量是定义在方法中的变量,没有默认值,需要赋值后才能使用

    • 成员变量的生命周期:类创建对象,成员变量初始化;类的对象被回收,成员变量销毁。

    • 局部变量的生命周期:方法开始调用,局部变量初始化;方法调用结束,局部变量销毁。


构造方法

概念

构造方法是一个特殊的方法,没有返回值,方法名和类名一致。

每个类在定义时,都有一个默认隐藏的无参数的构造方法,在创建对象时调用。

构造方法通常用于初始化成员变量。

public class Test{//这就是无参数的构造方法,默认就会存在,不过是隐藏的public Test(){}
}

特点

  • 构造方法没有返回值(没有返回值这一部分,不是void),构造方法名必须和类名相同

  • 每个类默认有一个隐藏无参数的构造方法,方法体中没有内容,用于创建无参数的对象

  • 如果自己写了有参数的构造方法,默认无参数的构造方法就会失效。如果想要同时拥有带参数和不 带参数的构造方法,就需要把它们都写出来

  • 构造方法可以限制创建对象时的参数

  • 构造方法不能通过“.”操作符访问,只能通过new关键字创建对象时自动调用,所以构造方法通常用 于初始化成员变量


包package

通过包可以将.java源文件进行结构化管理,相当于windows中的文件夹。

不同的包中,可以保存相同名称的.java源文件。

某个类在某个包中时,会在该类的代码最上面加上 package 包名;

包的命名

包名通常使用公司域名的倒序形式。

如baidu.com公司有一个test项目,包名写为com.baidu.test。

包名中的“.”,相当于进入该文件夹,

如com.baidu.test,实际会创建3个文件夹:com下有baidu文件夹,baidu下有test文件夹

导入包

如果a包中的类要使用b包中的类时,需要在a包中的类中,导入b包。

如在使用Scanner时,就需要导入Scanner所在的java.util包。

在IDEA中,如果是通过自动补全的形式写的代码,会自动导入该类及其所在包。

如果需要手动导入包,在报错的类上按下快捷键alt+回车。

如果多个类名相同,在不同的包中,导包时需要选择合适的包。


面向对象的三大特性–封装

封装

使用private关键字对属性进行修饰。再对外提供一组公开的get/set方法用于对该属性读取或赋值。 可以防止除自身类之外的地方对该属性就行访问。

这样做可以保护关键属性,隐藏类内部的实现细节,

步骤

  • 创建类,编写成员变量,给成员变量添加private修饰符
public class Student{private int stuId;private String stuName;private String major;
}
  • 给所有成员变量添加setXXX方法,用于给私有的成员变量赋值
public void setStuId(int stuId){this.stuId = stuId;
}
public void setStuName(String stuName){this.stuName = stuName;
}
public void setMajor(String major){this.major = major;
}
  • 给所有成员变量添加getXXX方法,用于读取私有的成员变量
public int getStuId(){return stuId;
}
public String getStuName(){return stuName;
}
public String getMajor(){return major;
}
  • 这是创建对象后,无法通过.访问属性,只能通过get/set方法
public static void main(String[] args){Student stu = new Student();//stu.stuId=111;无法通过.赋值和读取//只能通过set方法赋值stu.setStuId(10026312);//只能通过get方法获取私有属性的值System.out.println(stu.getStuId());
}

使用IDEA自动生成getter/setter方法

在代码空白处右键选择generate或快捷键alt+insert


Java程序运行时的内存变化

Person类

public class Person{String name;int age;public Person(){}public Person(String name,int age){this.name=name;this.age=age;}
}

Main类

public class Main{public static void main(String[] args){Person p = new Person();p.name="张敏";p.age=22;p = new Person("赵信",22);}
}


面向对象三大特性–继承

继承

类A可以通过extends关键字继承类B。

语法:class 类A extends 类B{}

类A称为子类、派生类、衍生类、subClass

类B称为父类、根类、超类、superClass

继承后,子类可以访问父类中非私有(没有被private修饰的内容)的属性和方法。

不同的子类中如果有相同的代码,都可以把它们提出来保存到父类中,从而减少子类中的代码冗余。

如狗类、猫类都有类型、昵称等属性,也有吃、睡等方法,那么就可以定义一个动物类,将这些公共的 属性和方法定义在动物类中,让猫类和狗类继承动物类。

继承的特点

  • 如果多个类之中有相同或类似的代码,可以将这些代码提取出来定义在一个公共的类中,这个类就 是父类。再让那些类就继承这个父类,那些类就是子类,这样就能减少子类中的重复代码

  • 子类对象可以直接访问父类中非私有(不用private修饰)的属性和方法

  • 子类可以对父类中的方法进行扩展或覆盖,这称为方法重写。重写后,子类对象再调用该方法时, 执行的是重写后的内容

  • Java中是单继承。一个子类只能extends一个父类,一个父类可以有很多个子类

  • Java中可以多重继承。类A可以继承类B,类B可以继承类C,这时类A既是类B的子类,也可以称为 类C的子类,可以访问类B与类C中非私有的成员

  • 任何类都是Object类的子类 在创建子类对象时,会先执行父类中相应的构造方法


方法重写override

当子类继承父类后,可以对父类中非私有的方法进行扩展或覆盖,这个过程称为方法重写。

方法重写要求

  • 方法名、参数列表、返回值必须和父类一致

  • 访问权限不能比父类更严格(访问修饰符的范围要么一致要么更大)

  • 不能抛出比父类更大的异常


方法重载overload

在一个类中,如果多个方法的方法名相同,参数列表不同时,这些方法称为重载的方法。

同名不同参。

重载用于在一个类中,某个方法在不同的条件下,执行不同的内容。

方法重载要求

  • 方法名相同

  • 参数列表(参数类型和数量)不同

  • 与返回值无关


重载与重写相关面试题

  • 说出重载与重写的异同

    • 相同点:方法名不变

    • 不同点:xxxx

  • 构造方法能重载吗?能重写吗?

    • 构造方法可以重载,不能重写。
  • 构造方法在执行时,一定创建对象吗?

    • 不一定。创建子类时会自动执行父类构造方法,但不会创建父类对象
  • 以下代码执行会输出什么结果

public class Father{public Father(){fun();}public void fun(){System.out.println("父类中的普通方法");}
}
public class Son extends Father{public Son(){fun();}public void fun(){System.out.println("子类中的普通方法");}
}
public class Test{public static void main(String[] args){//1.创建父类对象,调用父类中的无参构造方法//2.无参构造方法中会调用fun()方法,输出“父类中的普通方法”new Father();//1.创建无参子类对象,先调用父类中对应的无参构造方法//2.父类中无参构造会调用fun()方法,实际要执行子类重写后的fun()方法,输出“子类中的普通方法”//3.执行子类中的无参构造,调用重写后的fun()方法,输出“子类中的普通方法”new Son();}
}
//最终输出
父类中的普通方法
子类中的普通方法
子类中的普通方法

this和super关键字

这两个关键字,都可以当做对象使用,也可以当做构造方法使用。

当做对象使用

用法:“this.属性”或“this.方法”或“super.属性”或“super.方法”

此时的this或super表示“当前类”或"父类对象"。

public class Person{private String name;public void setName(String name){this.name=name;//这里的this表示当前类Person的对象//this表示Person p = new Person();中的p}public String getName(){return name;}
}
public class Man extends Person{public void fun(){System.out.println(super.getName());//这里的super表示当前类父类Person对象//super表示Person p = new Person();中的p}
}

当做构造方法使用

用法:“this([参数])或super([参数])”

此时的this([参数])或super([参数])表示当前类或当前类的父类的某个构造方法。

如果当做构造方法使用时,只能写在另一个构造方法中的第一行。

public class Person(){private String name;private int age;public Person(){//这句话表示调用Person(String name,int age)构造方法,只能放在第一行this("小明",20);}public Person(String name,int age){this.name=name;this.age=age;}public void info(){//this();//这里不能使用this(),因为不在构造方法中System.out.println("我叫"+name);}
}
public class Woman extends Person{public Woman(String name,int age){//这里的super()表示调用父类Person中的Person(String name,int age)构造方法super(name,age);}
}

注意

如果父类中有无参数的构造方法,在子类的构造方法中,可以不写super(),系统会自动调用。

如果父类中有带参数的构造方法,没有无参数的构造方法,在子类的构造方法中,必须要写super(),并 且赋予适当的参数。

  • 子类和父类都不写有参数的构造方法,都用默认的无参构造方法
public class Father{/*默认会有public Father(){}*/
}
public class Son extends Father{/*默认会有public Son(){super();}*/
}
  • 父类中没有无参数的构造方法,子类中就必须调用父类中对应的构造方法
public class Father{private String name;//由于该构造方法的出现,默认无参的构造方法就会失效public Father(String name){this.name=name;}
}
public class Son extends Father{public Son(String name){//这里必须要调用父类中的构造方法,否则无法通过编译super(name);}
}

访问修饰符

访问修饰符可以限制某个类、属性或方法的访问权限

访问修饰符 含义 可以修饰
public 公共的 类、属性、方法
protected 受保护的 属性、方法
不写 默认的 类、属性、方法
private 私有的 属性方法

访问权限表

同一个类中 同一个包中的不同类 不同包中的子类 不同包中的非子类
public
protected ×
不写 × ×
private × × ×

final关键字

修饰属性

当final修饰属性时,该属性的值不可更改。

定义属性时,在属性前加上final,这时的属性称为常量。常量命名时,所有字母都大写,多个单词之间 用_隔开。

final 数据类型 常量名;
final NUM = 123;
final PI = 3.14;

修饰方法

当final修饰方式时,该方法不能被重写。

定义方法时,在返回值前加上final。

public class Father{public final void fun(){}
}
public class Son extends Father{//会报错,提示该方法不能被重写@Overridepublic void fun(){}
}

修饰类

当final修饰类时,该类不能被继承。

定义类时,在class前加上final。

public final class Father{}
//会报错,提示该Father类不能被继承
public class Son extends Father{}

Object类

是Java中所有类的父类。每个类都是这个类的子类,但没有用extends体现出来。

该类中定义了很多方法,通常需要进行重写。

常用方法 返回值 作用
toString() String 在输出某个对象时,会默认调用该方法。该方法默认输出“包名. 类名@十六进制哈希码”。通常用于重写后输出对象的属性。
hashCode() int 得到某个对象的哈希码。哈希码可以理解为对象内存地址通过一 种算法转换得到的一个特定值。
getClass() Class 得到某个对象的所在类。默认输出"class 包名.类名"
equals(Object obj) boolean 判断两个对象是否相同。Object中默认用==比较对象,通常需要 对其进行重写。
notify() void 唤醒某个线程
notifyAll() void 唤醒所有线程
wait(long time) void 让线程休眠,直到被唤醒
finalize() void 当某个对象被垃圾回收(GC)回收前执行的方法

对象造型/对象转型

类似于原始类型中的数据类型转换。对象A转换为对象B的过程称为对象造型或对象转型。

在非继承关系的两个对象中,无法实现转型。

向下转型

父类对象转换为子类对象的过程,称为向下转型。(强制转换)

转换方式:在要转换的对象前加上"(目标类型)"

//一个Object类型的对象
Object obj = new Object();
//默认无法将父类对象保存到子类变量中
//Person p = obj;
//经过向下转型即可
Person p = (Person) obj;

向上转型

子类对象转换为父类对象的过程,称为向上转型。(自动转换)

Person p = new Person();
//可以直接将子类对象保存到父类变量中
Object obj = p;

重写equals方法

在实际的业务中,如果两个对象的属性完全一致,可以视为同一个对象。

但是默认使用new创建的对象,就算属性一致,也是不同的内存地址,所以用==比较时,结果为false。

使用Object类中的equals方法比较时,默认也是用==比较,所以需要重写equals方法。

在IDEA中自动生成equals方法

在类中空白处右键 ==> generate或快捷键alt+insert==> 选择equals and hashcode ==> 选择要判断的属性。

这里可以暂时删除生成的hashcode()方法。

UserInfo类

package com.hqyj.test4;
import java.util.Objects;
/** 定义用户信息类* 属性* 用户名* 密码* 方法* getter/setter* 构造方法* toString()* equals()* */
public class UserInfo {private String username;private String password;/** 如果两个UserInfo对象的username属性一致时,视为同一个对象* *//*@Overridepublic boolean equals(Object obj) {//如果是同一个对象,返回trueif (this == obj) {return true;}//如果参数属于UserInfo类型if (obj instanceof UserInfo) {//将参数向下转型为UserInfoUserInfo u = (UserInfo) obj;//如果参数中的username与当前类的username相同if (u.getUsername().equals(username)) {return true;}}return false;
}*/@Overridepublic boolean equals(Object o) {//如果是同一个对象,返回trueif (this == o) return true;//如果参数为null或两个判断的对象不是同一个类型,返回falseif (o == null || getClass() != o.getClass()) return false;//如果能执行到这里,说明两个判断的对象属于同一类型,将参数转换为UserInfo类型UserInfo u = (UserInfo) o;//Objects与Object不同//Objects是一个工具类equals方法重写了Object中的equals方法,该方法的逻辑是//先试图用==判断两个对象,如果满足返回true;再用Object中的equals方法判断,//这时如果参数重写了equals方法,按重写的方式来(这里的u.username是一个String,就会用到String中重写的equals方法)//如果没有重写equals方法,就按Object中的equals方法判断return Objects.equals(username, u.username);}@Overridepublic String toString() {return "UserInfo{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}public UserInfo(String username, String password) {this.username = username;this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

Main类

package com.hqyj.test4;
import java.util.Scanner;
public class Main {//定义保存UserInfo对象的数组UserInfo[] list = new UserInfo[10];/** 注册方法* 要求注册的用户名不能重复* */public boolean register(UserInfo user) {//遍历数组检查是否已有用户for (int i = 0; i < list.length; i++) {if (list[i] != null && list[i].equals(user)) {return false;}}//遍历数组检查是否有空位for (int i = 0; i < list.length; i++) {if (list[i] == null) {list[i] = user;return true;}}return false;}public void showAll() {System.out.println("当前用户列表");for (UserInfo userInfo : list) {if (userInfo != null) {//原本在没有重写toString()时,需要.getXXX输出//现在重写了toString()方法,就可以直接输出对象,自动调用toString()System.out.println(userInfo);}}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);Main main = new Main();while (true) {System.out.println("请输入用户名");String username = sc.next();System.out.println("请输入密码");String password = sc.next();//用获取的参数创建一个UserInfo对象UserInfo userInfo = new UserInfo(username, password);//调用注册根据结果输出if (main.register(userInfo)) {System.out.println("注册成功");} else {System.out.println("注册失败");}main.showAll();}}
}

UserInfo类

package com.hqyj.test4;
import java.util.Objects;
/** 定义用户信息类* 属性* 用户名* 密码* 方法* getter/setter* 构造方法* toString()* equals()* */
public class UserInfo {private String username;private String password;/** 如果两个UserInfo对象的username属性一致时,视为同一个对象* *//*@Overridepublic boolean equals(Object obj) {//如果是同一个对象,返回trueif (this == obj) {return true;}//如果参数属于UserInfo类型if (obj instanceof UserInfo) {//将参数向下转型为UserInfoUserInfo u = (UserInfo) obj;//如果参数中的username与当前类的username相同if (u.getUsername().equals(username)) {return true;}}return false;}*/@Overridepublic boolean equals(Object o) {//如果是同一个对象,返回trueif (this == o) return true;//如果参数为null或两个判断的对象不是同一个类型,返回falseif (o == null || getClass() != o.getClass()) return false;//如果能执行到这里,说明两个判断的对象属于同一类型,将参数转换为UserInfo类型UserInfo u = (UserInfo) o;//Objects与Object不同//Objects是一个工具类equals方法重写了Object中的equals方法,该方法的逻辑是//先试图用==判断两个对象,如果满足返回true;再用Object中的equals方法判断,//这时如果参数重写了equals方法,按重写的方式来(这里的u.username是一个String,就会用到String中重写的equals方法)//如果没有重写equals方法,就按Object中的equals方法判断return Objects.equals(username, u.username);}@Overridepublic String toString() {return "UserInfo{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}public UserInfo(String username, String password) {this.username = username;this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

面向对象三大特性–多态

概念

多态就是子类的对象指向父类的引用(子类对象使用父类变量接收,即向上转型)。

父类 变量 = new 子类();

public class Father{}
public class Son extends Father{}
public class Main{public static void main(String[] args){Son son = new Son();//这就是多态的体现//子类的对象,可以使用父类的变量保存Father father = new Son();}
}

多态的应用

当某个方法的参数为父类变量时,可以传递一个子类对象。

这样就能在传递不同子类对象时,执行不同的方法。

如要调用动物发出叫声的方法,参数为猫,输出喵喵叫,参数为狗,输出汪汪叫。

不用多态,需要写多个重载的方法,参数为猫或狗的具体类型。

使用多态,只需一个方法,参数为动物类型,动物类中定义一个叫的方法,让猫和狗继承这个动物类, 重写叫的方法。

这时调用动物发出叫声的方法时,就会根据实际的参数,表示不同的结果。 多态的实现条件

多态的实现条件

  • 在继承关系中
  • 子类需要重写父类中的方法
  • 父类的引用指向子类的对象(向上转型)

多态案例–花木兰替父从军

Woman类

package com.hqyj.test6;
/** 多态的应用--花木兰替父从军* 女人类* 继承军人类后,重写fight方法* */
public class Woman extends Soldier {public Woman(String name) {super(name);
}/** 化妆打扮的方法* */public void makeUp() {System.out.println(super.getName() + "梳妆打扮");}/** 做家务的方法* */public void doHousework() {System.out.println(super.getName() + "烧水做饭");}/*** */@Overridepublic void fight() {System.out.println(super.getName() + "替父从军");}
}

Soldier类

package com.hqyj.test6;
/** 定义军人类* */
public class Soldier {private String name;public Soldier(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}/** 定义战斗的方法* */public void fight() {System.out.println(name + "上阵杀敌");}
}

BattleGround类

package com.hqyj.test6;
/** 定义战场类* */
public class BattleGround {/** 定义战争的方法,参数为一个军人对象* */public void war(Soldier soldier) {soldier.fight();}public static void main(String[] args) {BattleGround battleGround = new BattleGround();//原本可以创建一个Soldier对象作为参数Woman hua = new Woman("花木兰");//如果创建的子类对象,用子类变量接收,可以调用子类中的方法hua.makeUp();hua.doHousework();//假如不能再创建Soldier对象了/*Soldier soldier = new Soldier("花爸爸");battleGround.war(soldier);*///无法直接将Woman对象作为Soldier对象使用//当把Woman继承Soldier类后,就能将Woman类的对象,当做Soldier使用Soldier soldier=hua;//如果子类的对象用父类的变量接收,无法访问子类中除父类中有的方法// soldier.makeUp();无法调用// soldier.doHousework();//无法调用soldier.fight();battleGround.war(soldier);}
}

抽象abstract

修饰方法

使用: 访问修饰符 abstract 返回值类型 方法名(参数类型 形参名称);

如果一个方法的方法体无法描述,是由其子类进行重写,可以将该方法定义为抽象方法。

该抽象方法所在的类,也必须用abstract修饰,让其成为一个抽象类。

//当一个类中有抽象方法时,该类也需要是一个抽象类
public abstract class Game{//这就是一个抽象方法,没有方法体public abstract void startGame(Player player);
}

修饰类

使用: 访问修饰符 abstract class 类名{}

如果一个类中有抽象方法,这个类必须也是一个抽象类。

抽象类不能被实例化(不能创建对象)。

抽象类中,可以存在非抽象方法,如getter/setter或构造方法。

当抽象类的构造方法执行时,不会创建对象。

当一个类不希望创建它本身对象或在它其中有抽象方法时,就将该类定义为抽象类。

abstract关键字特点

修饰类:被修饰的类称为抽象类

  • 抽象类不能被实例化,无法创建对象。

  • 抽象类中有构造方法,在创建其子类对象时,自动调用执行。

  • 抽象类中可以有抽象方法,也可以有非抽象方法。

  • 抽象类的子类要么继续成为抽象类,要么重写抽象父类中的所有抽象方法。

修饰方法:被修饰的方法称为抽象方法

  • 抽象方法没有方法体。

  • 抽象方法只能出现在抽象类或接口中。

  • abstract不能修饰构造方法和静态方法。

抽象相关面试题

  • 抽象类的特点

    • 抽象类用abstract修饰,除了不能创建对象外,与普通类一样。
  • 抽象方法的特点

    • 抽象方法用abstract修饰,不能有方法体,非抽象子类必须要进行重写。
  • 抽象类中有构造方法吗

    • 有,但不是通过new该类时调用,而是在new其子类对象时调用。
  • 执行某个类的构造方法时,一定会创建这个类的对象吗?

    • 不一定,如果是普通类,在执行构造方法时,一定会创建对象。
    • 如果是抽象类,在执行构造方法时,不会创建自身对象,只会创建其子对象。

接口interface

在Java中,数据类型分为基本类型和引用类型。

引用类型包含:数组、类和接口。

所以接口是一种数据类型,类似于类,在定义接口的时候,用interface替换class。

由于Java是单继承,如果类A既要继承类B中的内容,也要继承类C中的内容时, 如果用“extends class名”,只能选择一个类继承,但如果使用“implements interface名1,interface名 2…”,就能同时"继承"多个接口。

通常用extends表示类A继承类B,用implements表示类A实现接口A,接口B…。

接口是一个完全抽象类。一个类可以同时implements实现(“继承”)多个接口。

extends和implements

类A extends 类B

类A当做类B的子类,继承。

类A implements 接口A,接口B…

类A当做接口A、接口B的实现类(“子类”)

接口A extends 接口B

接口A通过extends继承接口B

类A extends 类B implements 接口A,接口B…

类A是类B的子类,是接口A、接口B的实现类,同时能访问这三个"父类"中的数据。

什么时候使用接口

  • 如果想要让某个类作为多个"类"的子类时,将这些"父类"定义为接口

  • 如果某个类中的所有方法,都是抽象方法时,可以将这个抽象类改为接口

定义接口

public interface 接口名{//接口中只能定义公开的静态常量且要赋值,默认用public static final修饰double PI = 3.14;//接口中的方法默认用public abstract修饰,表示公开的抽象方法void fun(String name);//接口中不能定义普通方法//void fun1(){}//jdk1.8之后,接口中可以定义默认方法或静态方法,有方法体default void fun2(){}static void fun3(){}
}

接口的特点

  • 接口中的属性默认被public static final修饰,表示公共的静态常量,需要赋值。使用时直接通过类 名访问。

  • 接口中的方法默认被public abstract修饰,表示公共的抽象方法,没有方法体。

    • JDK1.8后,接口中可以存在两种特殊的方法,都有方法体

      • 被default修饰的默认方法

      • 被static修饰的静态方法

  • 接口中没有构造方法,不能创建对象。

  • 接口通常需要子类实现,实现后必须重写其中的所有抽象方法。

接口应用案例

模拟电脑使用USB设备

USB接口

package com.hqyj.test4;
/** 定义USB接口,模拟电脑开机,运行各种USB设备** */
public interface USB {/** 任何USB类型的设备,都需要开启和关闭的方法* */void start();void stop();
}

Computer类

package com.hqyj.test4;
/** 定义电脑类* */
public class Computer {/** 开机的方法,参数为USB设备,调用USB参数的开启的方法* */public void powerOn(USB usb1, USB usb2) {System.out.println("电脑开机。。");if (usb1 != null) {usb1.start();} else {System.out.println("当前USB1插槽没有设备");}if (usb2 != null) {usb2.start();} else {System.out.println("当前USB2插槽没有设备");}}/** 关机的方法,参数为USB设备,调用USB参数的关闭的方法* */public void powerOff(USB usb1, USB usb2) {System.out.println("电脑关机。。");usb1.stop();usb2.stop();}
}

USB接口实现类–Mouse类

package com.hqyj.test4;
public class Mouse implements USB {private String name;public Mouse(String name) {this.name = name;}@Overridepublic void start() {System.out.println(name + "鼠标正在启动");}@Overridepublic void stop() {System.out.println(name + "鼠标正在停止");}
}

USB接口实现类–Keyboard类

package com.hqyj.test4;
/** USB接口实现类--键盘类* */
public class Keyboard implements USB {private String name;private int keysNum;public Keyboard(String name, int keysNum) {this.name = name;this.keysNum = keysNum;}@Overridepublic void start() {System.out.println(keysNum + "键的" + name + "键盘正在启动");}@Overridepublic void stop() {System.out.println(keysNum + "键的" + name + "键盘正在关闭");}
}

main方法所在类

package com.hqyj.test4;
public class Main {public static void main(String[] args) {Computer computer = new Computer();//可以使用接口变量接收实现类对象// USB keyboard=new Keyboard("罗技K845",104);Keyboard keyboard = new Keyboard("罗技K845", 104);USB mouse = new Mouse("GPW");//调用开机关机的方法computer.powerOn(keyboard, mouse);computer.powerOff(keyboard,mouse);}
}

抽象类和接口的异同

  • 抽象类是一个类,用abstract class定义

    • 有构造方法,不能创建对象,在创建子类对象时调用构造方法
    • 抽象类中可以有抽象方法,也可以有普通方法
    • 抽象类被子类继承时,使用extends关键字。子类必须重写父类中的所有抽象方法
    • 子类只能继承一个抽象类
  • 接口不是一个类,用interface定义
    • 没有构造方法,不能创建对象
    • 接口中的属性都是公共的静态常量
    • 接口中的方法都是公共的抽象方法
    • JDK1.8后,可以在接口中定义default方法和static方法
    • 接口被实现类实现时,使用implements关键字。实现类必须重写父接口中的所有抽象方法
    • 实现类可以实现多个接口
  • 相同点
    • 接口和抽象类都不能创建对象
    • 接口的实现类和抽象类的子类,都需要重写抽象方法

创建对象时的内存变化

每次new一个对象,都会在堆空间中开辟一块区域,这个过程是需要花费时间和空间的。

在栈空间中,只会定义变量,保存堆空间某块区域的地址。通过变量相当于直接访问堆空间中的某个地 址中对应的数据。

如果多个对象都有相同的属性或方法时,可以将这些共用的属性和方法使用static修饰后,保存到静态区中。

如上图中的"长江师范学院"这个字符串,每个对象都会用,就可以将该对象用static定义为静态属性。

静态属性或静态方法,会脱离对象存在,在类加载的时候就保存到内存中。


static静态的

static是一个修饰符,可以修饰属性、方法、代码块。

被static修饰的内容,称为静态成员。静态成员在类加载的时候,就会保存到内存中,可以脱离对象存在。

所以访问静态成员时,可以不用创建对象,直接通过类名访问。如Math中的属性和方法都是静态的,所以直接通过Math访问。

什么时候使用static

如果某个属性或方法被高度重用时,可以将其定义为static静态的。

这样这些属性就会脱离对象,在类加载时就加载到内存中,从而直接通过类名即可访问。

或不想创建对象就想使用该类中的属性或方法时,将它们定义为静态的。

如何访问静态成员

直接通过类名就能访问静态成员。也可以通过对象访问。

静态常量

static修饰属性时,通常和final一起使用,表示静态常量

public class Person{//静态常量public final static String COUNTRY="中华人民共和国";
}
public class Test{public static void main(String[] arg){//静态成员直接通过类名访问System.out.println(Person.COUNTRY);}
}

静态方法

public class Person{public final static String COUNTRY="中华人民共和国";//静态方法public static void info(){System.out.println("我来自于"+COUNTRY);}
}
public class Test{public static void main(String[] arg){//静态成员直接通过类名访问Person.info();}
}

静态代码块

public class Person{//静态代码块static {//这里的代码在类加载时自动执行。}
}

static特点

  • 静态方法中只能使用静态成员,不能使用非静态成员
public class Student{static String str="静态成员变量";int num=123;//非静态成员变量//静态方法中只能使用静态成员public static void fun(){System.out.println(str);//可以//System.out.println(num);报错}
}
  • 非静态方法中可以使用静态成员
public class Student{static String str="静态成员变量";int num=123;//非静态成员变量//非静态方法中可以使用静态成员public void fun2(){System.out.println(str);//可以System.out.println(num);//可以}
}
  • 静态方法中不能使用this关键字

成员变量、局部变量、静态常量

成员变量:定义在类中的变量

成员变量随着对象的创建而存在,随着对象的回收而销毁。作用范围在类内部。成员变量有初始值。

局部变量:定义在方法中的变量

局部变量随着方法的调用而存在,随着方法执行结束而销毁。作用范围在方法内部。

静态常量:被final、static修饰的成员变量

静态常量随着类的加载而存在,随着类的销毁而销毁。作为范围在程序运行周期中。静态常量有初始值。

public class Animal{//静态常量public static final String ZOO="重庆动物园";//成员变量private String type;//静态成员方法public static void welcome(){System.out.println("欢迎光临"+ZOO);}//成员方法public void info(){//局部变量String str="你好";System.out.println(ZOO+"中的"+type+"在打招呼说"+str);}
}

可变参数

当某个方法的参数是同一类型且数量未知时,使用可变参数定义。

语法

修饰符 返回类型 方法名 (数据类型。。。 形参){//这时的参数数量时可变的,范围[0,无穷)//整个参数会成为一个数组
}

特点

  • 可变参数只能在方法列表中出现一次,且是最后一个参数
  • 可变参数实际是一个数组
  • 调用方法时,传递的实参需要用逗号隔开

举例

Function.java

package Phone;public interface Function {void ShowFunctionInfo();
}

Camera.java

package Phone;public class Camera implements Function {private String cameraBrand;private long cameraPX;public String getCameraBrand() {return cameraBrand;}public void setCameraBrand(String cameraBrand) {this.cameraBrand = cameraBrand;}public long getCameraPX() {return cameraPX;}public void setCameraPX(long cameraPX) {this.cameraPX = cameraPX;}public Camera(String cameraBrand, long cameraPX) {this.cameraBrand = cameraBrand;this.cameraPX = cameraPX;}@Overridepublic String toString() {return "Camera{" +"cameraBrand='" + cameraBrand + '\'' +", cameraPX=" + cameraPX +'}';}@Overridepublic void ShowFunctionInfo() {System.out.println(this.toString());}
}

PhoneTest.java

package Phone;public class PhoneTest {String phoneBrand;public PhoneTest(String phoneBrand) {this.phoneBrand = phoneBrand;}@Overridepublic String toString() {return "PhoneTest{" +"phoneBrand='" + phoneBrand + '\'' +'}';}//可变参数的使用void ShowPhoneInfo(Function... functions) {System.out.println(this.toString());for (Function function : functions) {function.ShowFunctionInfo();}}public static void main(String[] args) {PhoneTest phoneTest = new PhoneTest("水果");Camera camera = new Camera("徕卡", 100);Camera camera1 = new Camera("蔡司", 200);phoneTest.ShowPhoneInfo(camera, camera1);}
}


枚举enum

Java中的枚举时一个特殊的类,时一些常量的集合。

定义枚举类型

public enum 枚举类型{常量1,常量2。。。常量n
}

案例-定义枚举类型Week

public eenum enum{SUN,MON,TUE, WED, THU, FRI, SAT
}
package EnumTest;public class MainTest {public static void main(String[] args) {for (enumTest value : enumTest.values()) {System.out.println(value);}System.out.println(enumTest.valueOf("S"));}
}


内部类

内部类,时只定义在类中的类。

内部类可以隐藏某个类的实现细节,将类进行封装。

内部类分为成员内部类、静态内部类、局部内部类和匿名类。这里只说明匿名内部类。

匿名内部类

当某个方法的参数为接口类型时,通常会先定义该接口的实现类,再创建实现类的对象作为方法的参数。

在使用匿名内部类后,就可以不要创建实现类,而是直接通过匿名内部类作为参数使用。

举例

USB接口

public interface USB{void start();
}

Computer类

public class Computer{public void poweron(USB... usbs){for(USB : usbs){u.start();}}
}

通常情况下,需要创建一个USB接口的实现类-Keyboard键盘类

public class Keyboard implements USB{public void start(){System.out.println("键盘设备接入");}
}

在main方法中,需要用到USB接口参数时,传递一个USB接口的实现类对象

public class Test{public static void main(String[] args){Computer com = new Computer();//poweron()方法的参数为USB接口类型的变量,这里poweron()方法中的大括号{}整体是一个匿名内部类,即USB接口的“实现类”com.poweron(new USB(){public void start(){System.out.println("某USB设备接入");} });}
}

学习中的sample

模拟“电子宠物”

进入系统,创建宠物(可以手动创建,也可以自动随机创建)

如果手动创建,就输入宠物信息:品种、昵称

进入菜单

1.查看宠物信息

​ 打印我叫xxx,是一只xxx,是您的电子宠物

2.喂食

​ 接收输入的食物名,输出xxx正在吃xxx

3.玩耍

​ 接收输入的玩具名,输出xxx正在玩耍xxx

宠物类

属性:品种、昵称

方法:输出信息、喂食(String 食物){}、玩耍(String 玩具){}

Main类

main(){

​ 打印菜单,输入选项

}

ElectronicPetTest.java

package ElectronicPet;import java.util.Random;
import java.util.Scanner;public class ElectronicPetTest {public static void main(String[] args) throws InterruptedException {Scanner sc = new Scanner(System.in);/*** 领养宠物* 1.手动* 2.随机** 手动* 选种类* 取名字** 自动* 随机种类* 取名字** 互动* 1.查看信息* 2.唱歌* 3.吃饭**///0 猫头鹰 1 兔子 2 蝎子String[] petBreedArr = {"猫头鹰", "兔子", "蝎子"};String[] petPhotoArr = {"         ,___,      \n" +"         (9v9)      \n" +"         (_^((\\     \n" +"       ^^^\"^\" \\\\^^^^\n" +"       ^^^^^^^^^^^^^", "         ,-.,-.  \\n\" +\n" +"            \"        (  (  (        \\n\" +\n" +"            \"         \\\\  )  ) _..-.._   \\n\" +\n" +"            \"        __)/ ,’,’       `.\\n\" +\n" +"            \"      ,'     `.     ,--.  `.     \\n\" +\n" +"            \"    ,'   @        .’    `   \\\\\\n\" +\n" +"            \"   (Y            (           ;’’.\\n\" +\n" +"            \"    `--.____,     \\\\          ,  ; \\n\" +\n" +"            \"    ((_ ,----’ ,---’      _,’_,’    \\n\" +\n" +"            \"        (((_,- (((______,-’", "        ___ __\n" +"      _{___{__}\\\n" +"     {_}       `\\)            \n" +"    {_}         `             _.-''''--.._\n" +"    {_}                     //'.--.   \\___`.\n" +"     { }__,_.--~~~-~~~-~~-::.---. `-.\\   `.)\n" +"      `-.{_{_{_{_{_{_{_{_//   -- 8;=- `\n" +"         `-:,_.:,_:,_:,.`\\\\._ ..'=- ,\n" +"             // // // //`-.`\\`    .-'/\n" +"            << << << <<     \\ `--'   /----)\n" +"             ^   ^   ^   ^      `-.....--'''"};System.out.print("请选择你要领养的宠物:\n1.猫头鹰\n2.兔子\n3.蝎子\n4.随机\n你的选择是:");Integer petSelect = sc.nextInt();Integer petBreed = 0;switch (petSelect) {case 1:petBreed = 0;break;case 2:petBreed = 1;break;case 3:petBreed = 2;break;case 4:Random rd = new Random();petBreed = rd.nextInt(3);}System.out.print("\n请给它命名吧!名字:");String petName = sc.next();Pet pet = new Pet(petName, petBreedArr[petBreed]);boolean flag = true;while (flag) {System.out.print("\n互动:\n1.吃饭\n2.唱歌\n3.退出互动\n4.查看宠物\n选择:");switch (sc.nextInt()) {case 1:System.out.print("\n给宠物吃什么:");pet.eatFood(sc.next());break;case 2:System.out.print("\n唱什么歌呢:");pet.sing(sc.next());break;case 3:System.out.println("要记得我哦!");flag = false;break;case 4:System.out.println(petPhotoArr[petBreed]);System.out.println("我的名字叫:" + pet.petName);break;}}}
}

Pet.java

package ElectronicPet;/*** 电子宠物:* 名字* 年龄* 性别* 种族* 图片* 等级* 攻击力* 生命值100* 饱食度100* 心情100* 主人*/
public class Pet {String petName;String petBreed;int petGrade = 0;int petHealth = 100;int petHungerValue = 100;int petMood = 100;public Pet(String petName, String petBreed) {this.petName = petName;this.petBreed = petBreed;}//eatvoid eatFood(String food) throws InterruptedException {System.out.println(this.petName + "正在食用" + food);for (int i = 0; i < 5; i++) {Thread.sleep(300);System.out.print("吭哧~~");}System.out.print("吃完了!\n饱食度+20!!\n");petHungerValue += 20;if (petHungerValue > 100) petHungerValue = 100;}//singvoid sing(String song) throws InterruptedException {System.out.println(this.petName + "正在歌唱" + song);for (int i = 0; i < 5; i++) {Thread.sleep(300);System.out.print("啦啦~~");}System.out.print("唱完了!\n心情+20!!\n");petMood += 20;if (petMood > 100) petMood = 100;}
}

效果


使用面向对象思想实现简易图书管理系统

图书类

  • 属性

    • 编号

    • 书名

    • 作者

    • 价格

图书管理员类

  • 属性

    • 用户名

    • 密码

    • 图书数组

  • 方法

    • 添加

    • 查看

    • 修改

    • 删除

Book.java

package LibraryManagementSystem;/*** 图书* 编号* 名字* 价格* 作者* 方法:* 打印信息*/
public class Book {private long bookId;private String bookName;private float bookPrice;private String bookAuthor;private String[] bookInfoArr = {"编号", "名字", "价格", "作者"};public String[] getBookInfoArr() {return bookInfoArr;}public void setBookInfoArr(String[] bookInfoArr) {this.bookInfoArr = bookInfoArr;}public long getBookId() {return bookId;}public void setBookId(long bookId) {this.bookId = bookId;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public float getBookPrice() {return bookPrice;}public void setBookPrice(float bookPrice) {this.bookPrice = bookPrice;}public String getBookAuthor() {return bookAuthor;}public void setBookAuthor(String bookAuthor) {this.bookAuthor = bookAuthor;}public Book() {}public Book(long bookId, String bookName, float bookPrice, String bookAuthor) {this.bookId = bookId;this.bookName = bookName;this.bookPrice = bookPrice;this.bookAuthor = bookAuthor;}public void PrintBookInfo() {System.out.println("===================");System.out.println("编号:" + bookId);System.out.println("书名:" + bookName);System.out.println("价格:" + bookPrice);System.out.println("作者:" + bookAuthor);}
}

ManagementSystemUser.java

package LibraryManagementSystem;/*** 用户* 账号* 密码* 等级*/
public class ManagementSystemUser {private String managementSystemUserId;private String managementSystemUserPwd;private int managementSystemUserGrade;private String[] managementSystemUserTerm = {"用户名", "用户密码", "用户组"};public String[] getManagementSystemUserTerm() {return managementSystemUserTerm;}public void setManagementSystemUserTerm(String[] managementSystemUserTerm) {this.managementSystemUserTerm = managementSystemUserTerm;}public String getManagementSystemUserId() {return managementSystemUserId;}public void setManagementSystemUserId(String managementSystemUserId) {this.managementSystemUserId = managementSystemUserId;}public String getManagementSystemUserPwd() {return managementSystemUserPwd;}public void setManagementSystemUserPwd(String managementSystemUserPwd) {this.managementSystemUserPwd = managementSystemUserPwd;}public int getManagementSystemUserGrade() {return managementSystemUserGrade;}public void setManagementSystemUserGrade(int managementSystemUserGrade) {this.managementSystemUserGrade = managementSystemUserGrade;}public ManagementSystemUser(String managementSystemUserId, String managementSystemUserPwd, int managementSystemUserGrade) {this.managementSystemUserId = managementSystemUserId;this.managementSystemUserPwd = managementSystemUserPwd;this.managementSystemUserGrade = managementSystemUserGrade;}void PrintManagementSystemUserInfo() {System.out.println("用户名:" + managementSystemUserId);System.out.println("用户密码:" + managementSystemUserPwd);System.out.println("用户组:" + managementSystemUserGrade);}
}

ManagementSystem.java

package LibraryManagementSystem;import java.util.Scanner;/*** 管理系统* 版本号* 登录注册用户组* 用户组数组* 图书数组* 区分用户组* 管理员:增删改查* 成员:查* 方法:* 对图书的增删改查*/
public class ManagementSystem {private int versionNo;private ManagementSystemUser[] managementSystemUserArr;private Book[] bookArr;public int getVersionNo() {return versionNo;}public void setVersionNo(int versionNo) {this.versionNo = versionNo;}public ManagementSystem() {Scanner sc = new Scanner(System.in);System.out.print("初始化软件:\n设置用户规模:");managementSystemUserArr = new ManagementSystemUser[sc.nextInt()];System.out.print("设置图书规模:");bookArr = new Book[sc.nextInt()];boolean flag = true;//循环功能while (flag) {System.out.print("==========\n1.登录\n2.注册\n3.退出\n选择:");switch (sc.nextInt()) {//登录case 1:System.out.print("用户名:");String loginId = sc.next();System.out.print("密码:");String loginPwd = sc.next();//登录if (UserLogin(loginId, loginPwd) != -1) {//区分用户组,成员if (managementSystemUserArr[ManagementSystemUserFindById(loginId)].getManagementSystemUserGrade() == 1) {System.out.println("Welcome!");boolean flag1 = true;//循环功能while (flag1) {System.out.print("===================\n1.查看所有书籍\n2.搜索书籍\n3.退出\n选择:");switch (sc.nextInt()) {case 1:ViewAllBookInfo();break;case 2:SearchDeleteUpdateBookInfoUtil(2);break;case 3:flag1 = false;break;}}//区分用户组,管理员} else if (managementSystemUserArr[ManagementSystemUserFindById(loginId)].getManagementSystemUserGrade() == 0) {System.out.println("Welcome!Admin!");boolean flag2 = true;//循环功能while (flag2) {System.out.print("===================\n1.查看所有书籍\n2.搜索书籍\n3.增加书籍\n4.删除书籍\n5.修改书籍\n6.退出\n选择:");switch (sc.nextInt()) {case 1:ViewAllBookInfo();break;case 2:SearchDeleteUpdateBookInfoUtil(2);break;case 3://循环输入书籍信息Book book = new Book();String[] bookInfoTerm = book.getBookInfoArr();String[] bookInfoTermNull = new String[book.getBookInfoArr().length];for (int i = 0; i < bookInfoTerm.length; i++) {System.out.print("请输入书籍" + bookInfoTerm[i] + ":");bookInfoTermNull[i] = sc.next();}//没有异常就添加-1:重复 -2:满员if (AddBookInfo(Long.parseLong(bookInfoTermNull[0]), bookInfoTermNull[1], Float.parseFloat(bookInfoTermNull[2]), bookInfoTermNull[3]) != -1 && AddBookInfo(Long.parseLong(bookInfoTermNull[0]), bookInfoTermNull[1], Float.parseFloat(bookInfoTermNull[2]), bookInfoTermNull[3]) != -2) {System.out.println("添加成功!");} else if (AddBookInfo(Long.parseLong(bookInfoTermNull[0]), bookInfoTermNull[1], Float.parseFloat(bookInfoTermNull[2]), bookInfoTermNull[3]) == -1 || AddBookInfo(Long.parseLong(bookInfoTermNull[0]), bookInfoTermNull[1], Float.parseFloat(bookInfoTermNull[2]), bookInfoTermNull[3]) == -2) {System.out.println("重复或满员!");}break;case 4:SearchDeleteUpdateBookInfoUtil(1);break;case 5:SearchDeleteUpdateBookInfoUtil(3);break;case 6:flag2 = false;break;}}}} else {System.out.println("用户名或密码错误!");}break;//注册case 2:System.out.println("1.成员\n2.管理员");switch (sc.nextInt()) {//成员注册case 1:System.out.print("用户名:");String registerId = sc.next();System.out.print("密码:");String registerPwd = sc.next();//没有异常就添加-1:重复 -2:满员if (UserRegister(registerId, registerPwd, 1) != -1 && UserRegister(registerId, registerPwd, 1) != -2) {System.out.println("yes");} else if (UserRegister(registerId, registerPwd, 1) == -1 || UserRegister(registerId, registerPwd, 1) == -2)System.out.println("重复或满员!");break;//管理员注册case 2://密匙就是版本号System.out.print("软件密匙:");if (sc.nextInt() == versionNo) {System.out.print("用户名:");String registerAdminId = sc.next();System.out.print("密码:");String registerAdminPwd = sc.next();//没有异常就添加-1:重复 -2:满员if (UserRegister(registerAdminId, registerAdminPwd, 0) != -1 && UserRegister(registerAdminId, registerAdminPwd, 0) != -2) {System.out.println("yes!Admin!");} else if (UserRegister(registerAdminId, registerAdminPwd, 0) == -1 || UserRegister(registerAdminId, registerAdminPwd, 0) == -2)System.out.println("重复或满员!");} else {System.out.println("联系厂商!");}break;}break;//退出case 3:flag = false;break;}}}//UserRegisterint UserRegister(String registerId, String registerPwd, int registerGrade) {int a = -1;//-1:重复int id = ManagementSystemUserFindById(registerId);//没有重复执行if (id == -1) {//找空位int nullId = ManagementSystemUserFindByNull();//有空位if (nullId != -1) {//添加managementSystemUserArr[nullId] = new ManagementSystemUser(registerId, registerPwd, registerGrade);a = nullId;} else a = -2;//满员}return a;}//UserLoginint UserLogin(String loginId, String loginPwd) {//-1:登录失败int a = -1;//循环匹配用户名和密码for (int i = 0; i < managementSystemUserArr.length; i++) {//空对象跳过if (managementSystemUserArr[i] == null) continue;if (managementSystemUserArr[i].getManagementSystemUserId().equals(loginId) && managementSystemUserArr[i].getManagementSystemUserPwd().equals(loginPwd)) {//匹配成功,登录a = i;}}return a;}//ManagementSystemUserFindByNullint ManagementSystemUserFindByNull() {//-1:匹配空位失败,满员int a = -1;//循环匹配空位for (int i = 0; i < managementSystemUserArr.length; i++) {if (managementSystemUserArr[i] == null) {//匹配成功,返回位置a = i;break;}}return a;}//ManagementSystemUserFindByIdint ManagementSystemUserFindById(String findId) {//-1:未找到Idint a = -1;//循环匹配Idfor (int i = 0; i < managementSystemUserArr.length; i++) {//空对象跳过if (managementSystemUserArr[i] == null) continue;if (managementSystemUserArr[i].getManagementSystemUserId().equals(findId)) {//匹配到Id,返回a = i;}}return a;}//BookFindByNullint BookFindByNull() {int a = -1;for (int i = 0; i < bookArr.length; i++) {if (bookArr[i] == null) {a = i;break;}}return a;}//BookFindByIdint BookFindById(long findId) {int a = -1;for (int i = 0; i < bookArr.length; i++) {if (bookArr[i] == null) continue;if (bookArr[i].getBookId() == findId) {a = i;}}return a;}//ViewAllBookInfovoid ViewAllBookInfo() {//循环打印for (int i = 0; i < bookArr.length; i++) {if (bookArr[i] == null) continue;bookArr[i].PrintBookInfo();}}//AddBookInfoint AddBookInfo(long bookId, String bookName, float bookPrice, String bookAuthor) {int a = -1;if (BookFindById(bookId) == -1) {int addBookId = BookFindByNull();if (addBookId != -1) {a = addBookId;bookArr[addBookId] = new Book(bookId, bookName, bookPrice, bookAuthor);} else a = -2;//满了}return a;}//SearchBookInfoint SearchBookInfo(long searchId) {int a = -1;int findId = BookFindById(searchId);if (findId != -1) {a = findId;}return a;}//SearchDeleteUpdateBookInfoUtilvoid SearchDeleteUpdateBookInfoUtil(int i) {//三个功能都要查IdScanner sc = new Scanner(System.in);System.out.print("输入书籍编号:");int searchDeleteUpdateId = SearchBookInfo(sc.nextInt());//查到了if (searchDeleteUpdateId != -1) {switch (i) {//deletecase 1:bookArr[searchDeleteUpdateId] = null;System.out.println("删除成功!");break;//searchcase 2:bookArr[searchDeleteUpdateId].PrintBookInfo();break;//updatecase 3:boolean flag = true;//循环修改while (flag) {//显示信息bookArr[searchDeleteUpdateId].PrintBookInfo();System.out.print("===================\n修改:\n0.退出\n1.名字\n2.价格\n3.作者\n选择:");switch (sc.nextInt()) {case 0:flag = false;break;case 1:System.out.print("输入名字:");UpdateBookInfoTerm(searchDeleteUpdateId, 1, sc.next());break;case 2:System.out.print("输入价格:");UpdateBookInfoTerm(searchDeleteUpdateId, 2, sc.next());break;case 3:System.out.print("输入作者:");UpdateBookInfoTerm(searchDeleteUpdateId, 3, sc.next());break;}}}} else System.out.println("查无此书!");}//UpdateBookInfoTermint UpdateBookInfoTerm(int updateBookId, int updateBookInfoTerm, String updateBookInfoValue) {int a = -1;switch (updateBookInfoTerm) {case 1:bookArr[updateBookId].setBookName(updateBookInfoValue);a = 1;break;case 2:bookArr[updateBookId].setBookPrice(Float.parseFloat(updateBookInfoValue));a = 2;break;case 3:bookArr[updateBookId].setBookAuthor(updateBookInfoValue);a = 3;break;}return a;}
}

Test.java

package LibraryManagementSystem;public class Test {public static void main(String[] args) {ManagementSystem ms = new ManagementSystem();}
}

1.登录注册

2.添加书籍

3.修改书籍


模拟游戏角色PK

游戏角色类

属性:姓名、阵营、武器、技能、生命值

玩家类

属性:保存游戏角色的数组

方法:添加角色、查看所有、根据编号得到角色、战斗

根据编号得到角色方法(编号){//用1开始当编号return 数组[编号-1]
}
战斗方法(角色1,角色2){/*4 5 6 7 8 9 10 11 12随机数3的倍数 6 9 12 角色1发动技能4的倍数 4 8 12 角色2发动技能12双方发动技能其余数字普通攻击一方血量低于0停止
*/
}

Character.java

package ApexPK;/*** 角色* 名字* 武器* 技能* 生命*/
public class Character {private long characterId;private String characterName;private Arms characterArms;private Skill characterSkill;private int characterHP;public Character(long characterId, String characterName, Arms characterArms, Skill characterSkill, int characterHP) {this.characterId = characterId;this.characterName = characterName;this.characterArms = characterArms;this.characterSkill = characterSkill;this.characterHP = characterHP;}public long getCharacterId() {return characterId;}public void setCharacterId(long characterId) {this.characterId = characterId;}public String getCharacterName() {return characterName;}public void setCharacterName(String characterName) {this.characterName = characterName;}public Arms getCharacterArms() {return characterArms;}public void setCharacterArms(Arms characterArms) {this.characterArms = characterArms;}public Skill getCharacterSkill() {return characterSkill;}public void setCharacterSkill(Skill characterSkill) {this.characterSkill = characterSkill;}public int getCharacterHP() {return characterHP;}public void setCharacterHP(int characterHP) {this.characterHP = characterHP;}}

CharacterManager.java

package ApexPK;/*** Character管理类*/
public class CharacterManager {private Character[] characterArr;public Character[] getCharacterArr() {return characterArr;}public void setCharacterArr(int characterArrNumber) {characterArr = new Character[characterArrNumber];characterArr[0] = new Character(1000, "科学妈妈", new Arms("R-99", 15), new Skill("黑洞", 100), 1000);characterArr[1] = new Character(1001, "高科技电子追踪犬", new Arms("R-301", 25), new Skill("扫描", 50), 1000);characterArr[2] = new Character(1002, "机器人", new Arms("L-Star", 20), new Skill("钩爪", 65), 1000);}//AddCharacterpublic int AddCharacter(Character character) {//-1:重复int a = -1;int characterArrId = FindByCharacterId(character);if (characterArrId == -1) {int characterArrNull = FindByNull();//有位置if (characterArrNull != -1) {characterArr[characterArrNull] = character;a = characterArrNull;} else a = -2;//-2:没位置}return a;}//DeleteCharacterpublic int DeleteCharacter(Character character) {//-1:无人int a = -1;int deleteCharacterArrId = FindByCharacterId(character);if (deleteCharacterArrId != -1) {characterArr[deleteCharacterArrId] = null;a = deleteCharacterArrId;}return a;}//UpdateCharacterpublic int UpdateCharacter(Character character, int switchField, Object updateValue) {int a = -1;int updateCharacterArr = FindByCharacterId(character);switch (switchField) {//名字case 1:characterArr[updateCharacterArr].setCharacterName((String) updateValue);a = 1;break;//武器case 2:characterArr[updateCharacterArr].setCharacterArms((Arms) updateValue);a = 2;break;//技能case 3:characterArr[updateCharacterArr].setCharacterSkill((Skill) updateValue);a = 3;break;//生命值case 4:characterArr[updateCharacterArr].setCharacterHP(Integer.parseInt((String) updateValue));a = 4;break;}return a;}//FindByCharacterIdpublic int FindByCharacterId(Character character) {//-1:未找到int a = -1;for (int i = 0; i < characterArr.length; i++) {if (characterArr[i] == null) continue;if (characterArr[i].getCharacterId() == character.getCharacterId()) {a = i;}}return a;}//FindByCharacter(Character)public Character FindByCharacter(Character character) {Character findCharacter = null;for (int i = 0; i < characterArr.length; i++) {if (characterArr[i] == null) continue;if (characterArr[i].getCharacterId() == character.getCharacterId()) {findCharacter = characterArr[i];}}return findCharacter;}//FindByNullpublic int FindByNull() {//-1:满员int a = -1;for (int i = 0; i < characterArr.length; i++) {if (characterArr[i] == null) {a = i;}}return a;}//ViewAllCharacterpublic void ViewAllCharacter() {System.out.println("======================================================");System.out.println("编号\t名字\t武器:攻击力\t技能:攻击力\t生命值");for (Character character : characterArr) {if (character == null) continue;ViewSingleCharacter(character, false);}}//ViewSingleCharacterpublic void ViewSingleCharacter(Character character, boolean showField) {System.out.println("======================================================");if (showField) {System.out.println("编号\t名字\t武器:攻击力\t技能:攻击力\t生命值");}System.out.println(character.getCharacterId() + "\t" + character.getCharacterName() + "\t" + character.getCharacterArms().getArmsName() + ":" + character.getCharacterArms().getArmsATK() + "\t" + character.getCharacterSkill().getSkillName() + ":" + character.getCharacterSkill().getSkillATK() + "\t" + character.getCharacterHP());}
}

Arms.java

package ApexPK;/*** 武器* 1.名字* 2.攻击力*/
public class Arms {private String armsName;private int armsATK;public Arms(String armsName, int armsATK) {this.armsName = armsName;this.armsATK = armsATK;}public String getArmsName() {return armsName;}public void setArmsName(String armsName) {this.armsName = armsName;}public int getArmsATK() {return armsATK;}public void setArmsATK(int armsATK) {this.armsATK = armsATK;}
}

Skill.java

package ApexPK;/*** 技能* 1.名字* 2.攻击力*/
public class Skill extends Object {private String skillName;private int skillATK;public Skill(String skillName, int skillATK) {this.skillName = skillName;this.skillATK = skillATK;}public String getSkillName() {return skillName;}public void setSkillName(String skillName) {this.skillName = skillName;}public int getSkillATK() {return skillATK;}public void setSkillATK(int skillATK) {this.skillATK = skillATK;}
}

Main.java

package ApexPK;import java.util.Random;
import java.util.Scanner;/*** PK台* 初始化角色数量* 主页面* 0.退出* 1.查看所有角色* 2.搜索角色* 3.添加角色* 4.删除角色* 5.修改角色* <p>* 修改页面* 修改哪个字段:* 0.退出* 1.名字* 2.武器* 3.技能* 4.生命*/
public class Main {//操作类CharacterManager characterManager = new CharacterManager();Scanner sc = new Scanner(System.in);Random rd = new Random();public static void main(String[] args) throws InterruptedException {Main main = new Main();//初始化人数main.initCharacterNumber();//主页面main.mainPage();}public void initCharacterNumber() {Scanner sc = new Scanner(System.in);System.out.print("初始化角色数量:");characterManager.setCharacterArr(sc.nextInt());}//主页面public void mainPage() throws InterruptedException {System.out.println("======================================================\n" +" 0.退出\n" +" 1.查看所有角色\n" +" 2.搜索角色\n" +" 3.添加角色\n" +" 4.删除角色\n" +" 5.修改角色\n" +" 6.开始PK");System.out.print("选择:");switch (sc.nextInt()) {case 0:System.exit(0);case 1:characterManager.ViewAllCharacter();break;case 2:SearchCharacter();break;case 3:AddCharacter();break;case 4:DeleteCharacter();break;case 5:UpdateCharacter();break;case 6:TwoCharacterPk();break;default:System.out.println("有误!");}mainPage();}//PKpublic void TwoCharacterPk() throws InterruptedException {Character firstCharacterNull = InputCharacterId("输入第一位角色编号:");int firstCharacterId = characterManager.FindByCharacterId(firstCharacterNull);if (firstCharacterId == -1) System.out.println("无人!");else {Character secondCharacterNull = InputCharacterId("输入第二位角色编号:");int secondCharacterId = characterManager.FindByCharacterId(secondCharacterNull);if (secondCharacterId == -1) System.out.println("无人!");else {//通过只包含Id的角色找到真正的对象Character firstCharacter = characterManager.FindByCharacter(firstCharacterNull);Character secondCharacter = characterManager.FindByCharacter(secondCharacterNull);//HPint firstCharacterHP = firstCharacter.getCharacterHP();int secondCharacterHP = secondCharacter.getCharacterHP();//名字String firstCharacterName = firstCharacter.getCharacterName();String secondCharacterName = secondCharacter.getCharacterName();//武器名字String firstCharacterArmsName = firstCharacter.getCharacterArms().getArmsName();String secondCharacterArmsName = secondCharacter.getCharacterArms().getArmsName();//武器攻击力int firstCharacterArmsATK = firstCharacter.getCharacterArms().getArmsATK();int secondCharacterArmsATK = secondCharacter.getCharacterArms().getArmsATK();//技能名字String firstCharacterSkillName = firstCharacter.getCharacterSkill().getSkillName();String secondCharacterSkillName = secondCharacter.getCharacterSkill().getSkillName();//技能攻击力int firstCharacterSkillATK = firstCharacter.getCharacterSkill().getSkillATK();int secondCharacterSkillATK = secondCharacter.getCharacterSkill().getSkillATK();do {//随机数 4~12 3倍数角色1技能 4倍数角色2技能 12都技能 其他普通攻击int whoAttack = rd.nextInt(9) + 4;if (whoAttack % 3 == 0 && whoAttack != 12) {//双方造成的伤害,普通攻击+50%波动,技能+30%波动int secondToFirstATK = secondCharacterArmsATK + rd.nextInt(secondCharacterArmsATK / 10 * 5);int firstToSecondATK = firstCharacterSkillATK + rd.nextInt(firstCharacterSkillATK / 10 * 3);firstCharacterHP -= secondToFirstATK;secondCharacterHP -= firstToSecondATK;System.out.println(firstCharacterName + "使用技能:" + firstCharacterSkillName + "对" + secondCharacterName + "造成了" + firstToSecondATK + "点伤害!");System.out.println(secondCharacterName + "使用武器:" + secondCharacterArmsName + "对" + firstCharacterName + "造成了" + secondToFirstATK + "点伤害!");} else if (whoAttack % 4 == 0 && whoAttack != 12) {int secondToFirstATK = secondCharacterSkillATK + rd.nextInt(secondCharacterSkillATK / 10 * 3);int firstToSecondATK = firstCharacterArmsATK + rd.nextInt(firstCharacterArmsATK / 10 * 5);firstCharacterHP -= secondToFirstATK;secondCharacterHP -= firstToSecondATK;System.out.println(firstCharacterName + "使用武器:" + firstCharacterArmsName + "对" + secondCharacterName + "造成了" + firstToSecondATK + "点伤害!");System.out.println(secondCharacterName + "使用技能:" + secondCharacterSkillName + "对" + firstCharacterName + "造成了" + secondToFirstATK + "点伤害!");} else if (whoAttack == 12) {int secondToFirstATK = secondCharacterSkillATK + rd.nextInt(secondCharacterSkillATK / 10 * 3);int firstToSecondATK = firstCharacterSkillATK + rd.nextInt(firstCharacterSkillATK / 10 * 3);firstCharacterHP -= secondToFirstATK;secondCharacterHP -= firstToSecondATK;System.out.println(firstCharacterName + "使用技能:" + firstCharacterSkillName + "对" + secondCharacterName + "造成了" + firstToSecondATK + "点伤害!");System.out.println(secondCharacterName + "使用技能:" + secondCharacterSkillName + "对" + firstCharacterName + "造成了" + secondToFirstATK + "点伤害!");} else {int secondToFirstATK = secondCharacterArmsATK + rd.nextInt(secondCharacterArmsATK / 10 * 5);int firstToSecondATK = firstCharacterArmsATK + rd.nextInt(firstCharacterArmsATK / 10 * 5);firstCharacterHP -= secondToFirstATK;secondCharacterHP -= firstToSecondATK;System.out.println(firstCharacterName + "使用武器:" + firstCharacterArmsName + "对" + secondCharacterName + "造成了" + firstToSecondATK + "点伤害!");System.out.println(secondCharacterName + "使用武器:" + secondCharacterArmsName + "对" + firstCharacterName + "造成了" + secondToFirstATK + "点伤害!");}System.out.print(firstCharacterHP + "  ");System.out.println(secondCharacterHP);Thread.sleep(550);} while (firstCharacterHP > 0 && secondCharacterHP > 0);if (firstCharacterHP <= 0) System.out.println(secondCharacterName + "赢了!");else System.out.println(firstCharacterName + "赢了!");mainPage();}}}//InputLong 代码复用public Long InputLong(String info) {System.out.println(info);return sc.nextLong();}//UpdateCharacterpublic void UpdateCharacter() {//调用管理类找人Character updateCharacter = InputCharacterId("输入角色编号:");int updateCharacterId = characterManager.FindByCharacterId(updateCharacter);if (updateCharacterId == -1) System.out.println("无人!");else {System.out.println("修改哪个字段:\n" +" 0.退出\n" +" 1.名字\n" +" 2.武器\n" +" 3.技能\n" +" 4.生命");System.out.print("选择:");//-1:修改失败int a = -1;switch (sc.nextInt()) {case 0:return;case 1://调用管理类修改字段1a = characterManager.UpdateCharacter(updateCharacter, 1, InputUpdate1And4FiledValue());break;case 2://调用管理类修改字段2String[] armsFiledValue = InputUpdate2And3FiledValue();a = characterManager.UpdateCharacter(updateCharacter, 2, new Arms(armsFiledValue[0], Integer.parseInt(armsFiledValue[1])));break;case 3://调用管理类修改字段3String[] skillFiledValue = InputUpdate2And3FiledValue();a = characterManager.UpdateCharacter(updateCharacter, 3, new Skill(skillFiledValue[0], Integer.parseInt(skillFiledValue[1])));break;case 4://调用管理类修改字段4a = characterManager.UpdateCharacter(updateCharacter, 4, InputUpdate1And4FiledValue());break;default:System.out.println("有误!");}if (a != -1) System.out.println("修改成功!");//UpdateCharacter();}}//InputUpdate1And4FiledValue 代码复用public Object InputUpdate1And4FiledValue() {System.out.print("输入值:");return sc.next();}//InputUpdate2And3FiledValue 代码复用public String[] InputUpdate2And3FiledValue() {System.out.print("输入名字:");String name = sc.next();System.out.print("  输入攻击力:");String ATK = sc.next();return new String[]{name, ATK};}//DeleteCharacterpublic void DeleteCharacter() {Character deleteCharacter = InputCharacterId("输入角色编号:");int deleteId = characterManager.DeleteCharacter(deleteCharacter);if (deleteId == -1) System.out.println("无人!");else {System.out.println("删除成功!");}}//InputCharacterId 因为要用编号去查找 这方法返回只带编号的角色public Character InputCharacterId(String info) {System.out.print(info);return new Character(sc.nextLong(), null, null, null, 0);}//AddCharacterpublic Character AddCharacter() {//随机4位数long id = rd.nextInt(9000) + 1000;System.out.print("输入名字:");String name = sc.next();System.out.print("输入武器名字:");String armsName = sc.next();System.out.print("  输入武器攻击力:");int armsATK = sc.nextInt();Arms arms = new Arms(armsName, armsATK);System.out.print("输入技能名字:");String skillName = sc.next();System.out.print("  输入技能攻击力:");int skillATK = sc.nextInt();Skill skill = new Skill(skillName, skillATK);System.out.print("输入生命:");int hp = sc.nextInt();Character character = new Character(id, name, arms, skill, hp);int add = characterManager.AddCharacter(character);if (add == -1) {System.out.println("编号重复!");} else if (add == -2) {System.out.println("满员!");} else {System.out.println("添加成功");}return character;}//SearchCharacterpublic void SearchCharacter() {Character searchCharacter = InputCharacterId("输入角色编号:");//先找到角色编号对应的数组下标int searchCharacterId = characterManager.FindByCharacterId(searchCharacter);if (searchCharacterId == -1) System.out.println("无人!");else {//通过下标获取角色对象//Character searchCharacterCharacter = characterManager.FindByCharacter(characterManager.getCharacterArr()[searchCharacterId]);Character searchCharacterCharacter = characterManager.getCharacterArr()[searchCharacterId];characterManager.ViewSingleCharacter(searchCharacterCharacter, true);}}}

1.查看所有角色

2.搜索角色

3.添加角色

4.删除角色

5.修改角色

6.开始PK


错题解析

1. 有如下程序段,则表达式a == b与s2 == s1的结果分别是:( A )。

int a ,b;

a= b = 5;

String s1 = “祝你今天考出好成绩!”;

String s2 = s1;

String s3=“祝你今天考出好成绩!”;

[A] true与true [B] false与true

[C] true与false [D] false与false

  • 不该错的,只是直接给出字符常量的话,Java会自动在常量池中找到已经创建的字符串

2.下列说法中,正确的是:( A )

[A] 类是变量和方法的集合体 [B] 数组是无序数据的集合

[C ] 抽象类可以实例化 [D ] 类成员数据必须是公有的

  • 就觉得A太过于绝对,去选了B,数组就是因为有索引的原因,他是有序的

3.给出下面代码, 那个语句是正确的?( A )

​ public class Person{
​ int arr[] = new int[10];
​ public static void main(String a[]) {
​ System.out.println(arr[1]);
​ }
​ }

[A] 编译时将产生错误; [B] 编译时正确,运行时将产生错误;

[C] 输出零; [D] 输出空;

  • 考虑到了字符串有默认值,但没考虑到使用的是成员数组,要么给定static修饰,要么创建实例使用

4.下列说法正确的是( A )

[A] 能被java.exe成功运行的java class文件必须有main()方法

[B] Java源码编译完生成平台直接可运行的二进制文件

[C] Java源码直接运行在JVM中,JVM会对源码进行编译和运行

[D] class文件是字节码,字节码是和机器相关的可运行代码

  • 选D去了,机器码才是机器可直接运行的代码

5.分析下面的Java 代码,当x=2 时,运行结果是( C )

switch ( x) {
case1: System.out.println(1) ;
case2:
case3: System.out.println(3) ;
case4: System.out.println(4) ;
}

(A) 没有输出任何结果

(B) 输出结果为3

© 输出结果是3 和4

(D) 输出结果是l 、3 和4

  • 纯粹的大意了,看见没有break直接选了D,其实是在case2:后执行

面向对象总结

类:一组相关的属性和行为的集合,是一个抽象的概念。
对象:该类事物的具体表现形式,具体存在的个体。
成员变量:事物的属性
成员方法:事物的行为
比如小杨和老陈都有姓名、年龄、身高、体重等一些属性,并且两人都能够进行聊天、运动等相似的行为。
由于这两个人具有这些共性的地方,所以把它抽象出来,定义为一个类——人类,而小杨和老陈正是这个类中的个体(对象)。
类是对象的抽象,而对象是类的具体实例。
成员变量和局部变量的区别
位置:成员在方法外,局部在方法内
内存中:成员在堆中,局部在栈中
生命周期:成员随对象销毁,局部随方法销毁
初始值:成员有默认,局部必须赋值

面向过程和面向对象
举个例子,把大象放进冰箱这个问题
面向过程:1.第一步,先打开冰箱门。2.第二步.把大象放进冰箱。3.最后,关上冰箱门
面向对象:1.有人这个对象,他有把大象放进冰箱的方法。2.有大象这个对象,他有自身的属性。3.有冰箱这个对象,他有开门关门的方法,把东西冷藏的方法。
面向过程——步骤化
面向对象——行为化

封装
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
简单来说就是用public、private、protected 等权限修饰符给属性方法上锁。不需要知道类中的这个方法的逻辑原理,只需要给他一个对外的接口能够调用这个方法即可,就比如冰箱,我们只需要往里面拿东西,放东西,不需要知道里面的结构。
定义好属性后,IDE可以自动生成get、set、toString、equals、构造方法。

继承
继承就是在一个已有类的基础上派生出新类—子类继承父类(只支持单继承但支持多层继承),子类就有了父类的属性和方法,提高了代码的复用性。

多态
指用一个方法,却有着不同的表现形式,比如在吃饭的方法上,不同的动物有不同的方式。
具体点就是写好一个总的方法类后,子类继承这个类,去覆盖重写这个方法,用父类对象去装子类对象,再去使用定义的方法,就是子类的方法了。

抽象类
每个动物都要吃饭,但是只说动物吃什么?不同的动物就有不同的吃法,所以动物吃饭是个抽象的概念,就有了抽象的方法,有了抽象的方法,这个类也要变成抽象的类,由子类去继承这个抽象类,比如猫狗继承后,必须覆盖重写吃的方法,狗吃骨头,猫吃鱼。

接口
接口与继承的用法类似也是子类继承父类,但与普通类不同,接口的继承叫实现,接口可以同时实现多个。

继承是一个 "是不是"的关系,而接口实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系。

这周的面向对象更多是概念上的学习,在代码程序bug上没遇到什么问题,更多的是再写的时候要思考好整个程序的框架,要不要写继承,要不要给这个类写多态,也了解到在内存中对象、局部变量、常量分别放在哪块,继承多态可能只有多写程序,多思考才能真正掌握。以上

华清远见-重庆中心-JAVA面向对象阶段技术总结/知识点梳理/个人总结相关推荐

  1. 华清远见-重庆中心-JAVA基础阶段技术总结/知识点梳理/个人总结/关于JAVA技术的解析(看法)/面试题解析

    Java基础知识 概述 什么是java:1.是边编译边解释的面向对象的编程语言. 2.java语言是1995年发布的,发布语言公司是:Sun 3.下载安装Java时从Oracle官网下载,最好下载LT ...

  2. 华清远见-重庆中心-JAVA高级阶段技术总结/知识点梳理/面试题解析

    String字符串 String是一个类,属于数据类型中的引用类型. Java中一切使用""引起来的内容,都是这个类的实例,称为字符串对象. 字符串在定义后,值不可改变,是一个常量 ...

  3. 华清远见-重庆中心-JAVA高级阶段技术总结/知识点梳理/个人总结

    文章目录 String字符串 String类使用时注意 如何创建字符串对象 1.使用""赋值创建! 2.通过构造方法创建 不同方式创建字符串的过程 使用""赋值 ...

  4. 华清远见-重庆中心-JAVA面向对象阶段技术总结

    华清远见-重庆中心-JAVA面向对象阶段技术总结 面向对象和面向过程的编程思想 面向对象(OOP) 通过创建(new)对象,赋予对象对应的行为和特征,让这些对象相互配合来解决问题 面向过程(POP) ...

  5. 华清远见重庆中心-java面向对象阶段技术总结

    目录 Java面向对象编程 1. 面向对象编程概述 类.对象.方法 类Class 对象(Object) 类和对象的关系 面向对象的三大特性 封装 继承 多态 Java面向对象编程 1. 面向对象编程概 ...

  6. 华清远见重庆中心—JAVA面向对象阶段技术总结/个人总结

    课后练习回顾,疑难重点总结(二) 目录 课后练习回顾,疑难重点总结(二) 面向对象习题脉络梳理 1.模拟双色球中奖(Java基础补充) 2.模拟"电子宠物"(构造方法的应用) 小结 ...

  7. 华清远见重庆中心——Java面向对象阶段技术总结/个人总结

    个人总结 在这一周学习中比较让我困惑的是: 我跟着老师学习的时候能很好的理解,但是自己独立完成作业的时候就会磕磕碰碰的,思路不够清晰,并且不乏存在因为粗心犯的错误而导致进度卡壳的时刻(例如循环嵌套时位 ...

  8. 华清远见-重庆中心-JAVA面向对象阶段技术总结:

    对象和类: 对象object: 某个类的具体实例. 类class: 是拥有相同属性和行为的对象的集合,设类的模板. 定义类: 修饰符 class 类名{//属性:定义变量//行为:定义方法 } 创建对 ...

  9. 华清远见- 重庆中心-JAVA面向对象阶段技术总结

    什么是面向对象 Java 是面向对象的编程语言,对象就是面向对象程序设计的核心.所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念.对象 ...

最新文章

  1. 兄弟,用大白话给你讲小白都能看懂的分布式系统容错架构
  2. JSON.toJSONString(object, SerializerFeature.WriteMapNullValue);第二个参数作用
  3. html编辑器 br 被div,百度Ueditor编辑器DIV,html标签替换及代码被过滤问题解决方法...
  4. LAMP(4)Apach和php结合、Apache默认虚拟主机
  5. 莆田学院计算机科学与技术分数,莆田学院录取分数线2021是多少分(附历年录取分数线)...
  6. python下载图片到文件夹_python实现解析markdown文档中的图片,并且保存到本地~
  7. mybatis主键返回
  8. CSS3D写3d画廊滚动
  9. java定时任务插件_jfinal定时调度任务插件QuartzPlugin
  10. H3C nqa 配置
  11. 计算机Word文档新建样式A1是啥意思,高会《职称计算机》Word 2007:创建新样式
  12. java gc 监控_java 内存、GC、性能监控
  13. 一牛网5G产品及方案:mtk5G/高能5G核心板/5GCPE/5G相关仪器
  14. 机器学习-*-K均值聚类及代码实现
  15. 大二数据库实验报告答案
  16. Access-Control-Allow-Credentials
  17. 力天创见热区统计方案
  18. CentOS6 使用 RPM 安装 apache 服务器(一)
  19. Python入门程序
  20. PHP报错:414 Request-URI Too Large

热门文章

  1. 彩色图像--色彩空间 HSI(HSL)、HSV(HSB)
  2. Apache batik 转换svg文件为jpeg/png/pdf
  3. javascript正则表达式验证手机号
  4. linux启动注册内存失财,Linux创建者开喷英特尔:扼杀ECC内存市场
  5. 阿里云盘内测_阿里云盘内测码,每日限量,先到先得
  6. 中小型企业网络架构实验
  7. Java复习计划激烈准备中ing
  8. 【adb】 win11 配置 adb环境 史上最详细
  9. 安装 CentOS 7 后必做的七件事
  10. 并发编程--线程同步之 synchronized关键字(一)