Java课程总结

自我总结

经过一学期的java学习,我在老师的上课讲解以及自己的课下学习中对java编程有了一定的了解,我深深喜欢上了这种语言,培养了我应用面向对象的思维分析和解决问题的能力,但感觉还是不太精通,相对于c语言来说,我感觉java有趣很多,而且更贴近于实际生活,但是相对于数据结构来说稍微简单一些,我感觉数据结构更加难理解,因为数据结构相当于是c语言的进阶版,在学习Java的语法时,Java的语法是类似c语言的,所以学习的比较轻松。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,和同学一起讨论了好久才得以解决。在学习Java的面向对象的编程语言的特性。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C语言的经验,花了很长时间,才把这些概念大致都搞清楚,感觉在学习的过程中一定要动手做、试着写代码,而不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己。觉得自己仅仅经过一学期的学习,还远远不够,希望在寒假能更加的努力,能够真真正正掌握一门编程语言,对自己今后的发展起到作用。

一.java的一些基础知识

java的三大特性:封装,继承,多态性
java是分两部分的:一个是编译,一个是运行。
javac:负责的是编译的部分,当执行javac时,会启动java的编译器程序。对指定扩展名的.java文件进行编译。生成了jvm可以识别的字节码文件。也就是class文件,也就是java的运行程序。
java:负责运行的部分.会启动jvm.加载运行时所需的类库,并对class文件进行执行.
一个文件要被执行,必须要有一个执行的起始点,这个起始点就是main函数.

1.数据类型:

1):基本数据类型:byte、short、int、long、float、double、char、boolean
2):引用数据类型: 数组、类、接口
级别从低到高为:byte,char,short(这三个平级)–>int–>float–>long–>double
自动类型转换:从低级别到高级别,系统自动转的;
强制类型转换:什么情况下使用?把一个高级别的数赋给一个别该数的级别低的变量;

2.逻辑运算符:

  & | ^ ! && ||

  逻辑运算符除了 ! 外都是用于连接两个boolean类型表达式。

  &: 只有两边都为true结果是true。否则就是false。

  |:只要两边都为false结果是false,否则就是true

   ^:异或:和或有点不一样。
    两边结果一样,就为false。
    两边结果不一样,就为true.
  & 和 &&区别: & :无论左边结果是什么,右边都参与运算。
       &&:短路与,如果左边为false,那么右边不参数与运算。
  | 和|| 区别:|:两边都运算。
       ||:短路或,如果左边为true,那么右边不参与运算。

3.break与contimue的区别:

break:作用于switch ,和循环语句,用于跳出,或者称为结束。

break语句单独存在时,下面不要定义其他语句,因为执行不到,编译会失败。当循环嵌套时,break只跳出当前所在循环。要跳出嵌套中的外部循环,只要给循环起名字即可,这个名字称之为标号。

continue:只作用于循环结构,继续循环用的。

作用:结束本次循环,继续下次循环。该语句单独存在时,下面不可以定义语句,执行不到。

4.函数的作用:

  1)、用于定义功能。

  2)、用于封装代码提高代码的复用性。

  注意:函数中只能调用函数,不能定义函数。
主函数:
   1)、保证该类的独立运行。

  2)、因为它是程序的入口。

  3)、因为它在被jvm调用。
函数定义名称是为了对该功能进行标示,方便于调用;为了通过名称就可以明确函数的功能;为了增加代码的阅读性。

二.java面向对象
1.在类中定义其实都称之为成员。成员有两种:

1:成员变量:其实对应的就是事物的属性。
2:成员函数:其实对应的就是事物的行为。
所以,其实定义类,就是在定义成员变量和成员函数。但是在定义前,必须先要对事物进行属性和行为的分析,才可以用代码来体现。
private int age;//私有的访问权限最低,只有在本类中的访问有效

2.成员变量和局部变量的区别:

1:成员变量直接定义在类中。
  局部变量定义在方法中,参数上,语句中。
2:成员变量在这个类中有效。
 局部变量只在自己所属的大括号内有效,大括号结束,局部变量失去作用域。
