2019年秋总结

本学期主要讲了面向对象的编程方法,Java的一些语法基础和C语言大致一样所以就不总结了,直接从面向对象开始、

面向对象基础

java面向对象的一些基本概念,介绍了它三个主要特性,封装性、继承性、多态性,类与对象的关系,栈堆的关系,三个特性中主要讲了封装性,其他两个后面再讲。
类实际上是表示一个客观世界某类群体的一些基本特征抽象、
类由属性和方法构成
对象则是表示一个具体的东西
类与对象的另一种解释:

创建类:

class 类名称{
       数据类型    属性;
       ..............
       public   返回值的数据类型   方法名称 (参数1,参数2....){
                程序语句:
                【return 表达式】
}
}

创建完类之后,要使用这个类则需要通过对象,下面创建对象:

类名   对象名 = null;                            \\声明对象
对象名  =   new  类名();                 \\实例化对象,只要有关键字new就表示开辟新的堆内存空间 

所有的对象名称都保存在栈内存中,而对象的具体内容则保存在对应的堆内存中。
在栈内存中实际上保存的是堆内存空间的访问地址。

访问对象中的属性或方法:

访问属性:对象名称.属性名
访问方法:对象名称.方法名()

主意!!!如果一个对象要被使用,则对象必须被实例化。如果没有被实例化而直接调用了对象里的属性或方法,则程序会报异常。

垃圾空间的产生:

对于垃圾空间java本身提供了一个垃圾收集机制(简称GC,Garbage Collection),会不定期的释放不用的内存空间,只要对象不使用了,就会等待GC释放空间。

下面讲三个主要特点之一的封装性:

所谓封装就是指对外部不可见。
封装格式:

为属性封装:private 属性类型  类型名称;
为方法封装:private 方法返回值  方法名称(参数列表){ }

对于封装后的属性无法直接访问

访问封装属性要使用setter和getter方法,在各个程序中,反射机制都会利用这两个设置和取得属性内容。


封装是面向对象的方法所遵循的一个重要原则。它有两个含义:一是指把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单位即“对象”中。另一层含义指“信息隐蔽”,把不需要让外界知道的信息隐蔽起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓;或只允许使用对象的功能,而尽可能隐蔽对象实现功能的细节。
封装机制在程序设计中表现为,把描述对象属性的变量及实现对象功能的方法结合在一起,定义为一个程序单位,并保证外界不能任意更改其内部的属性值,也不能任意调动其内部的功能方法。
封装机制的另一个特点是,为封装在一个整体内的变量及方法规定了不同级别的“可见性”或访问权限。
“-”这个表示封装属性

还有第二个属性继承性:

在java程序设计中,已有的类可以是java开发环境所提供的一批基本的程序---类库。
用户开发的程序类是继承这些已有的类。这样,现在类所描述的属性及行为,即已定义的变量和方法,在继承产生的类中完全可以使用。被继承的类称为父类或超类,而经继承产生的类称为子类或派生类。根据继承机制,派生类继承了超类的所有成员,并相应地增加了自己的一些新的成员。
若一个子类只允许继承一个父亲,称为单继承;若允许继承多个父亲,称为多继承。目前许多面向对象语言不支持多继承,而java通过接口(interface)的方式来弥补。

第三个属性多态性:

多态是允许程序中出现重名现象。
一个是方法多态:在一个类中,允许多个方法使用一个名字,但方法的参数不同,完成的功能也不同。
另一个是对象多态:子类对象可以与父类对象进行互相的转换,而根据其使用的子类的不同完成的功能也不同。

构造方法,匿名对象,this关键字,static关键字。

构造方法:

构造方法在实例化对象时使用

per = new Person();

这里使用构造方法
它的定义方式与普通方法类似但要主意几点:

  • 1.构造方法的名称必须类名称一致;
  • 2.构造方法的声明处不能有任何返回值类型的声明;
  • 3.不能在构造方法中使用return返回一个值;
    只要是类就比须存在构造方法,以前的程序没有构造方法,那是如果明确声明一个构造方法,那么在编译时会自动生成一个什么都不做的的构造方法;正是如此所以前面的程序没有声明构造方法,对象也是可以进行对象的实例化操作;

