- 浏览: 16573 次
- 性别:
- 来自: 广州
最新评论
多线程的再度复习.class
package com.javami.kudy.Demo.ThreadStudy; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /*class MyArray { 缺点: 不能准确的去唤醒一个进程.消耗资源.并且要判断... 而下面的.可以准确的唤醒下一个需要执行的.. private int arr[] = new int[10]; private int savepos = 0; private int getpos = 0; private String lock = " "; private int count = 0; //数组的角标是从零开始的,如果关锁了,其他线程在等待.. //但我不断的去抢到存的数据.那时候就乱套了... //存满了,两个存的线程等待,一个取的线程取了一个元素会唤醒一个存的线程 //存的线程存了一个,又存满了,然而此时它会唤醒,就会唤醒另一个在等待的存的线程,出错了 //解决这个问题很简单,将线程等待的条件放在一个循环里面去判断 //而实际上wait方法允许发声虚假唤醒,所以最好放在一个循环里面 //但是像上面的做法,存的线程会去唤醒存的线程,没有必要,非常影响程序的效率 public void add(int num) throws InterruptedException { //0 1 2 3 不while循环.有可能这里有两个存的进程在这里边等待 //我不一定要等待你执行完毕~~~但是线程同步,我在执行.你就不能执行..但是锁一开~~我就是while保证了虚假的 唤醒 synchronized (lock) { while(count==10) { lock.wait(); } if(savepos==10) savepos = 0; arr[savepos++] = num; count++; lock.notify(); //唤醒等待中的进程 } } public int get() throws InterruptedException { synchronized(lock) { try { while(count==0){ lock.wait(); } if(getpos==10) getpos = 0; count--; return arr[getpos++]; }finally { lock.notify(); } } } }*/ //使用1.5的lock和condition解决存和取之间的通信问题 class MyArray { private int[] arr = new int[10]; private int savapos = 0; private int getpos = 0; private int count = 0; Lock lock = new ReentrantLock(); Condition isFull = lock.newCondition(); //必须要获取同一把锁 Condition isEmpty = lock.newCondition(); public void add(int num) throws InterruptedException { try { lock.lock(); //开锁 while(count==10) isFull.await(); //等待 if(savapos==10) savapos = 0; arr[savapos++] = num; count++; isEmpty.signal(); } finally { lock.unlock();//关锁 } } public int get() throws InterruptedException { try { lock.lock(); //开锁 while(count==0) isEmpty.await(); if(getpos==10) getpos = 0; count--; return arr[getpos++]; }finally { isFull.signal(); //唤醒下一个锁 lock.unlock(); //我才关闭 } } } public class ArrayThread { /** * 写一个多线程的程序,实现两个线程存元素,两个线程取元素 */ static int num = 0; public static void main(String[] args) { final MyArray marr = new MyArray(); new Thread(new Runnable() { public void run() { for(int i=0; i<30; i++) { try { marr.add(num++); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { public void run() { for(int i=0; i<30; i++) try { System.out.println(marr.get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); new Thread(new Runnable() { public void run() { for(int i=0; i<30; i++) { try { marr.add(num++); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { public void run() { for(int i=0; i<30; i++) try { System.out.println(marr.get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }
GUI(图形用户界面)
全称:Graphical User Interface。
Java为GUI提供的对象都存在Awt,Swing两个包中。
两个包的特点。
理解组件(Component(父类))与容器(Container(子类))。
Awt
Awt与 Swing
Awt:依赖于本地系统平台,如颜色样式显示。
Swing:跨平台。
组件与容器
容器是组件的子类,是一个特殊的组件。
组件里面不可以存放组件,而容器可以。
布局管理器
FlowLayout(流式布局管理器)
从左到右的顺序排列。
BorderLayout(边界布局管理器)
东,南,西,北,中
GridLayout(网格布局管理器)
规则的矩阵
CardLayout(卡片布局管理器)
选项卡
GridBagLayout(网格包布局管理器)
非规则的矩阵
建立一个简单的窗体
Container常用子类:Window Panel(面板,不能单独存在。) Window常用子类:Frame Dialog 简单的窗体创建过程: Frame f = new Frame(“my window”); f.setLayout(new FlowLayout()); f.setSize(300,400); f.setVisible(true);
所有的AWT包中的类会运行在AWT线程上
事件处理机制组成
事件
用户对组件的一个操作,称之为一个事件
事件源
发生事件的组件就是事件源
事件处理器
某个Java类中负责处理事件的成员方法
事件分类
按产生事件的物理操作和GUI组件的表现效果进行分类:
1 MouseEvent 2 WindowEvent 3 ActionEvent 4 ……
按事件的性质分类:
低级事件
语义事件(又叫做高级事件)
事件监听机制组成
事件源
发生事件的组件对象
事件
具体发生的事件
监听器
监听器需要注册到具体的对象上,用于监听该对象上发生的事件
事件处理
针对某一动作的具体处理办法
事件监听机制
确定事件源(容器或组件)
通过事件源对象的addXXXListener(new XXXListener())方法将侦听器注册到该事件源上。
该方法中接收XXXListener的子类对象,或者XXXListener的对应的适配器XXXAdapter的子类对象。
一般用匿名内部类来实现。
在覆盖方法的时候,方法的形参一般是XXXEvent类型的变量。
事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
事件监听机制的设计
Event Listener Adapter
菜单
MenuBar,Menu,MenuItem 主要的认识~~
添加一个按钮的初步认识:
package com.javami.kudyDemo.AwtTest; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class AddButton { /** * @param args * 添加一个按钮,监听按钮.但按钮发生出异常的时候.我们应该做什么/. */ private static Frame f; public static void main(String[] args) { f = new Frame("kudy add Button"); f.setSize(300, 400); f.setLocation(100, 150); f.setLayout(new FlowLayout()); //设置布局 Button bt = new Button("点我啊~"); f.add(bt); HandleEvent(f,bt); f.setVisible(true);//可见的 } private static void HandleEvent(Frame f, Button bt) { f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { e.getWindow().dispose(); } }); //为按钮添加时间监,增加按钮 bt.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ addBtn(); } }); } //从外部实现~~ protected static void addBtn() { int num = 1; Button bt = new Button("点就点~~"+num++); f.add(bt); f.setVisible(true); bt.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e) { Button b = (Button)e.getComponent(); f.remove(b); f.setVisible(true); } }); } } //下面的内容是初懂的时候做的~~不好!! package com.javami.kudyDemo.AwtTest; import java.awt.Button; import java.awt.Component; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class FrameTest3 { /* * 添加一个按钮,点击按钮就添加一个新的按钮--点击新的按钮. * 容器继承于组件 */ public static void main(String[]args) { Frame f = new Frame(); f.setTitle("钟姑娘,相信老公好好奋斗.以后让你过上幸福的生活"); Button bt = new Button("美怡说:爱我吗?"); f.add(bt); f.setLayout(new FlowLayout()); //设计窗口为流布式 f.setSize(400,200); f.setVisible(true); //监听窗口的事件 f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { Frame f = (Frame)e.getWindow(); f.dispose(); //当触发时间的时候.咱们就把你窗口关了 } }); bt.addMouseListener(new MyMouseListener(f)); } } class MyMouseListener implements MouseListener { /* * 组合模式~~~ */ Frame f ; public MyMouseListener(Frame f) { this.f = f; } @Override public void mouseClicked(MouseEvent e) { System.out.println("美怡说:爱我吗?"); Component com = (Component)e.getSource(); Button b = (Button)com; b = new Button("威淏说:爱"); f.add(b); } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } }
抓我啊~~小游戏~~嘿嘿:
package com.javami.kudyDemo.AwtTest; import java.awt.Button; import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class ButtonGame { /** * @param args */ private static Frame f; public static void main(String[] args) { f = new Frame("Button Game_Beta1.0"); f.setSize(300, 400); f.setLocation(100, 200); Button btOne = new Button("抓我啊~~"); Button btTwo = new Button("抓我啊~~"); btTwo.setVisible(false); f.add(btOne,"North"); f.add(btTwo,"South"); f.setVisible(true); handEvent(f,btOne,btTwo); } private static void handEvent(Frame f2, final Button btOne, final Button btTwo) { f2.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { e.getWindow().dispose(); } }); btOne.addMouseListener(new MouseAdapter(){ public void mouseEntered(MouseEvent e) { e.getComponent().setVisible(false); //事件源设计为不可见 btTwo.setVisible(true); f.setVisible(true); } }); btTwo.addMouseListener(new MouseAdapter(){ public void mouseEntered(MouseEvent e) { e.getComponent().setVisible(false); //事件源设计为不可见 btOne.setVisible(true); f.setVisible(true); } }); } }
简单的记事本实现功能(等待更新与完整)
package com.javami.kudyDemo.AwtTest; import java.awt.Button; import java.awt.Dialog; import java.awt.FileDialog; import java.awt.Frame; import java.awt.Label; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.TextArea; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; class MyMenu { private Frame f; private MenuBar mb; //菜单条 private Menu fileMenu; //菜单栏部署的下拉式菜单组件。 private MenuItem open,save,close; private TextArea text; public MyMenu() { f = new Frame("kudy is notePad(Beta1.0)"); f.setSize(500, 600); f.setLocation(430, 120); mb = new MenuBar(); fileMenu = new Menu("File"); open = new MenuItem("Open(N) Ctrl+N"); save = new MenuItem("Save(S) Ctrl+S"); close = new MenuItem("Close(X)Ctrl+X"); text = new TextArea(100,120); //把下拉组件添加到菜单栏下面 fileMenu.add(open); fileMenu.add(save); fileMenu.add(close); mb.add(fileMenu); f.setMenuBar(mb); f.add(text); f.setVisible(true); handieEvent(); } private void handieEvent() { f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { e.getWindow().dispose();//释放资源 } }); open.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { openFileDialog(); } }); save.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { SaveFileDialog(); } } ); close.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { f.dispose();//直接退出 } }); /* * * 键盘的监听器 * */ text.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e) { //监听打开一个文件快捷键 if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_N) openFileDialog(); //监听另存为快捷键-->83 if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_S) SaveFileDialog(); //退出怎么监听呢?各位大牛~~ } }); } protected void SaveFileDialog() { //1.创建保存对话框(写入) FileDialog saveDialog = new FileDialog(f,"save as",FileDialog.SAVE); //2.设置对话框可见 saveDialog.setVisible(true); String dirName = saveDialog.getDirectory();//获取目录 String fileName = saveDialog.getFile();//获取文件 File file = new File(dirName,fileName); try { saveFile(file); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } /* * 另存为功能的实现 */ protected void saveFile(File file) throws IOException { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(file)); String data = text.getText(); bw.write(data); //不需要换行.由于我们在读取数据的时候已经换行了 }finally { if(bw!=null) bw.close(); } } protected void openFileDialog() { //1.创建一个文件对话框对象 FileDialog openDialog = new FileDialog(f,"file",FileDialog.LOAD); //2.设置对话框为可见,会发生阻塞,直到用户选中文件 openDialog.setVisible(true); //3.获取用户选中的文件所有的目录和文件的文件名 String dirName = openDialog.getDirectory(); String fileName = openDialog.getFile(); //4.创建File对象 File file = new File(dirName,fileName); //5.判断file是否存在,如果不存在,弹出错误的面板 if(!file.exists()){ //如果不存在,创建一个错误的面板 openErrorDialog(file); return;//结束 } //6.通过Io流将文件内容读取进来,存入Text try { openFile(file); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void openFile(File file) throws IOException { //1.创建流文件 BufferedReader br = null; try { br = new BufferedReader(new FileReader(file)); //2.清空文本域..把之前的内容请空 text.setText(""); //3.while读取,读一行,存一行 String line; while((line=br.readLine())!=null) { text.append(line); text.append("\r\n");//读完一行换行 } }finally { if(br!=null) br.close(); } } /* * 错误的对话框内容 */ private void openErrorDialog(File file) { Dialog error = new Dialog(f,"error!",true); error.setSize(300,100); error.setLocation(180, 250); //Label 对象是一个可在容器中放置文本的组件。一个标签只显示一行只读文本。文本可由应用程序更改,但是用户不能直接对其进行编辑。 error.add(new Label("Sorry,文件不存在 \t"+ file.getName()),"Center"); Button bt = new Button("Confirm"); error.add(bt,"South"); bt.addMouseListener(new MouseAdapter(){ //鼠标监听器 public void mouseClicked(MouseEvent e) { ((Window)(e.getComponent().getParent())).dispose(); } }); error.setVisible(true); } } public class MyMenuTest { /** * 记事本工具的实现 */ public static void main(String[] args) { MyMenu my = new MyMenu(); } }
简单的资源管理器(还有很多功能没有做好啦~~)
package com.javami.kudyDemo.AwtTest; import java.awt.Button; import java.awt.Frame; import java.awt.List; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; class MyList { private Frame f; //TextField 对象是允许编辑单行文本的文本组件。 private TextField tf; //按钮 private Button bt; //List 组件为用户提供了一个可滚动的文本项列表。可设置此 list,使其允许用户进行单项或多项选择。 private List l; private Panel p; public MyList() { f = new Frame("资源管理Beta1.0"); f.setSize(400,500); f.setLocation(100, 100); //位置 tf = new TextField(42); bt = new Button("Go~!"); l = new List(40); p = new Panel(); //面板 p.add(tf,"West");//南 p.add(bt,"East");//东 p.add(l,"Center");//中 f.add(p,"North"); //北 f.add(l,"Center"); f.setVisible(true); handleEvent(); } //触发事件 private void handleEvent() { f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { e.getWindow().dispose(); //关闭 } }); bt.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e) { disPlayFile(); } }); //监听List l.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { //获取一个文件名 String fileName = l.getSelectedItem(); //获得文件的所在目录 String dirName = tf.getText(); if(dirName.endsWith(":")); dirName+="\\"; //创建File对象 File file = new File(dirName,fileName); //判断是目录还是标准的文件 if(file.isDirectory()) { //取出文件名,将文件名给文本域 tf.setText(file.getAbsolutePath()); // disPlayFile();//又走入下一个目录 }else { try { Runtime.getRuntime().exec("cmd /c " + file.getAbsolutePath()); }catch(Exception ex) { ex.printStackTrace(); System.out.println("打开失败"); } } } }); } protected void disPlayFile() { //1.获得文本域输入的内容 String dirName = tf.getText(); //2.创建File对象 //如果是以冒号结尾,应该加上:\\ if(dirName.endsWith(":")) dirName+="\\"; File dir = new File(dirName); if(!dir.isDirectory()) return ; //4.如果是目录,遍历目录下所有的文件 String[]fileNames = dir.list(); //5.list要清空 l.removeAll(); for(String fileName :fileNames ) l.add(fileName); } } public class FileList { public static void main(String[]args) { MyList ml = new MyList(); } }
个人学习心得:
总体来说都坚持过来了~~但是时间方面处理不够好~~由于晚上精神不是很好!!代码需要复习.重要的是掌握好思路..
加油..
坚持相信都会有回报的啦~~~
发表评论
-
javase_22(TCP的理解)
2012-09-02 19:43 647TCP传输 Socket(客户端)和ServerSocket( ... -
javase_21(DUp的学习-->*)
2012-08-30 00:45 727Socket网络编程 网络协议 IP地址与端口号 本 ... -
javase_19(多线程)
2012-08-24 23:32 875进程: 进程是具有一定独立功能的程序关于某个数据集合上的一次 ... -
javase_18(回顾与反射机制学习)
2012-08-20 11:58 462AM上午总结: package com.ja ... -
javase_17(IO的总结)
2012-08-20 11:55 1070所有的流在使用完毕时,都需要调用close方法进行关流,释放资 ... -
javase_16(其它流)
2012-08-20 11:52 911IO包中的其他流: 1.打印流 a)PrintWri ... -
javase_16(其它流)
2012-08-20 11:38 0IO包中的其他流: 1.打印流 a)PrintWri ... -
javase_15(File类的应用)
2012-08-19 00:07 902File类:用来将文件或者 ... -
javase_14(字节流)
2012-08-19 00:00 726字节流的抽象基类: InputStream(输入) ... -
javase_13(字符流)
2012-08-19 00:00 624IO(Input OutPut)流 IO流用来处理设备 ... -
javase_12(集合+时间对象)
2012-08-19 00:00 583Map集合 1.Map存储了一系列键值的映射关系2.M ... -
javase_11(集合的理解)
2012-08-19 00:00 888集合类: 为什么使 ... -
javase_10(String类日常操作)
2012-08-18 09:40 842第一: package com.ja ... -
javase_09(面向对象总结)
2012-08-18 09:39 917Java的环境配置 day01 1. 环 ... -
javase_08(基础面试题)
2012-08-18 09:38 765面试题:请说说抽象类和接口的区别 抽象类,使用abstrac ... -
javase_07(继承与设计模式)
2012-08-18 09:36 646/* 子类对象的实 ... -
javase_06(面向对象)
2012-08-18 09:29 703/* 内部类: .在类中定义的类我们称之为内部类, ... -
javase_05(面向对象)
2012-08-16 11:25 0一.构造函数的定义与 ... -
javase_05(面向对象)
2012-08-16 11:22 829一.构造函数的定义与作用 1.函数的名次与类同名2.没有 ... -
javase_04(面向对象)
2012-08-16 11:21 559面向对象:一种编程思想,使用对象来描述生活中的事物:面向对象的 ...
相关推荐
JavaSE_8_GUI编程JavaSE_8_GUI编程JavaSE_8_GUI编程JavaSE_8_GUI编程
这个名为"javase_day04_v1_pm_all.zip"的压缩包文件显然是一个教学资源集合,旨在帮助学习者巩固和深化Java SE(标准版)的知识。"day04"的命名可能意味着这是连续课程中的第四天内容,通常涵盖了一些基本概念的深入...
JavaSE_Android精华版-----中文文档API,JavaSE_Android精华版-----中文文档API
JavaSE__数组及常用算法.ppt
JavaSE,全称为Java Standard Edition,是Java平台的核心部分,主要面向桌面应用和服务器端开发。这个编程资料包涵盖了JavaSE的学习资源,旨在帮助开发者掌握Java的基础知识、集合框架、IO流等关键概念。 首先,...
尚硅谷_JavaSE_第12章_集合与泛型_扩展练习_附带参考答案.md
JavaSE_柴林燕_阶段11主要涵盖了Java语言的基础知识和历史发展,以及Java语言在业界的地位。Java作为一种广泛使用的编程语言,尤其在应用软件领域,与.NET平台相抗衡。TIOBE指数反映了Java的流行程度,是衡量开发者...
JavaSE(Java Standard Edition)是Java编程语言的核心部分,用于开发和部署桌面应用程序。JDK(Java Development Kit)是Java编程的工具集,包含了编译器、运行环境、调试工具和API文档等必要组件。本资源"JavaSE_...
尚硅谷_陈鑫_JavaSE_【Java概述、环境搭建、标识符、变量、基本数据类型】.md
【MLDN_JAVASE_文档】是一份针对Java SE(标准版)的全面学习资源,由MLDN(可能是指微软学习网络或类似的教育平台)提供。这个文档集合旨在帮助初学者和进阶者掌握Java编程语言的基础知识。Java SE是Java平台的核心...
JavaSE_复习笔记(用笔记软件eDiary打开).edf
【ATM_javase_】项目是一个以Java SE(标准版)为开发平台,用于学习基础编程和理解面向对象设计的实例。这个简单的ATM机模拟程序涵盖了Java语言的核心概念和面向对象编程的关键要素,是初学者提升技能的理想实践...
JavaSE(Java Standard Edition)是Java开发平台的一个版本,主要针对桌面应用和服务器端应用程序的开发。J2SE(Java 2 Platform, Standard Edition)是JavaSE早期的称呼,5.0是其一个重要的版本发布,它在Java发展...
JavaSE是Java标准版,它是Java开发的基础,涵盖了面向对象编程、集合框架、网络编程、I/O流等核心概念。在JavaSE中,线程是一个非常重要的知识点,它关乎程序的并发执行,使得多任务处理成为可能。在这个“JavaSE_...
在"VIP09_JavaSE_JavaIO_File_day0307-1.rar"这个压缩包中,我们可以预想它包含的是一个关于Java IO和File类的课程或教程的第三天第七节的内容。下面,我们将深入探讨Java IO和File类的相关知识点。 1. **Java IO...
JavaSE(Java Standard Edition)是Java平台的核心部分,主要用于桌面应用程序的开发。在这个"JavaSE_01 源代码"压缩包中,我们很显然会发现一系列与Java基础编程相关的源代码文件,这些文件通常位于`src`目录下。这...
Java是一种由SUN公司在1995年推出的高级编程语言,最初命名为Oak。它以其在Web应用程序中的广泛应用而著名,特别适合互联网编程,具备安全、可靠和面向对象的特性。Java的重要特点是其跨平台性,这得益于Java虚拟机...
JavaSE(Java Standard Edition)是Java编程语言的核心部分,它提供了编写桌面应用程序所需的基础类库。这份"JavaSE总结文档.rar"包含了一份个人在复习JavaSE时编写的笔记,覆盖了多个主题,旨在巩固和深化对Java...