3:成员变量存在于堆内存中,随着对象的产生而存在,消失而消失。
 局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。
方法的覆写是指子类定义了与父类中同名的方法,但是在方法覆写时必须考虑到权限,即被子类覆写的方法不能拥有父类方法更加严格的访问权限。

3.使用super能调用父类的构造方法,普通方法和非私有属性。

4.super和this都必须放在首行,故不能同时使用。

5.使用final声明的类不能有子类2.使用final声明的方法不能被子类所覆写3.使用final声明的变量即为常量,不可修改4.使用final声明变量时,要求全部的字母大写

6.向上转型:子类对象 →父类对象(自动转换)

7.向下转型:父类对象 →子类对象(强制转换)注:首先要进行向上转型,然后在进行强制类型转换。

8.封 装(面向对象特征之一):是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离;便于使用;提高重用性;安全性
封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

9.继 承 (面向对象特征之一)

好处:
1:提高了代码的复用性。
2:让类与类之间产生了关系,提供了另一个特征多态的前提。
父类的由来:其实是由多个类不断向上抽取共性内容而来的。
java中对于继承,java只支持单继承。java虽然不直接支持多继承,但是保留了这种多继承机制,进行改良。
单继承:一个类只能有一个父类。
多继承:一个类可以有多个父类。

10.this和super差异:

1.super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
2.super()和this()均需放在构造方法内第一行。
3.this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
4.this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

11.方法的重载与覆写:
重载的定义:方法名称相同,参数的类型或者个数不同。覆写的定义:方法的名称、参数的类型、返回值类型全部相同
对权限没有要求 被覆写的方法不能拥有更严格的权限。
范围: 发生在一个类中 发生在继承类中。

12.final特点:

1:这个关键字是一个修饰符,可以修饰类,方法,变量。
2:被final修饰的类是一个最终类,不可以被继承。
3:被final修饰的方法是一个最终方法,不可以被覆盖。
4:被final修饰的变量是一个常量,只能赋值一次。

13..throw和throws关键字

在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,抛给方法的调用处处理。
throw可以直接使用从而抛出一个异常。抛出时直接抛出异常类的实例化对象。

14.抽象类: abstract

抽象:不具体,看不明白。抽象类表象体现。
在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。
抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。
抽象类的特点:
1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2:抽象方法只定义方法声明,并不定义方法实现。
3:抽象类不可以被创建对象(实例化)。
4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。
抽象关键字abstract与final , private , static关键字不能共存

三.java应用程序设计
1,继承Thread类创建线程:

Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。

2,实现Runnable接口创建线程:
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口

3,Thread类和Runnable接口的区别
实际上Thread类和Runnable接口之间在使用上也是有所区别的,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了Runnable接口,则可以方便的实现资源的共享。

4,通过synchronized实现资源同步

synchronized 关键字可以在整个class下进行锁定,避免static数据的同时访问。
当编写synchronized块时,有几个简单的准则可以遵循,这些准则在避免死锁和性能危险的风险大有帮助:
(1) 使代码块保持简短,把不随线程变化的预处理和后处理移出synchronized块 
(2) 不要阻塞。如 InputStream.read() 
(3) 在持有锁的时候,不要对其他对象调用方法

5.Java IO

使用File类进行文件的操作
以下是针对文件本身操作的
createNewFile(); 创建新文件
delete(); 删除一个指定文件
mkdir(); 创建一个文件夹
public String[]list(); 列出全部名称,返回一个字符串数组
public File[]listFiles(); 列完整的路径,返回一个File对象数组
isDirectory(); 判断一个给定的路径是否是目录
RandomAccessFile类可以对文件内容进行操作
不同操作系统的路径分隔符也是不同的,windows的是“”,Linux的是“/”。
所有的操作是由JAVA虚拟机进行的,所以会出现一定的延迟,所以在进行文件操作时要考虑延迟的影响

Java IO的操作流程:

(1)使用Flle类打开一个文件。
(2)通过字节流和字符流的子类指定输出的位置。
(3)进行读和写的操作。
(4)关闭输入和输出。

6.字节输入流:

常用的字节输入流主要有:
InputStream  
FileInputStream
BufferedInputStream 【BufferedInputStream不是InputStream的直接实现子类,是FilterInputStream的子类】
他们的区别与用途:
InputStream是字节输入流的抽象基类 ,InputStream作为基类,给它的基类定义了几个通用的函数:
read(byte[] b):从流中读取b的长度个字节的数据存储到b中,返回结果是读取的字节个数(当再次读时,如果返回-1说明到了结尾,没有了数据)
read(byte[] b, int off, int len):从流中从off的位置开始读取len个字节的数据存储到b中,返回结果是实际读取到的字节个数(当再次读时,如果返回-1说明到了结尾,没有了数据)
close():关闭流,释放资源。
FileInputStream主要用来操作文件输入流,它除了可以使用基类定义的函数外,它还实现了基类的read()函数(无参的):
read():从流中读取1个字节的数据,返回结果是一个int,(如果编码是以一个字节一个字符的,可以尝试转成char,用来查看数据)。
BufferedInputStream带有缓冲的意思,普通的读是从硬盘里面读,而带有缓冲区之后,BufferedInputStream已经提前将数据封装到内存中,内存中操作数据要快,所以它的效率要要非缓冲的要高。它除了可以使用基类定义的函数外,它还实现了基类的read()函数(无参的):
read():从流中读取1个字节的数据,返回结果是一个int,(如果编码是以一个字节一个字符的,可以尝试转成char,用来查看数据)。

7.字节输出流:

常用的字节输出流主要有:
OutputStream
FileOutputStream
BufferedOutputStream 【BufferedOutputStream不是OutputStream的直接实现子类,是FilterOutputStream的子类】
他们的区别与用途:
OutputStream是字节输出流的基类, OutputStream作为基类,给它的基类定义了几个通用的函数:
write(byte[] b):将b的长度个字节数据写到输出流中。
write(byte[] b,int off,int len):从b的off位置开始,获取len个字节数据,写到输出流中。
flush():刷新输出流,把数据马上写到输出流中。
close():关闭流,释放系统资源。
FileOutputStream是用于写文件的输出流,它除了可以使用基类定义的函数外,还实现了OutputStream的抽象函数write(int b):
write(int b):将b转成一个字节数据,写到输出流中。
BufferedOutputStream像上面那个BufferedInputStream一样,都可以提高效率。它除了可以使用基类定义的函数外,它还实现了OutputStream的抽象函数write(int b):
write(int b):将b转成一个字节数据,写到输出流中。

8.字符输入流:

常见的字符输入流有:
Reader
InputStreamReader
FileReader
BufferedReader
他们的区别与用途:
Reader是字符输入流的抽象基类 ,它定义了以下几个函数:
read() :读取单个字符,返回结果是一个int,需要转成char;到达流的末尾时,返回-1
read(char[] cbuf):读取cbuf的长度个字符到cbuf这种,返回结果是读取的字符数,到达流的末尾时,返回-1
close()  :关闭流,释放占用的系统资源。
InputStreamReader 可以把InputStream中的字节数据流根据字符编码方式转成字符数据流。它除了可以使用基类定义的函数,它自己还实现了以下函数:
read(char[] cbuf, int offset, int length) :从offset位置开始,读取length个字符到cbuf中,返回结果是实际读取的字符数,到达流的末尾时,返回-1
FileReader 可以把FileInputStream中的字节数据转成根据字符编码方式转成字符数据流。
BufferedReader可以把字符输入流进行封装,将数据进行缓冲,提高读取效率。它除了可以使用基类定义的函数,它自己还实现了以下函数:
read(char[] cbuf, int offset, int length) :从offset位置开始,读取length个字符到cbuf中,返回结果是实际读取的字符数,到达流的末尾时,返回-1
readLine() :读取一个文本行,以行结束符作为末尾,返回结果是读取的字符串。如果已到达流末尾,则返回 null

9.字符输出流:

常见的字符输出流有:
Writer
OutputStreamWriter
FileWriter
BufferedWriter
他们的区别与用途:
Writer是字符输出流的抽象基类, ,它定义了以下几个函数
write(char[] cbuf) :往输出流写入一个字符数组。
write(int c) :往输出流写入一个字符。
write(String str) :往输出流写入一串字符串。
write(String str, int off, int len) :往输出流写入字符串的一部分。
close() :关闭流,释放资源。 【这个还是抽象的,写出来是说明有这个关闭功能】
flush():刷新输出流,把数据马上写到输出流中。 【这个还是抽象的,写出来是说明有这个关闭功能】
OutputStreamWriter可以使我们直接往流中写字符串数据,它里面会帮我们根据字符编码方式来把字符数据转成字节数据再写给输出流,它相当于一个中介\桥梁。
FileWriter与OutputStreamWriter功能类似,我们可以直接往流中写字符串数据,FileWriter内部会根据字符编码方式来把字符数据转成字节数据再写给输出流。
BufferedWriter比FileWriter还高级一点,它利用了缓冲区来提高写的效率。它还多出了一个函数:
newLine() :写入一个换行符。

10.几种布局管理器,也在网上看了一下相关的一些知识

JAVA的界面布局原理:因为Java是跨平台语言,使用绝对坐标显然会导致问题,即在不同平台、不同分辨率下的显示效果不一样。Java 为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的所有组件安排给一个“布局管理器”负责管理,如:排列顺序,组件的大小,位置等,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。  Java中一共有6种布局管理器,通过使用6种布局管理器组合,能够设计出复杂的界面,而且在不同操作系统平台上都能够有一致的显示界面。6种布局管理器分别是BorderLayout、BoxLayout、FlowLayout、GirdBagLayout、GirdLayout和 CardLayout。其中CardLayout必须和其他5种配合使用,不是特别常用的。每种界面管理器各司其职,都有各自的作用。

11.其他容器
1、JPanel:使用JPanel完成各种复杂的界面显示,在其中可以加入任意的组件。
JPanel:(在JPanel中可以加入任意的组件,然后直接将JPanel容器加入到JFrame容器中)
JFrame frame = new JFrame("")
JPanel pan = new JPanel();
pan.add(new JLabel(" "));
frame.add(pan);

2、JSplitPane :主要功能是分割面板,可以将一个窗体分为两个子窗体,可以水平排列也可以是垂直排列。
JSplitPane(分割面板,将一个窗体分割为两个子窗体)
public static final int HORIZONTAL_SPLIT //水平分割
public static final int VERTICAL_SPLIT //垂直分割
public JSplitPane(int newOrientation) //创建对象,并指明分割方式
publci void setDividerSize(int newSize) //设置分割条大小

3、JTabbedPane:在一个面板上设置多个选项卡用户选择。
JTabbedPane(选项卡,一个面板设置多个选项卡)
public void addTab(String titel,Icon icon,Component component,String tip) //添加一个有标题,有图标,有提示信息的组件
static final int TOP/BOTTON/LEFT/RIGHT //表示指向框顶部/底部/左部/右部位置
public JTabbedPane(int tabPlacement) // 创建对象,并指定选项卡布局

4、JScrollPane:Swing中JScrollPane的主要功能就是为显示的内容加上水平滚动条。
JScrollPane(添加滚动条)
static final int HORIZONTAL/VERTICAL_SCROLLBAR_ALWAYS //始终显示水平/垂直滚动条
static final int HORIZONTAL/VERTICAL_SCROLLBAR_NEVER //任何情况下都不显示水平/垂直滚动条
static final int HORIZONTAL/VERTICAL_SCROLLBAR_AS_NEEDED //根据自身需要显示水平/垂直滚动条
5、JDesktopPane与JInternaIFrame:JDesktopPane规定了一个父窗体的基本形式,而JInternaIFrame规定了各个子窗体,JInternaIFrame需要加入到JDesktopPane中。

12、事件处理

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:
处理按钮的动作事件,让按钮变得更加有意义。
void actionPerFormed(ActionEvent e) //发生操作时调用

posted @ 2019-12-13 16:51  青衫拓落  阅读(718)  评论(0编辑  收藏  举报