如果一个类中已经明确声明了一个构造方法,那么程序在编译时将不会生成默认的构造方法;一个类中至少存在一个构造方法,也就是说可以进行构造方法的重载;进行重载时,所有重载的方法按照参数的个数由多到少,或由少到多。

匿名对象:

匿名对象,就是没有给出明确名字的对象,一般匿名对象只使用一次,并且匿名对象只在堆内存开辟空间,不存在栈内存的引用。匿名对象在实际开发中基本上都是作为其他类的实例化对象的参数传递的。

this关键字:

1.使用this调用本类中的属性


当需要这样赋值的时候就需要this关键字了

2.使用this调用构造方法
如果一个类中有多个构造方法,可以使用this关键字进行互相调用

  • 主意用this调用构造方法需要放在构造方法首行
  • 不能循环调用
  • 只能在构造方法中调用构造方法
    3.this表示当前对象

主要功能就是进行对象的比较


4.强调调用本类方法
就是起到一个强调的作用。

static关键字

1.使用static声明属性
如果在程序中使用static声明属性的话,则此属性称为全局属性,或静态属性
前面讲了栈内存,堆内存,除此以外还有一个全局数据区,static声明的属性就放在这里面

2.使用static声明方法:
static既可以声明属性,也可以声明方法,用它声明的方法有时也被称为“类方法”,可以由类名直接调用

必须要注意的时是,非static声明的方法可以去调用static声明的属性或方法的,但是static声明的方法是不能调用非static类型声明的属性或方法的。
3.理解main()方法:

String类,还讲了对象数组,以及Java数组的定义。

String类

我们一直使用String定义字符串,一种是直接赋值,还有一种是调用String的构造方法,两种赋值方法效果类似。但有一些区别,直接赋值是如果开辟了一个堆空间来保存这个字符串,那么后面又出现这个字符串的赋值,就不会再开辟空间,而构造方法则是开辟了两个空间,甚至更多
String对象内容的比较,如果一个直接赋值,和一个用构造方法赋值的一样的字符串,进行直接比较,会出现false

所以要用eauals()方法比较这个方法只比较内容,但是会区分大小写。
字符串一旦声明就不可改变

还有一些String类的一些常用操作方法

对象数组

所谓对象数组,就是包含了一组相关的对象数组,数组一定要先开辟空间,因为其是引用数据类型,所以数组每一个对象都是null值,则再引用对象数组时都要对其进行实例化操作


Java的第二个特性,继承性,final关键字进一步讲解了多态性,对象的多态,


注意:Java中只允许单继承,不允许多继承,即一个子类只能继承一个父类,可以多层继承,即一个子类可以有一个父类,一个父类还可以有一个父类。
继承的子类有时也被叫做派生类,extends本身含义为扩展,就是扩展父类的内容
注意:子类不能直接访问父类私有成员,可以调用非私有方法,可以间接调用私有成员,例如setter,getter。
子类对象在实例化之前会先默认调用父类中的构造方法,所以实例化子类对象之前,需要先将父类中的属性进行初始化,在子类中隐含了一个super()方法。
super()表示子类可以直接调用父类中的无参构造。
覆写:
存在子类继承父类中。
主意:子类中覆写的方法不能有比父类更严格的权限。

super关键字:
前面已经提到super可以直接调用父类中的方法。
super调用构造方法与this一样,super要方法子类构造方法的首行
super与this很相似,都是可以调用构造,普通方法,属性,但是两者还是有一点区别。

