课程总结
个人感悟:通过大二第一学期的学期,我也对Java有了很多的了解,逐渐掌握很多关于Java的知识,也做了很多相关的题目,码出了很多行代码,从起步到现在,开始的时候刚刚学,就认为Java很厉害,后来慢慢的学习了解,确实大一学习的c语言要精深了很多,我也坚持不懈的学习了解认识它,现在也能自主写下很多行Java代码,感谢老师一学期的悉心教导,也感谢班干部孜孜不倦的激励大家一起进步,好好学习。在今后的日子里,我会更加努力,充实自己。本学期面向对象与Java程序设计课程已经全部结束了,但对于Java的学习还远未到终点,现在就本学期的课程作一个全面的总结吧。
学习总结:
一、java语言的特点
1、面向对象
Java是一种面向对象的语言,它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支持。为了简单起见,Java只支持类之间的单继承,但是可以使用接口来实现多继承。使用Java语言开发程序,需要采用面向对象的思想设计程序和编写代码。
2、平台无关性
平台无关性的具体表现在于,Java是“一次编写,到处运行(WriteOnce,RunanyWhere)”的语言,因此采用Java语言编写的程序具有很好的可移植性,而保证这一点的正是Java的虚拟机机制。在引入虚拟机之后,Java语言在不同的平台上运行不需要重新编译。
Java语言使用Java虚拟机机制屏蔽了具体平台的相关信息,使得Java语言编译的程序只需生成虚拟机上的目标代码,就可以在多种平台上不加修改地运行。
3、简单性
Java语言的语法与C语言和C++语言很相近,使得很多程序员学起来很容易。对Java来说,它舍弃了很多C++中难以理解的特性,如操作符的重载和多继承等,而且Java语言不使用指针,加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。
4、解释执行
Java程序在Java平台运行时会被编译成字节码文件,然后可以在有Java环境的操作系统上运行。在运行文件时,Java的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。
5、多线程
Java语言是多线程的,这也是Java语言的一大特性,它必须由Thread类和它的子类来创建。Java支持多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的run()方法,要执行的方法就写在run()方法体内。
6、分布式
Java语言支持Internet应用的开发,在Java的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括URL、URLConnection、Socket等。Java的RIM机制也是开发分布式应用的重要手段。
7、健壮性
Java的强类型机制、异常处理、垃圾回收机制等都是Java健壮性的重要保证。对指针的丢弃是Java的一大进步。另外,Java的异常机制也是健壮性的一大体现。
8、高性能
Java的高性能主要是相对其他高级脚本语言来说的,随着JIT(JustinTime)的发展,Java的运行速度也越来越高。
9、安全性
Java通常被用在网络环境中,为此,Java提供了一个安全机制以防止恶意代码的攻击。除了Java语言具有许多的安全特性以外,Java还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制。
二、面向对象
面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。
成员变量限定词的含义:
- static: 静态变量(类变量)
- final: 常量;transient: 暂时性变量,用于对象存档,用于对象的串行化
- volatile: 贡献变量,用于并发线程的共享
方法声明
方法声明中的限定词的含义:
- static: 类方法,可通过类名直接调用
- abstract: 抽象方法,没有方法体
- final: 方法不能被重写
- native: 集成其它语言的代码
- synchronized: 控制多个并发线程的访问
方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,也可以是复合数据类型(又称引用数据类型)。
对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这些参数的值。如果要改变参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。
方法体
方法体是对方法的实现,它包括局部变量的声明以及所有合法的Java指令。方法体中声明的局部变量的作用域在该方法内部。若局部变量与类的成员变量同名,则类的成员变量被隐藏。
为了区别参数和类的成员变量,我们必须使用this。this用在一个方法中引用当前对象,它的值是调用该方法的对象。返回值须与返回类型一致,或者完全相同,或是其子类。当返回类型是接口时,返回值必须实现该接口。
构造方法
- 构造方法是一个特殊的方法。Java 中的每个类都有构造方法,用来初始化该类的一个对象。
- 构造方法具有和类名相同的名称,而且不返回任何数据类型。
- 重载经常用于构造方法。
- 构造方法只能由new运算符调用
封装
封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界进行交互。封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免了外界对对象内部属性的破坏。
可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。
- private:类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
- default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
- protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
- public:类中限定为public的成员,可以被所有的类访问。
继承
子类的对象拥有父类的全部属性与方法,称作子类对父类的继承。
- Java中父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承。
- 继承实现了代码的复用。
- Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。
- 子类不能继承父类中访问权限为private的成员变量和方法。
- 子类可以重写父类的方法,即命名与父类同名的成员变量。
Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。super 的使用有三种情况:
- 访问父类被隐藏的成员变量,如:super.variable;
- 调用父类中被重写的方法,如:super.Method([paramlist]),super()调用父类构造方法;
- 调用父类的构造函数,如:super([paramlist]);
多态
对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。
Java的多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。
- 编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
- 运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。
重载(Overloading)
- 方法重载是让类以统一的方式处理不同数据类型的手段。
- 一个类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
- 返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准。
重写(Overriding)
- 子类对父类的方法进行重新编写。如果在子类中的方法与其父类有相同的的方法名、返回类型和参数表,我们说该方法被重写 (Overriding)。
- 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
- 子类函数的访问修饰权限不能低于父类的。
抽象类和Interface的区别
在Java中,可以通过两种形式来体现面向对象的抽象:接口(interface)和抽象类(abstract)
接口是一种极度抽象的类型,它比抽象类更加“抽象”。一般情况下不在接口中定义变量。两者之前还是有一定区别
比较对象 | 修饰符 | 变量作用域 | 方法 | 继承 | 使用场景 |
abstract class | abstract | 无要求 | 可以存在abstract方法和非abstract 方法,public或者protected作用域 | extends只能继承一个abstract class | 适用于对一种事物的抽象,即对类抽象,包括类的属性、行为。如果是这类就继承它 |
interface | interface | 必须是 public static final变量 | 必须是public abstract方法 | implements可以同时实现很多接口 | 适用于对类局部行为的抽象,如果有这个行为就实现它。 |
三、多线程
1,继承Thread类创建线程:
Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。
2,实现Runnable接口创建线程:
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口
3,Thread类和Runnable接口的区别
实际上Thread类和Runnable接口之间在使用上也是有所区别的,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了Runnable接口,则可以方便的实现资源的共享。
4,通过synchronized实现资源同步
synchronized关键字的使用方式主要有以下三种:
修饰非静态方法
修饰静态方法
修饰语句块
修饰非静态方法的方式保证同一个对象(注意与静态方法进行区分)的这个方法内部同一时刻仅有一个线程可以进入;相对应的,修饰静态方法的方式保证的是同一个类(注意不再是类的对象了,因为是静态方法)的这个方法内部同一时刻仅有一个线程可以进入。修饰语句块的方式与修饰非静态方法的方式类似。
synchronized关键字的局限性
从上述的原理描述中,我们不难看出,由于synchronized是通过monitorenter和monitorexit来对语句块进行加锁,保证单一线程进入的,因此具备以下问题:
易死锁;
无法设置尝试获取锁的超时时间,一旦synchronized语句块中需要进行耗时的操作时,同时等待的线程的任务完成时间不可控且不可预期。
四、输入流与输出流
1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中,
所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类;
而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类。
2:InputStream类是字节输入流的抽象类,是所有字节输入流的父类,InputStream类具有层次结构如下图所示;
3:java中的字符是Unicode编码的,是双字节的。InputStream是用来处理字节的,在处理字符文本时很不方便。Java为字符文本的输入提供了专门的一套类Reader。Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。
4:输出流OutputStream类是字节输入流的抽象类,此抽象类表示输出字节流的所有类的超类。
5:Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。
6:File类是IO包中唯一代表磁盘文件本身的对象。通过File来创建,删除,重命名文件。File类对象的主要作用就是用来获取文本本身的一些信息。如文本的所在的目录,文件的长度,读写权限等等。(有的需要记忆,比如isFile(),isDirectory(),exits();有的了解即可。使用的时候查看API)
五、图形界面
.AWT(Abstract Window Toolkit):
抽象窗口工具包,SUN 公司提供的用于图形界面编程(GUI)的类库。AWT框架不使用原生窗口部件(native widgets),一直未能突破LCD问题。LCD问题导致了一些主要平台特征的遗失.AWT 组件具有平台相关性..Swing:
Swing
是纯Java 实现的轻量级(light-weight)组件,它不依赖系统的支持,Swing 组件在不同平台具有一致性的表现,可以解决AWT框架的LCD问题,是Sun创建的新框架,但是Swing应用程序的界面外观不再和原生应用程序的外观相似。而且消耗太多的内存,这样Swing不适于一些小设备.
Swing 采用了MVC(模型-视图-控制,Model-View-Controller)设计模式。
主要包括下述三个概念:
1).组件(Component)---按钮、标签、菜单等组件的抽象基本类.
2).容器(Container)---有两类:窗口Window(可以独立存在)和面板Panel(必须放在其他容器内). 而窗口类又分为框架Frame和对话框Dialog.
3).布局管理器(LayoutManager)---定义容器中组件摆放位置和大小接口.AWT 中的五种布局管理器:
边界布局管理器(BorderLayout),流式布局管理器(FlowLayout), 网格布局管理器(GridLayout), 卡片布局管理器(CardLayout), 网格包布局管理器(GridBagLayout).
窗体(Frame,Dialog)的默认布局为 BorderLayout(边界布局管理器)。
面板()的默认布局管理器是 FlowLayout 布局管理器。
4).Graphics(图形类)——组件内与图形处理相关的类.
1. JavaSwing 布局管理器
FlowLayout(流式布局)
GridLayout(网格布局)
GridBagLayout(网格袋布局)
BoxLayout(箱式布局)
GroupLayout(分组布局)
CardLayout(卡片布局)
BorderLayout(边界布局)
SpringLayout(弹性布局)
null(绝对布局)
2. JavaSwing 基本组件
JLabel(标签)
JButton(按钮)
JRadioButton(单选按钮)
JCheckBox(复选框)
JToggleButton(开关按钮)
JTextField(文本框)
JPasswordField(密码框)
JTextArea(文本区域)
JComboBox(下拉列表框)
JList(列表框)
JProgressBar(进度条)
JSlider(滑块)
3. JavaSwing 面板组件
JPanel(面板)
JScrollPane(滚动面板)
JSplitPane(分隔面板)
JTabbedPane(选项卡面板)
JLayeredPane(层级面板)
4、JavaSwing 其他组件
JFrame(窗口)
JDialog、JOptionPane(对话框)
JFileChooser(文件选择器)
JColorChooser(颜色选择器)
JMenuBar(菜单栏)
JToolBar(工具栏)
JPopupMenu(弹出菜单)
Table(表格)
JTree(树)
JInternalFrame(内部窗口)
5、JavaSwing 相关特性组件的位置和尺寸组件边框(Border)事件处理、多线程并发与线程安全、拖拽功能、系统托盘(System Tray)、闪屏(Splash Screen);
5、事件处理
1.事件和监听器
事件监听器机制是观察者模式的一种,通过把事件源和事件处理流程以监听器的方法隔离开来,减小了主流程与被触发事件的执行流程间的耦合,便于代码的维护和对事件处理流程的扩展。
在事件监听机制中,涉及到三个角色:事件、发布者和监听器
事件:在事件源和事件监听器之间传递信息的对象实体。
发布者:在事件发生后,负责把事件发布到监听者的对象。
监听者:监听事件,并进行事件处理或转发的对象。
Java中提供了事件监听器实现的框架,使用Java中的事件监听器,需要熟悉以下几个类或接口:
1. EventObject:事件的基类,在Java中自定义事件时需要继承的基类,其定义了事件源——Object类型的属性,可以把发生事件所在的类实例的引用传递过来,以便于在事件处理流程中使用(如果有使用要求的话)。在自定义的事件中,还可以定义自己应用所需的其他属性。
2. EventListener:自定义事件监听器必须实现的接口,没有具体方法,只起到标识作用
2.窗体事件(WindowListener)
常用接口方法
void windowActivated/windowDeactivated(WindowEvent e) //将窗口变为活动/不活动窗口时触发
void windowClosed/Closing/Iconified(WindoowEvent e) //当窗口被关闭时/正在关闭/最小化时触发
3.监听适配器Adapter:
用户继承该类后就可以根据自己的需要来覆写方法,就不需要覆写接口里的所有抽象方法了。
4.动作事件及监听处理ActionListener:
处理按钮的动作事件,让按钮变得更加有意义。
按监听的对象划分,可以分为
ServletContext对象监听器
HttpSession对象监听器
ServletRequest对象监听器
按监听的事件划分
对象自身的创建和销毁的监听器
对象中属性的创建和消除的监听器
session中的某个对象的状态变化的监听器