tags
date
type
status
slug
category
summary
password
icon
day1
- 包名以域名开头 tech.gaoqilan.main 例如百度: com.baidu.main
- 创建的类每一个单词以大写开头,后面接上_名称缩写 比如你是张三,要创建一个框架类 MainFrame_ZS
- 类的定义格式: 权限修饰符 类的关键字 类名{} 最常见的
publish class Main{}
和publish static void main(String[] args){}
,这里的class
static
都是关键字,要遵守命名规则和规范 - main方法 格式固定,是java程序的入口,表示类可被执行
- 一个项目中可以存在多个类有main方法,一个类对应一个main方法
- 窗口类 JFrame 创建方法:继承 、 直接创建
JFrame
- 面向对象编程指的是 如何定义类和如何去使用类中的方法和属性,直接使用属性的方法很少见(属性就是我们常说的变量,而方法就是我们常说的函数)
- 方法后面必须跟(),属性不用,在定义和调用的时候如此
public class Person { String name; // 定义属性 public void printName() { System.out.println(name); }}Person person = new Person();person.name = "Alice"; // 访问属性,不需要 ()person.printName(); // 调用方法,必须加上 ()
- 核心思想:如何定义和使用更好的类
- 为什么关闭了窗口之后,任务管理器进程也停止了,但是IDEA并没有停止程序
- 每个Java程序都是一个虚拟机(JVM)
- 在swing编程中面板是指 Jpanel 这个类,在 JFrame 中自带有一个面板,但那个面板有bug,使用要注意导入
import javax.swing.JPanel; import javax.swing.JFrame;
- 子类 —— 父类 ==超类 —— 基类
java 继承 格式: public class 子类名 extends 父类名 注意: 1.父类必须先存在 2.子类只能继承父类非私有的属性和方法 3.同一个包下除了不能继承私有属性和方法,其他都可以 4.不同包下只能继承公共部分和被保护
方法重写: 当子类继承了父类的某个方法时,子类可以根据自身的需求对父类的这个方法进行重新定义。这种重新定义称为方法重写 1.子类只能重新定义父类中的方法,尽可能的一摸一样(保证不会报错) 2.重写方法不能比父类的方法更严格 3.形参列表必须相同 4.返回值相同 5.只能抛出相同或更少的异常 6.子类使用的方法和父类得一样才能重写(静态和静态分别得一致) 7.如果一个方法不能被继承,则不能重写(你都不能继承,重写个屁) 8.最好加上@Override 注解:
- 在实际开发过程中,要看类的官方文档
day2
- 属性:默认会被赋值
- 写在类的{}中,方法和代码块的{}之外
- 实例属性: 权限修改符 数据类型 属性名 [= 初始值]
- 类属性: 权限修改符 static 数据类型 属性名[ = 初始值 ]
- 变量:
- 四种类型
- 整型:四个
- byte:一个字节 8位 -128~127
- short 两个字节 16位
- int 四个字节 32位
- long 八个字节 64位,数值后面带L或l
- 浮点型
- float 单精度 四个字节 数值后面带F或f
- double:双精度 八个字节
- 字符型,有且只有一个,默认位“”
- char只能用''包裹,只有一个符号(字母、数字、中文)
- 布尔型
- boolean 只有false和true
- 引用数据类型:三大类,无数个,默认值都为null
- 类:使用class关键字定义的,例如String
- 数组:使用[]标识
- 接口:使用interface 关键字定义
P7
- 将棋子再全部放进数组中
- 要将所有的x和y坐标放在同一个数组中
- 另一种思路,将棋盘看成一个个坐标组合,将坐标单元设置成一个固定值,然后每个的位置就是1234递增
- 关于第一个棋子的位置,实际上是棋子大小减去棋子边距
- 先解决一次性画全部的办法,不要又复制一遍上面的代码,设置一个反转坐标的办法
- 反转完,没必要再又复制上面的循环,个人觉得可以创建个方法或者再加一个循环,当内层的走完,说明画完了,接着player变1,同时的话还得修改下面的反转函数,先判断player是不是0,是的话之后内层的for循环用原始x坐标
- 但是问题来了,如果每次都要传进去判断player是不是1再决定用不用反转后的坐标,好像也很麻烦
- 我们这个有些问题,只能画,不能实时更新,因为这是全局变量
P8
- 面向对象就是提取类
- 新建的类都得有什么方法呢? —— 参考上个代码想想要定义什么
- 先提取变量
- 哪些变量用什么权限
- 定义的常量,只能定义时或代码块中修改值,其他不允许修改
- 类创建好之后,要创建类的对象
- 对于想要获取类中的内容的变量,但是为了安全性,要将其中的变量设置为private,并且设置 set 和 get函数
- 有些问题,数组会打印两次,同时功能都放在一起太杂了(又是创建,绘制,又是保存到数组中),要将功能分开写
- 想要一开始运行打印棋盘,就是使用构造方法
- 构造方法的作用:在创建对象的时候就做一些必须做的事情
- 构造方法可以让我们自定义创建对象时,做一些必要的操作
P10
- 如何操作棋子
- 点击棋盘
- 如何获取棋子对象
- 如何判断点击的地方是否有棋子
- 如何区分选择、重新选择、移动、吃子
- 添加点击事件
- 点击之后显示点击在哪里
- 但是点击很难精确,所以需要有个范围约束
- 根据xy坐标计算网格对象转换思维,不是看xy的范围,站在更高的角度去看问题,通过将棋盘分成一个一个区,并且以坐标-棋子间距+棋子大小 去除以棋子间距 实现棋盘的分区
- 不能直接修改 + 要返回Point值
- 所以创建一个Point对象,而不直接修改
- 定义坐标范围不能超过棋盘
- 如何找棋子,利用网格坐标p对象查找棋子对象,然后判断和数组中的棋子位置一不一样,为空,说明点击的不是棋子对象
p11
- super的作用:调用父类中的方法或属性
- 为什么还是没有清除原来的痕迹呢?
- 因为共用的是同一套坐标,改其中一个棋子的坐标,那么这个也会造成另一个被改变
- 栈:保存局部变量对对象的引用(就是我们常说的定义类变量等)
- 定义对象的引用 类 变量名
- 堆:new 出来的对象
- 方法区:
- 常量池
- 静态域:
p12
- 如何判断是不是第一次点击
- 设置一个成员变量,如果它有值存在的话,说明不是第一次
- 如何判断选中完第n次之后是吃子还是移动,还是重新选择
p13
- 如何给选中的象棋加个框框
- 难点,如何制作移动规则
p14 提取移动范围内
- 判断上边还是下边
day3
p15马走日字
- 个人觉得有个问题应该先被优化,就是路径上是否有其他棋子,
- 找蹩脚点真的很牛逼
p16车
- 实际上应该包括目标点,起点可以不用包括原点,看路径上有没有棋子,没有返回0,有判断是不是在目标点(即吃子)返回2,否则返回1(即路径上非终点有棋子挡住了)
- 一定得注意局部变量的名字和属性的方法的问题
- up主这里的问题是将循环统一化,没有分开,也就是不区分起始点和目标点谁小,默认将小的点当作起始点,实际上这可能是终点
- 同时又引用start和end表示起点,终点,这个在循环当中就有问题
p17炮和吃子
- 得知道棋子的位置,再将它从数组中删除被吃掉的棋子
- 一开始不知道它的位置,得知道,这里使用索引解决每次的遍历搜索问题
- 空指针异常
18兵规则
- 能不能过河,看的是它的位置点,而不是目标点
- up主想的太复杂了,应该牺牲掉代码复用性,直接选择分两种情况,过河可以左右前进一格,没过河只能进去1格即可,没必要考虑能不能后退
- tp是目标 p 是当前
- 直接在兵的判断能不能走那里,使用两个if判断能不能
- 现在up主更新后的代码又好了
p21 棋盘规则的实现
- 红方不可以操作黑方棋子
- 轮流走棋
- 记住当前得到阵营
p22 Java方法总结
- 存在一个情况,并没有用到太多的面向对象中太多的知识点(后面改用类,接口等了)
- 面向对象与面向过程
- 类和类的成员
- 类的定义格式
- 类与对象
- 引用
- 多个引用可以指向同一个对象,修改一个引用的对象,其他指向同一个对象的引用也会看到修改的结果。
- 匿名对象
- 以图形为例
- 直线-Line
- 矩形-Rect
- 圆-Circle
- 使用swing绘制图形
- 类的成员
- 属性
- 实例方法
- 权限修饰符 返回值类型 方法名(形参列表){方法体}
- 调用:必须通过 实例.方法(有参传参 )
- 返回值类型
- void 方法不需要强制写return语句
- 数据类型 —— 必须有关系的值或对象,可能是基本数据类型,保持一致,如果是引用数据类型,可以返回的是子类对象或相同类型的值
- 类方法
- 权限修饰符 static 返回值类型 方法名(形参列表){方法体}
- 调用:通过 实例.方法(有参传参 ) 或 类名.方法名(实参)
- 构造方法
- 权限修饰符 返回值类型 方法名(形参列表){方法体}
- 方法体内一定是默认第一行super(实参);//调用父类中的构造方法
- 作用:当构造对象的时候,必须要做的事情,可以写在构造方法中
- 每个类都有一个无参的构造方法,如果显式定义了一个有参的构造方法,则不再默认的构造方法,需要显示的定义
- 方法
- 定义
- 实例方法
- 类方法
- 形参
- 调用
- 实例方法
- 类方法
- 实参
- 重载
- 方法名称相同,形参列表列表不同
- 与返回值类型无关
- 与形参名无关,但是和顺序有关
- 可变参数
- 传参
- 值传递
- 地址传递
- 构造方法
- 重写
- 构造方法
- 作用
- 重载
- this
- 代码块
- 普通代码块
- 静态代码块
- 内部类
- 实例内部类
- 静态内部类
- 三大特征
- 封装
- get set方法
- toString方法
- 继承
- 权限修饰符
- 继承方式
- super
- 属性
- 方法
- 方法的重写
- 子类对象的创建过程
- 类型转换
- 转换异常
- 多态 —— 一个子类对象有多种形态,可以是父类对象形态,也可以是子类本身对象形态
- 格式:父类 实例名 = new 子类构造方法(参数列表)
- 条件
- 继承
- 实现
- 理解
- 使用
- 对象的比较
- ==操作符
- equals方法
- equalslgnore方法
- 抽象 —— 一个不具体的类(大杂烩hhh)
- 关键字: abstract
- 作用:修饰类(抽象)、方法(抽象)
- 用来设计一个没有具体功能的类
- 注意:
- 不可以被实例化(类名 实例名 = new 构造方法()
- 抽象类可以有构造方法,其构造方法主要是被子类来使用的
- 抽象类可以有抽象方法、也可以有实例方法和静态方法
- 抽象方法和抽象类,不可以被 static final private等关键字修饰
- 抽象类方法的格式: 权限修饰符 abstract 返回值类型 方法名(形参列表);
- 一般使用public
- 方便多人开发合作,一般抽象类由组长定义,具体的功能由子类来实现
- 团队主管主导项目
- 抽象方法,必须通过子类重写来使用
- 抽象方法只存在于抽象类和接口中
- 类
- 方法
- 构造方法的作用
- 相关冲突的关键字
- 接口
- 关键字 && 特性
- interface 关键字定义,其他的与类没有太大差异
- 接口中只能存 public abstract 修饰方法
- 所以接口比抽象类更抽象
- 继承只能单一继承,但是抽象可以多实现
- 接口中只能有常量,不能有其他属性
- 在JDK开始,其接口支持使用default实现,
- 实现
- default修饰符
- 匿名内部类对象
- final关键字
- 类
- 属性
- 方法
匿名对象只能被使用一次
p23 使用抽象类改版程序
- 抽象类了,不能被初始化了
- 虽然创建对象变麻烦了,但是为了多元同时合作
- 解耦合,解决上面的问题,使用多态和开发模式降耦合度
Day4
p24游戏界面的设计
- 这些都保存在窗口类内
- 右上角设置一个提示框,提示谁走棋和不能选择对方的程序
- 绝杀
- 将军
- 悔棋
- 就是撤销按钮
- 保存棋谱
- 导入棋谱
- javaFx是新的,jdk11比较友好,java swing太丑了
p25按钮点击事件
- 得给按钮加标记,方便区分点击了哪个按钮
p26类与类的实现
p27集合介绍与悔棋功能实现
- 用数组特别麻烦
- Java的数组在创建的时候必须指定长度,所以没办法记录走了多少步
- 自定义实现链表的数据结构
- 使用给定的Java集合
- 集合
- Collection
- Set接口
- HashSet
- SortedSet
- iterator
- hasNext()
- next()
- List接口
- ArrayList
- LinkedList
- Vector
- 遍历
- 循环遍历
- Iterator
- hasNext()
- next()
- 悔棋列表里面删除,然后同时数组里面得更改
- 其实还有个简单方法就是把新的数组赋值给原来的数组
p28IO流介绍
- IO流
- 一种保存到数据库中
- mysql
- oracle
- sqlserver
- 一种保存到文本文件中
- IO流
- File
- 表示一个文件或文件夹类,不具备文件读取能力
- 构造方法
- File(String path)
- 常用方法
- createNewFile():创建新文件
- delete():删除文件
- exists():判断文件是否存在
- getName():获取名称
- getPath():获取路径
- isDirectory():是否为文件夹
- Length():文件内容的长度
- List():列举文件夹中的所有文件或文件夹
- getParent():获取当前文件的目录String类型
- getParentFile():获取当前文件的目录File类型
- 输入流
- 将文件内容读取到电脑中
- 字节流 —— InputStream 只能操作文本文件,不能操作多媒体文件
- FileInputStream
- BufferStream
- ObjectInputStream
- 字符流 —— Reader 什么都能读取,但是读取文件时,对中文的处理要特别注意
- FileReader
- BufferedReader
- 输出流
- 写入内容到文件中
- 字节流 —— OutputStream
- FileOutputStream
- BufferedOutputStream
- ObjectOutputStream
- 字符流 —— Writer
- FileWriter
- BufferedWriter
- 转换流
- InputStreamReader
- OutputStreamWriter
- 如何选择棋谱保存的路径
- 保存需要一个接口,不加序列化会报错
- 作者:瑾墨
- 链接:https://www.gaoqilan.tech/Code/0ff1a31f-082e-8018-882a-e208285fda41
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。