final关键字:
final在Java中表示最终的意思,可以使用final声明类,属性,方法
注意:

  • 使用final声明的类不能有子类。
  • 使用final声明的方法不能被子类覆写。
  • 使用final声明的变量即成为常量,常量不可以修改。
    final变量命名时要求全部大写。
    抽象类:
    抽象类是Java专门提供一种当父类的类
    抽象类的定义和命名规则:
  • 包含一个抽象方法的类必须是抽象类。
  • 抽象类和抽象方法都要使用abstract关键字声明;
  • 抽象方法只须声明不需要实现。
  • 抽象类必须被子类继承,子类如果不是抽象类那么必须要覆写抽象类的全部抽象方法。

    抽象类不能使用final关键字声明,因为抽象类必须被继承,必须被覆写。
    抽象类可以定义构造方法
    抽象类实际上就是比普通类多了一个抽象方法,除此之外没有很大的区别。

多态:
一种是的方法的重载与覆写
另一种是对象的多态
对象的多态主要是两种类型

向上转型,程序会自动完成,向下转型,必须要明确转型的子类类型
向下转型前必须先发生向上转型。
主要作用

Java中的接口,instanceof关键字

接口

接口可以理解为一种特殊的类,里面全部都是由全局常量和公用的抽象方法所组成。

接口中抽象方法必须定义为public访问权限,这是不可改变的
在接口中,不写public,也是public访问权限。
与抽象类一样,接口要使用必须通过子类,子类通过implements关键字实现接口。
一个子类可以实现多个接口,这摆脱了java中的单继承局限
如果一个子类实现了多个接口,则这个子类必须实现所有接口的全部抽象方法。

在java中一个接口是允许继承抽象类的,但是允许一个接口继承多个接口。

instanceof关键字

Java中可以使用instanceof关键字判断对象到底是哪个类的实例。
这对于对象的多态,判断是父类还是子类的实例非常有用。

抽象类与接口的应用,object类。讲了异常的处理,捕获异常,throws关键字,Exception和RuntimeException

抽象类与接口的应用

抽象类主要是提供模板作用,接口主要是制定标准。
抽象类中可以定义多个内部抽象类,接口中可以定义多个内部接口。

抽象类与接口之间的关系


一个类不要去继承一个已经实现的类,要么继承抽象类,要么实现接口,如果接口和抽象类都可以使用,那么优先使用接口,避免单继承局限。

Object类

object类是Java中最为常用的一个系统类,利用object类可以实现参数的统一。java中object是所有类的父类, 没有明显的继承,那就是object的子类。

tostring打印对象时使用,可以覆写tostring,这样调用tostring就是子类覆写过的。
object类中提供的equals方法默认比较的是地址

捕获异常

如果不处理异常,那么程序可能会中断执行,造成不必要的损失

finall块可以省略,那么程序会执行try-catch之后的语句

throws关键字

throws关键字主要就是抛出异常,把异常的处理抛给,函数调用出,进行异常的捕获和处理

Exception和RuntimeException

Exception在程序中必须要进行异常捕获,RuntimeException可以不进行异常捕获,那么异常直接给JVm进行处理。

throw关键字,自定义异常,包装类,多线程,同步与死锁

throw关键字直接抛出一个异常,抛出时直接抛出异常类的实例化对象即可。

自定义异常类

只需继承Exception或RuntimeException即可

包装类

java中提倡的一种思想,一切皆对象,但是Java中又分为引用数据类型,和基本数据类型,包装类就是把基本数据类型变成对象。

Character属于Object的直接子类
Boolean属于Object的直接子类
其余属于Number的子类。

装箱和拆箱

将一个基本数据类型变成包装类为装箱,将一个包装类变成基本数据类型为拆箱。

多线程

多线程是实现并发机制的一种有效手段。

Java中实现多线程有两种方式,一种是继承Thread类,一种是实现Runnable接口,1.5之后还有一个Callable接口
一个类继承Thread类就称这个类为多线程类,在其中必须覆写run()方法。这个方法为线程的主体。

要正确的启动线程,是不能直接调用run()方法,应该调用从Thread类继承而来的start()方法。
虽然调用的是start()方法,但实际调用的是run()方法的主体。
并且只能调用一次start()方法。
Runnable接口中只提供一个run()方法

