课程总结
大二的第一学期已经过去了,时间过得很快,匆匆间16周快要结束,在这一学期里从开始接触Java到后来写出很多的代码,程序,一步步了解学习,一点点得当运用,我已经对Java有了一些基本的认识。最初接触的Java的时候很疑惑,为什么需要输入前面那些繁琐的代码,后面一点点发现Java的一个个代码在很多细节地方有着很大的用处,比起C语言来说更加精炼。这使我对Java的兴趣更加浓烈,我会更加努力的学习,争取早日学会并做出属于自己的软件程序。下面是我对自己学到的Java知识的了解:
一、Java语言的特点
1、简洁有效
2、可移植性
3、面向对象
4、解释性
5、适合分布式计算
6、拥有较好的性能
7、健壮、防患于未然
8、具有多线程处理能力
9、具有较高的安全性
10、是一种动态语言
11、是一种中性结构
二、Java基础程序设计
1、Java的数据类型可分为基本数据类型和引用数据类型两种。
2、布尔类型的变量,只有ture和false两个值。
3、数据类型的转换可分为“自动类型转换”与“强制类型转换”两种。
4、算术运算符的成员有加法运算符、减法运算符、乘法运算符、除法运算符、余数运算符。
5、if语句可依据判断的结果来决定程序的流程。
6、自增与自减运算符有着相当大的便利性,善用他们可提高程序的简洁程度。
8、括号是用来处理表达式的优先级的,也是Java的运算符。
9、占用较少字节的数据类型会转换成占用较多字节的数据类型;有short和int类型,则用int类型;字符类型会转换成short类型;int类型转换成float类型;布尔类型不能转换成其他的类型。
三、Java面向对象程序:
面向对象编程(基础篇):
1.类与对象。关于类的定义、状态与行为,类与对象的关系,对象的创建与使用。
2.封装性(setter与getter)。
3.构造方法(类名 对象名称 = new 类名称)。
4.匿名对象。
5.this关键字(强调本类中方法,表类属性,使用this调用本类构造方法,this表示当前对象)。
6.static关键字(所有对象共享,类名称直接调用)。
7.String类
①两种实例化方法(例给name赋值zy):直接赋值(String name= "zy");直接调用String类的构造方法(String name=new String("zy"))。
②两种比较内容方法:“==”,“equals()”(将内容进行比较)。
③String类中常用方法(jdk中可查看)。
④注意:字符串就是一个String类的匿名对象;使用String类声明后的字符串内容不可改变。
面向对象(高级篇):
继承:
通过子类扩展父类功能(class 父类{} class 子类 extends 父类{})。
子类不可直接访问父类的私有操作(要通过setter或getter),但可调用父类私有方法。
③子类对象实例化之前先调用父类的构造方法。值得注意的是,父类的构造方法中既有无参构造方法(可系统给,可自己写)又有有参构造方法,我们需要在父类中自己写上一个无参构造,防止调用时this与super并用时报错(super调用无参构造)。
④覆写时,子类只可扩大权限,不可缩小(例父:private,子:public)。
⑤因this与super都需要放在构造方法的首行,故不可同时出现。且均不可用于main方法中。
final关键字:
①使用final声明的类不能有子类。
②final声明的方法不能被子类覆写(即不能被继承)。
③final声明的变量即成为常量,常量不可被修改。
抽象类:
普通类不可有抽象方法,抽象类可以有普通方法及构造方法。抽象类的方法和抽象类都要使用abstract关键字声明。抽象类必须被子类继承,故抽象方法不能用private封装。抽象类必须被子类继承,子类(如果不是抽象类)必须覆写抽象类中全部的抽象方法
多态性;
对象多态性:
抽象类(模板):
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
接口(标准):
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
接口特性
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
异常的捕获及处理
1、异常:
a、异常处理:try{...}catch{...}finally{...}
b、throw关键字:用户手工抛出异常类的实例化对象。throws:用于方法声明,表示此方法不处理异常,将异常交给程序被调用处进行处理。
c、RuntimeException是Exception的子类,其定义的异常可以选择性进行处理。
d、自定义异常只需要继承Exception类进行强制性处理。
e、Exception类与RuntimeException类
1、Exception在程序中是必须使用try…catch进行处理。
2、RuntimeException可以不使用try…catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。
多线程
线程对象是可以产生线程的对象。比如在Java平台中Thread对象,Runnable对象。线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。相比于多进程,多线程的优势有:
(1)进程之间不能共享数据,线程可以;
(2)系统创建进程需要为该进程重新分配系统资源,故创建线程代价比较小;
(3)Java语言内置了多线程功能支持,简化了java多线程编程。
一、创建线程和启动
(1)继承Thread类创建线程类
通过继承Thread类创建线程类的具体步骤和具体代码如下:
• 定义一个继承Thread类的子类,并重写该类的run()方法;
• 创建Thread子类的实例,即创建了线程对象;
• 调用该线程对象的start()方法启动线程。
class SomeThead extends Thraad { public void run() { //do something here } } public static void main(String[] args){ SomeThread a = new SomeThread(); a.start(); }
(2)实现Runnable接口创建线程类
通过实现Runnable接口创建线程类的具体步骤和具体代码如下:
• 定义Runnable接口的实现类,并重写该接口的run()方法;
• 创建Runnable实现类的实例,并以此实例作为Thread的target对象,即该Thread对象才是真正的线程对象。
class SomeRunnable implements Runnable { public void run() { } } Runnable b = new SomeRunnable(); Thread b = new Thread(b); b.start();
二、线程的生命周期
1、新建状态
用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。
注意:不能对已经启动的线程再次调用start()方法,否则会出现Java.lang.IllegalThreadStateException异常。
2、就绪状态
处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。因为cpu的调度不一定是按照先进先出的顺序来调度的),等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。
提示:如果希望子线程调用start()方法后立即执行,可以使用Thread.sleep()方式使主线程睡眠一伙儿,转去执行子线程。
3、运行状态
处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
处于就绪状态的线程,如果获得了cpu的调度,就会从就绪状态变为运行状态,执行run()方法中的任务。如果该线程失去了cpu资源,就会又从运行状态变为就绪状态。重新等待系统分配资源。也可以对在运行状态的线程调用yield()方法,它就会让出cpu资源,再次变为就绪状态。
注: 当发生如下情况是,线程会从运行状态变为阻塞状态:
①、线程调用sleep方法主动放弃所占用的系统资源
②、线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞
③、线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有
④、线程在等待某个通知(notify)
⑤、程序调用了线程的suspend方法将线程挂起。不过该方法容易导致死锁,所以程序应该尽量避免使用该方法。
当线程的run()方法执行完,或者被强制性地终止,例如出现异常,或者调用了stop()、desyory()方法等等,就会从运行状态转变为死亡状态。
4、阻塞状态
处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。
在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。有三种方法可以暂停Threads执行:
5、死亡状态
当线程的run()方法执行完,或者被强制性地终止,就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
三、线程管理
Java提供了一些便捷的方法用于会线程状态的控制。具体如下:
1、线程睡眠——sleep
如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread的sleep方法。
IO:
字节流与字符流相关的基本操作
1.字节流(操作byte数据)
①输出数据:OutputStream类
②输入数据:InputStream类
2.字符流
①输出数据:Writer类
②输入数据:Reader类
3.两者区别:字节流在操作时本身不会用到缓冲区,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件
4.操作流程:
①使用File类打开一个文件
②通过字节流或字符流的子类,指定输出的位置
③进行读/写操作
④关闭输入/输出
转换流等以及System类对IO的支持相关内容
1.转换流
①OutputStreamWriter类:Writer的子类,将输出字符流变字节流
②InputStreamReader类:Reader的子类,将输入字节流变字符流
2.内存操作流
①字节内存操作流:内存输入流(ByteArrayInputStream) 内存输出流(ByteArrayOutputStream)
②字符内存操作流:内存输入流(CharArrayReader) 内存输出流(CharArrayWriter)
③ByteArrayInputStream: 程序->InputStream->输出到内存
④ByteArrayOutputStream:程序<-OutputStream<-内存
3.管道流
4.System类
①System.out 即向显示器上输出(希望用户可以看见的信息
②System.err 表示的是错误的标准输出(不希望用户可以看见的信息
③System.in 从键盘中读取数据
图形界面
组件和容器
顶层容器有小应用程序(Applet和JApplet)、对话框(Dialog和JDialog)、框架(Frame和JFrame)。这些容器都存在于java.swing*;中.
一般容器有面板(JPanel)、滚动窗格(JScrollPane)、分裂窗格(JSplitPane)、选项卡窗格(JTabbedPane)和工具条(JToolBar).
专用容器有什么作用。。这个我也不知。
基本控件有命令式按钮(JButton)、单选按钮(JRadioButton)、复选框(JCheckBox)、组合框(JComboBox)和列表框(JList)等
组件1.不可编辑的
有标签(JLabel)、进度条等。
2.可编辑的
有文本编辑框(JTextField)、文本区域(JTextArea)等
8.2布局管理器
每个容器都有其默认的布局管理器
常用的布局方式有6种
1.FLowLayout
2.GridLayout
3.BorderLayout
4.BoxLayout
5.GridBagLayout
6.CardLayout
组合布局方式我的理解是框架中不能同时有两个容器两个布局存在,只可以容器嵌套。如果有不对之处,请大家指正!
还有自定义布局管理器还没弄,明天补上!我估计是根据坐标具体位置来定义的了
8.3事件处理模型
分为鼠标事件和键盘事件模型
java一般通过事件对象来封装事件,其中常用的事件有:java.awt.event.*;中的1.ActionEvent; 2.AdjustmentEvent 3.ComponentEvent 4.FocusEvent 5.ItemEvent 6.KeyEvent
7.MouseEvent 8.MouseWheelEvent 9.WindowEvent这些都是类中的事件。