启用多线程还是要用Thread类
通过public Thread(Runnable target)和 public Tread(Runnable target,String name),这两个构造方法可以接受Runnable的子类实例对象。
Runnable可实现资源共享,而Thread则不行。
实现Runnable接口是有一些优势
1.适合多个相同程序代码的线程去处理同一资源的情况
2.可以避免由于Java的单继承局限
3.增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的

同步

同步代码块,用{}括起来的,再加上synchronized,就称为同步代码块

还可以同步方法

死锁

所谓死锁就是两个线程都在等彼此先完成,造成了程序的停滞状体

线程的几种状态,线程的操作及其方法,Java的IOName()方法设置线程名字,可以允许线程同名,但应该避免这种事情发生,如果没有设置线程名称那么系统会默认设置一个名字为Thread-Xx。

Java中用isAliva()来判断线程是否启动并且还在运行。

Java中可以用join()方法让一个线程强制运行,并且这个期间,其他线程只能等,不能运行。
用Thread.sleep()让线程休眠,用interrupt()方法中断线程用setDaemon()方法让线程在后台运行。
线程的优先级

但并不是线程的优先级越高,就一定会先执行,那个线程先执行还是由CPU来调度。
线程的礼让,可以用yield()方法将一个线程的操作暂时让给其它线程执行,但并不是一定会让,还是由CPU决定。

JavaIO

file类,与文件本身有关的类,可以用它,新建文件,删除文件等操作。

可以用createNewFile()创建文件,但是windows是反斜杠分隔,linux用正斜杠分隔,所以一般用Java提供的两个常量pathSeparator,setparator
用delete()方法删除文件。exists()判断文件是否存在
用mkdir()方法创建文件夹,用public String[] list():列出全部名称,public File listFiles():列出完整路径。
RandomAccessFile类,对文件内容进行操作。

字节流,字符流的一些基本操作,转换流,内存操作流,管道流,打印流的基本介绍,还有System对io的支持。

字节流与字符流的基本操作

在程序中所有的数据都是以流的方式进行传输或保存的,需要数据用输入流,保存数据用输出流,
主要操作流过程如下:

  • 1.使用file类打开一个文件。
  • 2.使用字节流或字符流的子类指定输出的位置。
  • 3.进行读写操作。
  • 4.关闭输入输出流。

字节流

字节流主要是byte数据类型,操作类为OutputStream和InputStream,outputSteam是io字节输出的最大父类,此为抽象类,要用子类实例化对象

如指定文件不存在,则会自动创建文件,并写入。

如输入文件路径不存在则会出现异常。

字符流

字符输出流Writer,输入流Reader也为抽象类,与前面一样要利用子类实例化对象,

字节流与字符流的区别

字节流操作时不会到缓冲区,字符流操作时会到缓冲区。

其他流

转换流

OutputStreamWriter类是Writer的子类,将输出的字符流转换为字节流,即将一个字符流的输出对象变为字节流输出对象。
InputStreamReader类是Reader的子类,将输入的字节流转换成字符流,即将一个字节流的输入对象变为字符流的输入对象。

不管如何操作,最终全部是以字节的形式保存在文件之中。

内存操作流

字节内存流:ByteArrayInputStream内存字节输入流,ByteArrayOutputStream内存字节输出流
字符内存流:CharArrayReader内存字符输入流,CharArrayWriter内存字符输出流。
以字节流操作为主。


内存操作流一般在生成一些临时信息时才会使用,如果将这些临时信息保存在文件中,则代码执行完之后肯定还要删除这个临时文件,那么此时使用内存操作流时最合适的。

管道流

管道流的主要作用时进行两个线程间的通信,分为管道输出流PipedOutputStream,管道输入流PiepdInputSream,如果要进行管道输出则必须把输出流连在输入流上。

打印流

打印流时输出信息最方便的类,主要包含字节打印流PrintStream,字符打印流PrintWriter,主要讲解字节打印流
PrintStream时OutputStream的子类

使用打印流进行输出格式化

System类对IO的支持


本来这三个常量应该大写,但此处用小写,是java历史发展的产物。
关于System.in键盘输入
有两个问题

  • 指定数据输入的长度,如果现在输入的数据超出了长度范围,则只能输入部分数据。
  • 如果指定的Byte数组为奇数则还有可能出现中文乱码。
    如果不指定大小输入英文是没有问题的,输入中文还是会出现乱码。
    最好的输入方式是将全部输入的数据暂时放到一块内存中,然后一次性从内存中读取出数据。

输入输出重定向

这个是改变输入流来源,输入流来源


AWT,Swing,基本容器JFrame,标签组件JLabel,按钮组件JButton,讲了几种布局管理器,绝对定位。

AWT

AWT大量使用windows函数,被称为重量级组件。
在AWT包中提供的所有工具包主要分为三种:
1.组件:component。
2.容器:Container。
3.布局管理器:LayoutManager。
AWT中所有组件都是从Component个MenuComponent扩展而来

Swing

Swing使用java语言实现,是以AWT平台为基础构建起来的新组件,称为轻量级组件。Swing中依然可以使用AWT的各个布局管理器,因Swing可跨平台,下面主要讲Swing的容器等等。

基本容器JFrame

JFrame是Component的子类。

在JFrame中使用Dimension类设置窗体的大小

还有一个Point类设置窗体位置

在Frame类的构造方法抛出了一个异常,但是并没有处理,因为抛出的是一个HerdlessException是RunTimeException的子类,可以不处理

标签组件JLabel

JLabel组件表示的是一个标签,本身是用于显示信息的,一般不能直接更改其显示内容。Lab了对象用Container类中的add()方法加入容器。

更改JLabel的文字样式

更改字体可以使用Component类中定义的setFont(Font f)方法

在JLabel中设置图片

直接使用Icon接口以及ImageIcon子类即可

按钮组件JButton

JBtton组件表示一个普通的按钮,使用此类可以直接在窗体中增加一个按钮。

布局管理器

如果部队窗体进行版面设置,则一个组件就会布满整个窗体,在Swing中所有的布局管理器都实现LayoutManager接口。

FlowLayout

FlowLayout属于流式布局管理器,使用此方法布局会使所有的组件像流水一样依次进行排列

BorderLayout

BorderLayout将一个窗体划分成东西南北中五个区域,可以直接将需要的组件放入其中,不过一本不会这样而是在其中放入容器。

GridLayout

GridLayout布局管理器是以表格进行管理的,在使用此布局管理器的时候必须要设置显示的行数的列数。

GardLayout

GardLayout是将一组组件彼此重叠地进行布局,就像一张张卡片一样,每次只会展示一个界面。

绝对定位

在Component中提供了setBounds()方法,可以定位一个组件地坐标
public void setBounds(int x,int y,int width,int height)
绝对定位好处是,不管窗体大小如何改,组件位置是不变的,之前地各种中,组件大小会跟着改变。

JFrame以外地其他容器,JPanel,JSplitPane,JTabbedPane,JScrollPane,JDesktopPane,JInternallFrame,事件处理,窗体事件处理,监听适配器,动作时间处理。

其他容器

JPanel

在JPanel中可以加入任意组件,然后直接将JPanel容器加入到JFrame容器中即可显示。

JSplitPane

JSplitPane主要功能是分隔面板,可以将一个窗体分隔成两个子窗体,可以是水平分隔也可以是垂直分隔。

JTabbedPane

JTabbedPane是在一个面板上设置多个选项卡供用户选择。

JScrollPane

JScrollPane的主要功能就是为显示的内容加入滚动条。

JDesktopPane和JInternalFrame

在Swing中也可以完成内部窗体的显示,即在一个窗体可以出现多个子窗体,每一个子窗体都无法超出父窗体的区域。JDesktopPane规定了一个父窗体的基本形式,JInternalFrame规定了各个子窗体,JInternelFrame需要加入到JDesktopPane中。

事件处理

事件就是表示一个对象发生的状态变化。每当按下一个按钮时,按钮的状态就发生了变化,此时就是产生一个事件,要处理这个事件就需要不停的监听事件的变化,并根据这些事件进行相应的处理。
可以通过getSource()取得发生此事件的源对象。事件接受对象被称为事件监听器。所有的事件监听器都是以监听接口的形式出现,处理时只需要实现此接口即可。

窗体事件

WindowListener是专门处理窗体事件的监听器,一个窗体的所有变化都可以使用这个接口进行监听。

监听适配器

如果一个接口有很多抽象方法,那么实现这个接口就需要实现他的全部方法,而有时候不需要其全部抽象方法,那么就可以在中间用一个抽象类实现接口,然后再继承抽象类即可,Java中提供了很多适配器,窗口适配器有WindowAdapter

动作事件及监听处理

如果想要一个按钮变得有意义,就需要动作事件处理,可以使用ActionListener接口处理按钮的动作事件

可以使用getSouce()取得事件源,然后用instanceof判断是否是你需要的事件源,从而进行精确的处理。

键盘和鼠标的事件处理和监听,单选钮,复选钮,菜单组件,文件复选框。

键盘和鼠标监听及处理

键盘监听直接使用KeyListtener即可。

如果想取得键盘输入的内容,则可以通过KeyEvent。

鼠标监听可以使用MouseListener接口

同样也有MouseEvent

可以使用MouseMotionListener接口完成鼠标拖拽的监听

单选钮,复选钮

单选钮可以实现N选一,在Swing中可以使用JRadioButton完成一组单选钮的操作

在单选钮操作中可以使用ItemListener接口进行事件的监听

当中存在的ItemEvent事件

复选钮可以实现N选多的操作,可以使用JCheckBox完成。

监听接口和单选钮一样,都是ItemListener。

菜单组件

菜单组件可以对按钮进行统一的管理与布局,这样可以让界面的功能更加丰富,布局也更加简洁。
实现菜单首先要了解JMenuBar组件,JMenuBar组件的功能是用来摆放JMenu组件,当完成多个JMenu组件之后,需要通过JMenuBar组件来将JMenu组件加入到窗口中。


往菜单中加入菜单项则可以使用JMenuItem组件,JMenuItem继承AbstractButton类。

因为是继承AbstractButton类所以事件的处理机制和JButton一样。

文件复选框

使用记事本或Word时可以通过JFileChooser组件实现此功能.

文件复选框的三种状态

Java数据库编程,JDBC的介绍,MySQL数据库简介,怎样用JDBC链接数据库,以及必要的驱动程序,KResultSet接口操作

JDBC

jdbc提供的是一套标准的接口,极大的体现了Java可移植性的设计思想
jdbc有
jdbc-odbc驱动,用微软的odbc进行直接操作
本地驱动,只能在特定的数据库上,丧失了程序的可移植性。
网络驱动将纯java客户机连接到不同的数据库上
本地协议纯jdbc驱动,可以从客户机上直接调用dbms服务器。
jdbc的核心是为用户提供api类库。

MySQL

MySQL由于其体积小,速度快,总体拥有成本低,开放源码
MySQL默认端口值是3306.

jdbc链接数据库

各个数据库会提供jdbc的驱动开发包,直接把jdbc操作所需要的开发包配置到classpath路径即可。
链接数据库可以使用DriverManager类链接数据库

数据库连接地址格式

Connetion接口,以后所有的数据库的操作都从此接口开始

数据库链接后,数据库的具体操作则要使用Statement接口完成,此接口可以使用Connect接口中提供的create Statement()方法实例化

ResultSet接口

在jdbc的操作中数据库的所有查询记录将使用ResultSet接口接收,并使用ResultSet取得内容。

开发中要限制查询数量。
所有数据都可以通过getString()方法取得。

大总结

这就是本学期学的大概内容,可能还有一些并没有总结完全,但重要的都在这里了,这个学期学了一门新的语言,因为前面已经学过C语言,所以学这个java并没有感到很难,java主要讲的就是面向对象以后的编程,基本语法和C基本一样,没什么好讲的,这个学期学到了很多内容,也了解到了很多内容,编程能力也得到了很大的提高。

posted @ 2019-12-13 13:37  xiaoliangliang  阅读(226)  评论(0编辑  收藏  举报