zoukankan      html  css  js  c++  java
  • 课程总结

    一.认识java

    1.JAVA语言特点

    简洁有效、可移植性、面向对象、解释性、适合分布式计算、拥有较好的性能、健壮防患于未然、具有多线程处理能力、具有较高的安全性、是一种动态语言、是一种中性结构

    2.JVM、JRE和JDK的区别:

    JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。

    java语言是跨平台,jvm不是跨平台的。

    JRE(Java Runtime Environment):java的运行环境,包括jvm+java的核心类库。

    JDK(Java Development Kit):java的开发工具,包括jre+开发工具

    3.数据类型:

    (1)基本数据类型(4类8种):

    整数类型:byte、short、int、long

    浮点数类型:float、double

    字符类型:char

    布尔类型:boolean(ture false)

    (2)引用数据类型:

    接口

    数组

    4.类型转换

    精度从高到低 double float long int short(char) byte
    (1)自动类型转换 将一个低精度---高精度
    (2)强制类型转换 将一个高精度---低精度(精度会下降)

    5.重载:

    概念:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
    特点:与返回值类型无关,只看参数列表(参数类型以及参数个数)。
    好处:方便于阅读,优化了程序设计。

    二.面向对象

    1.类和对象:

    类:对现实世界中某类事物的描述,是抽象的,概念上的定义。
    对象:事物具体存在的个体。

    3.成员变量和局部变量的区别

    (1)作用域
    成员变量:针对整个类有效。
    局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)
    (2)存储位置
    成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
    局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。
    当方法调用完,或者语句结束后,就自动释放。

    4.封装:

    指隐藏对象的属性和实现细节,仅对外提供公共访问方式

    5.构造方法:

    (1)特点:
    方法名与类名相同
    没有返回类型
    没有返回值
    (2)作用:构造函数是用于创建对象,并对其进行初始化赋值,对象一建立就自动调用相对应的构造函数

    6.构造代码块:

    (1)作用:给对象进行初始化,对象一建立就执行,而且优先于构造函数执行
    (2)构造代码块和构造函数的区别:
    构造代码块是给所有不同对象的共性进行统一初始化
    构造函数是给对应的对象进行初始化

    7.this关键字

    作用(1)表示类中的属性
    (2)可以使用this调用本类的构造方法
    (3)this表示当前对象

    8.static关键字:

    (1)静态的意思,用来修饰成员变量和成员函数
    (2)静态的特点:
    随着类的加载而加载
    优先于对象存在
    对所有对象共享
    可以被类名直接调用
    注意:静态方法中不能使用this,super关键字

    三.面向对象(高级篇)

    1.继承

    (1)把很多类的相同特征和行为进行抽取,用一个类来描述。让多个类和这个类产生一个关系。
    这样的话,多个类就可以省略很多代码。这个关系就是继承。java中用extends关键字表示。
    (2)继承的特点:
    java中只能单继承,没有多继承。
    java可以有多重(层)继承。
    (3)继承的好处:
    继承的出现提高了代码的复用性。
    继承的出现让类与类之间产生了关系,提供了多态的前提。

    2.重写和重载的区别

    重载:在同一类中。方法名相同,参数列表不同。重载可以改变返回类型。
    重写:在不同类中(子父类中)。

    3.this和super的区别

    this:代表本类对象的引用。
    super:代表父类的存储空间。

    4.final关键字

    (1)最终的意思,可以用于修饰类,方法,变量。
    (2)final修饰的类不能被继承。
    final修饰的方法不能被重写。
    final修饰的变量是一个常量。只能被赋值一次。
    内部类只能访问被final修饰的局部变量。

    5.抽象类

    特点:

    A:抽象类和抽象方法都要用abstract进行修饰
    B:抽象类不能被实例化
    C:抽象类中不一定有抽象方法,但是,有抽象方法的类一定是抽象类。

    6.接口interface

    (1)关系
    A:类与类的关系
    是继承关系。类与类只能单继承,可以多重继承。
    B:类和接口的关系
    是实现关系。类可以多实现接口。
    类在继承一个类的同时,可以实现多个接口。
    C:接口和接口的关系
    是继承关系。接口可以多继承接口。
    (2)接口的特点
    A:是对外暴露的规则
    B:是功能的扩展
    C:接口的出现降低耦合性。
    耦合(类与类之间的关系)
    内聚(类完成功能的能力)
    编程规范:低耦合,高内聚。

    7.接口和抽象类的区别

    抽象类只能被单继承
    接口可以多实现,接口的出现避免了多继承的局限性。

    8.多态:

    (1)同一个对象,在程序不同时刻的多种运行状态。举例:动物,狗是狗,狗是动物。水(气态,液态,固态)

    (2)多态前提

    A:存在着继承或者实现关系

    B:有方法的重写

    C:父类(接口)引用指向子类(实现)对象

    9.Object类:

    (1)是所有类的根类,超类。
    java中提供的类以及我们自定义的类都直接或者间接的继承自Object类。
    (2)Object类中的方法
    A:void finalize()
    当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
    B:Class getClass()
    获取对象的字节码文件的描述类,后面再讲反射的时候还会在说这个类。
    String name = s.getClass().getName();

    三.异常

    1.程序运行过程中的不正常现象就叫异常。

    2.导致程序运行不正常的现象有很多,所以,就有很多的异常对象。

    而这些异常对象存在着共性的内容,所以,可以不断的进行抽取。最终形成了异常的体系结构。
    异常体系的根类是:Throwable

    3.Throwable:

    Error:重大的问题,我们处理不了。也不需要编写代码处理。比如说内存溢出。
    Exception:一般性的错误,是需要我们编写代码进行处理的。
    RuntimeException:运行时异常,这个我们也不需要处理。

    4.

    异常的分类
    异常有两种:
    编译时被检测异常:
    该异常在编译时,如果没有处理(没有抛也没有try),编译失败。
    该异常被标识,代表这可以被处理。
    运行时异常(编译时不检测)
    在编译时,不需要处理,编译器不检查。
    该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

    5.异常体系的特点:

    异常体系中的所有类及其子类对象都具备可抛性。也就是说可以被throw和throws关键字所操作。

    6.main方法是如何处理异常的。

    A:在main里面编写代码进行处理
    B:交给jvm自己进行处理。采用的是jvm的默认处理方式。
    其实就是相当于调用了异常对象的printStackTrace()方法。

    7.Throwable类的学习

    getMessage():获取异常信息,返回字符串。
    toString():获取异常类名和异常信息,返回字符串。
    printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

    8.异常的处理·

    try...catch...finally

    try
    {
    可能出现异常的代码
    }
    catch(异常对象)
    {    
    异常处理代码
    }
    finally
    {
    释放资源
    }
    

    9.throws和throw的区别

    A:有throws的时候可以没有throw。
    有throw的时候,如果throw抛的异常是Exception体系,那么必须有throws在方法上声明。
    B:throws用于方法的声明上,其后跟的是异常类名,后面可以跟多个异常类,之间用逗号隔开
    throw用于方法体中,其后跟的是一个异常对象名

    四、多线程:

    1、进程和线程:

    进程:正在进行的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
    线程:进程内部的一条执行路径或者一个控制单元。
    两者的区别:
    一个进程至少有一个线程
    进程在执行过程中拥有独立的内存单元,而多个线程共享内存;

    2、多线程的优势:

    解决了多部分同时运行的问题,提高效率

    3、线程的弊端:

    线程太多会导致效率的降低,因为线程的执行依靠的是CPU的来回切换。

    4、什么叫多线程:

    一个进程中有多个线程,称为多线程。

    5、实现多线程的方法:

    实现多线程可以通过继承Thread类和实现Runnable接口。
    (1)继承Thread
    定义一个类继承Thread类
    复写Thread类中的public void run()方法,将线程的任务代码封装到run方法中
    直接创建Thread的子类对象,创建线程
    调用start()方法,开启线程(调用线程的任务run方法)
    //另外可以通过Thread的getName()获取线程的名称。

    (2)实现Runnable接口;
    定义一个类,实现Runnable接口;
    覆盖接口的public void run()的方法,将线程的任务代码封装到run方法中;
    创建Runnable接口的子类对象
    将Runnabl接口的子类对象作为参数传递给Thread类的构造函数,创建Thread类对象
    (原因:线程的任务都封装在Runnable接口子类对象的run方法中。
    所以要在线程对象创建时就必须明确要运行的任务)。
    调用start()方法,启动线程。

    两种方法区别:

    (1)实现Runnable接口避免了单继承的局限性
    (2)继承Thread类线程代码存放在Thread子类的run方法中
    实现Runnable接口线程代码存放在接口的子类的run方法中;
    在定义线程时,建议使用实现Runnable接口,因为几乎所有多线程都可以使用这种方式实现

    6、创建线程是为什么要复写run方法?

    Thread类用于描述线程。Thread类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。

    7、start()和run方法有什么区别?

    调用start方法方可启动线程,而run方法只是thread的一个普通方法,调用run方法不能实现多线程;

    Start()方法:

    start方法用来启动线程,实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的
    代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,
    一旦得到cpu时间片(执行权),就开始执行run()方法,这里方法run()称为线程体,
    它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

    Run()方法:

    run()方法只是Thread类的一个普通方法,如果直接调用Run方法,程序中依然只有主线程这一个线程,
    其程序执行路径还是只有一条,还是要等待run方法体执行完毕后才可继续执行下面的代码,
    这样就没有达到多线程的目的。

    8、线程的几种状态:

    新建:new一个Thread对象或者其子类对象就是创建一个线程,当一个线程对象被创建,但是没有开启,这个时候,
    只是对象线程对象开辟了内存空间和初始化数据。
    就绪:新建的对象调用start方法,就开启了线程,线程就到了就绪状态。
    在这个状态的线程对象,具有执行资格,没有执行权。
    运行:当线程对象获取到了CPU的资源。
    在这个状态的线程对象,既有执行资格,也有执行权。
    冻结:运行过程中的线程由于某些原因(比如wait,sleep),释放了执行资格和执行权。
    当然,他们可以回到运行状态。只不过,不是直接回到。
    而是先回到就绪状态。
    死亡:当线程对象调用的run方法结束,或者直接调用stop方法,就让线程对象死亡,在内存中变成了垃圾。
    9、sleep()和wait()的区别:
    (1)这两个方法来自不同的类,sleep()来自Thread类,和wait()来自Object类。
    (2)sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,
    要让b线程睡觉要在b的代码中调用sleep。而wait()是Object类的非静态方法
    (3)sleep()释放资源不释放锁,而wait()释放资源释放锁;
    (4)使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
    10、多线程安全问题:
    (1)原因:当程序的多条语句在操作线程共享数据时(如买票例子中的票就是共享资源),由于线程的随机性导致
    一个线程对多条语句,执行了一部分还没执行完,另一个线程抢夺到cpu执行权参与进来执行,
    此时就导致共享数据发生错误。比如买票例子中打印重票和错票的情况。
    (2)解决方法:对多条操作共享数据的语句进行同步,一个线程在执行过程中其他线程不可以参与进来
    11、Java中多线程同步是什么?
    同步是用来解决多线程的安全问题的,在多线程中,同步能控制对共享数据的访问。如果没有同步,当一个线程在
    修改一个共享数据时,而另外一个线程正在使用或者更新同一个共享数据,这样容易导致程序出现错误的结果。
    12、什么是锁?锁的作用是什么?
    锁就是对象
    锁的作用是保证线程同步,解决线程安全问题。
    持有锁的线程可以在同步中执行,没有锁的线程即使获得cpu执行权,也进不去。
    13、同步的前提:
    (1)必须保证有两个以上线程
    (2)必须是多个线程使用同一个锁,即多条语句在操作线程共享数据
    (3)必须保证同步中只有一个线程在运行
    14、同步的好处和弊端
    好处:同步解决了多线程的安全问题
    弊端:多线程都需要判断锁,比较消耗资源
    15、同步的两种表现形式:
    (1)同步代码块:
    可以指定需要获取哪个对象的同步锁,使用synchronized的代码块同样需要锁,但他的锁可以是任意对象
    考虑到安全问题,一般还是使用同一个对象,相对来说效率较高。

    注意:
    **虽然同步代码快的锁可以使任何对象,但是在进行多线程通信使用同步代码快时,
    必须保证同步代码快的锁的对象和,否则会报错。
    **同步函数的锁是this,也要保证同步函数的锁的对象和调用wait、notify和notifyAll的对象是
    同一个对象,也就是都是this锁代表的对象。
    格式:

    synchronized(对象)
    {
    需同步的代码;
    }
    

    (2)同步函数
    同步方法是指进入该方法时需要获取this对象的同步锁,在方法上使用synchronized关键字,
    使用this对象作为锁,也就是使用了当前对象,因为锁住了方法,所以相对于代码块来说效率相对较低。
    注:静态同步函数的锁是该方法所在的类的字节码文件对象,即类名.class文件
    格式:-
    修饰词 synchronized 返回值类型 函数名(参数列表)
    {
    需同步的代码;
    }

    16.死锁

    两个线程对两个同步对象具有循环依赖时,就会发生死锁。即同步嵌套同步,而锁却不同。

    17.wait()、sleep()、notify()、notifyAll()

    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,
    而是由JVM确定唤醒哪个线程(一般是最先开始等待的线程),而且不是按优先级。
    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

    18.多线程join方法:

    void join() 等待该线程终止。
    void join(long millis) 等待该线程终止的时间最长为 millis 毫秒。
    throws InterruptedException
    特点:当A线程执行到B线程的join方法时,A就会等待B线程都执行完,A才会执行
    作用: join可以用来临时加入线程执行;

    19.多线程优先级:yield()方法

    yield():暂停当前正在执行的线程对象,并执行其他线程
    setPriority(int newPriority):更改线程优先级
    int getPriority() 返回线程的优先级。
    String toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组

    五.java IO

    1、IO流概述

    (1)用来处理设备(硬盘,控制台,内存)间的数据。
    (2)java中对数据的操作都是通过流的方式。
    (3)java用于操作流的类都在io包中。
    (4)按照流操作的数据的类型不同:分为字节流和字符流。字符流是为了方便中文的操作而来的。
    (5)按照流的流向不同分为:输入流,输出流

    2.字节流

    输出字节流:OutputStream:字节写入流抽象类
    输入字节流:InputStream:字节读取流抽象类

    3.字符流

    输出字符流:Writer:字符写入流的抽象
    输入字符流:Reader: 字符读取流的抽象类

    4.转换流

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

    5.内存操作流

    字节内存流:ByteArrayInputStream(内存字节输入流)、ByteArrayOutputStream(内存字节输出流)。
    字符内存流:CharArrayReader(内存字符输入流)、CharArrayWriter(内存字符输出流)。

    6.管道流:进行两个线程间的通信

    分为管道输出流(PipedOutputStream)、管道输入流(PipedInputStream)。
    如果想进行管道输出,则必须把输出流连接在输入流上,在PipedOutputSream类上有如下方法用于连接管道。

    7.打印流

    打印流提供了非常方便的打印功能,可以打印任何的数据类型,如小数、整数、字符串等。
    包含字节打印流(PrintStream)和字符打印流(PrintWriter)

    六.图形界面

    1.AWT(重量级组件)

    主要包括以下三种工具类
    1)组件:Component
    2)容器:Container
    3)布局管理器:LayoutManager

    2.Swing(轻量级组件)

    (1)基本容器JFrame
    (2)标签组件JLabel
    (3)按钮组件JButton
    (4)布局管理器
    (6)文本框和文本区框和密码输入框:JTextField和JTextArea和JPasswordField。

    3.实现简单窗口

    实现简单记事本

    package demo;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.InputEvent;
    import java.awt.event.KeyEvent;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.KeyStroke;
    
    public class TextPad implements ActionListener{
    	JFrame frame;
    	JMenuBar bar;
    	JMenu fileMenu,editMenu,formatMenu,lookMenu;
    	JMenuItem newItem,openItem,saveItem,saveAnotherItem,closeItem;
    	ImageIcon newIcon,openIcon,saveIcon,saveAnotherIcon,closeIcon;
    	JMenuItem revocationItem,cutItem,copyItem,stickItem,deleteItem,allItem,timeDateItem;
    	JMenuItem lineItem,typeFaceItem,zoomItem,statusItem;
    	JScrollPane scroll;
    	JTextArea area;
    	JFileChooser chooser;             //文件选择框
    	File file;
    	
    	public TextPad() {
    		frame = new JFrame("记事本");
    		bar=new JMenuBar();
    		fileMenu=new JMenu("文件");
    		editMenu=new JMenu("编辑");
    		formatMenu=new JMenu("格式");
    		lookMenu=new JMenu("查看");
    		newIcon=new ImageIcon("e:"+File.separator+"Test"+File.separator+"小图标"+File.separator+"newIcon.png");
    		openIcon=new ImageIcon("e:"+File.separator+"Test"+File.separator+"小图标"+File.separator+"openIcon.png");
    		saveIcon=new ImageIcon("e:"+File.separator+"Test"+File.separator+"小图标"+File.separator+"saveIcon.png");
    		saveAnotherIcon=new ImageIcon("e:"+File.separator+"Test"+File.separator+"小图标"+File.separator+"saveAnotherIcon.png");
    		closeIcon=new ImageIcon("e:"+File.separator+"Test"+File.separator+"小图标"+File.separator+"closeIcon.png");	
    		area=new JTextArea();
    		scroll=new JScrollPane(area);
    
    		
    		newItem=new JMenuItem("新建(N)",newIcon);
    		openItem=new JMenuItem("打开(O)",openIcon);
    		saveItem=new JMenuItem("保存(S)",saveIcon);
    		saveAnotherItem=new JMenuItem("另存为(D)",saveAnotherIcon);
    		closeItem=new JMenuItem("关闭(X)",closeIcon);
    		
    		revocationItem=new JMenuItem("撤销(Z)");
    		cutItem=new JMenuItem("剪切(T)");
    		copyItem=new JMenuItem("复制( C)");
    		stickItem=new JMenuItem("粘贴(V)");
    	    deleteItem=new JMenuItem("删除(P)");
    		allItem=new JMenuItem("全选(A)");
    		timeDateItem=new JMenuItem("时间日期(Q)");
    		
    		lineItem=new JMenuItem("自动换行(W)");
    		typeFaceItem=new JMenuItem("字体(F)");
    		zoomItem=new JMenuItem("缩放(R)");
    		statusItem=new JMenuItem("状态栏(S)");
    		
    		//加上监视器
    		newItem.addActionListener(this);
    		openItem.addActionListener(this);
    		saveItem.addActionListener(this);
    		saveAnotherItem.addActionListener(this);
    		revocationItem.addActionListener(this);
    		cutItem.addActionListener(this);
    		copyItem.addActionListener(this);		
    		stickItem.addActionListener(this);
    		deleteItem.addActionListener(this);
    		allItem.addActionListener(this);
    		timeDateItem.addActionListener(this);
    		lineItem.addActionListener(this);
    		typeFaceItem.addActionListener(this);
    		zoomItem.addActionListener(this);
    		statusItem.addActionListener(this);
    		
    		
    		fileMenu.add(newItem);
    		fileMenu.add(openItem);
    		fileMenu.add(saveItem);
    		fileMenu.add(saveAnotherItem);
    		fileMenu.addSeparator();
    		fileMenu.add(closeItem);
    		
    		editMenu.add(revocationItem);
    		editMenu.add(cutItem);
    		editMenu.add(copyItem);
    		editMenu.add(stickItem);
    		editMenu.add(deleteItem);
    		editMenu.add(allItem);
    		editMenu.add(timeDateItem);
    		
    		formatMenu.add(lineItem);
    		formatMenu.add(typeFaceItem);
    		lookMenu.add(zoomItem);
    		lookMenu.add(statusItem);
    		
    		newItem.setMnemonic(KeyEvent.VK_N);
    		openItem.setMnemonic(KeyEvent.VK_O);
    		saveItem.setMnemonic(KeyEvent.VK_S);
    		saveAnotherItem.setMnemonic(KeyEvent.VK_D);
    		closeItem.setMnemonic(KeyEvent.VK_X);
    		revocationItem.setMnemonic(KeyEvent.VK_Z);
    		cutItem.setMnemonic(KeyEvent.VK_T);
    		copyItem.setMnemonic(KeyEvent.VK_C);
    		stickItem.setMnemonic(KeyEvent.VK_V);
    		deleteItem.setMnemonic(KeyEvent.VK_P);
    		allItem.setMnemonic(KeyEvent.VK_A);
    		timeDateItem.setMnemonic(KeyEvent.VK_Q);
    		
    		//快捷键
    		newItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_N,InputEvent.CTRL_DOWN_MASK));
    		openItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_O,InputEvent.CTRL_DOWN_MASK));
    		saveItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_S,InputEvent.CTRL_DOWN_MASK));
    		saveAnotherItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_D,InputEvent.CTRL_DOWN_MASK));
    		closeItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_X,InputEvent.CTRL_DOWN_MASK));
    		revocationItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_Z,InputEvent.CTRL_DOWN_MASK));
    		cutItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_T,InputEvent.CTRL_DOWN_MASK));
    		copyItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_C,InputEvent.CTRL_DOWN_MASK));	
    		stickItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_V,InputEvent.CTRL_DOWN_MASK));
    		deleteItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_P,InputEvent.CTRL_DOWN_MASK));
    		allItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_A,InputEvent.CTRL_DOWN_MASK));
    		timeDateItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_Q,InputEvent.CTRL_DOWN_MASK));
    
    		
    		bar.add(fileMenu);
    		bar.add(editMenu);
    		bar.add(formatMenu);
    		bar.add(lookMenu);
    		
    		frame.setJMenuBar(bar);
    		frame.add(scroll);
    		frame.setSize(600,400);
    		frame.setLocation(200, 100);
    		frame.setVisible(true);
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent event) {
    		Object obj=event.getSource();
    		if(obj instanceof JMenuItem) {
    			JMenuItem item = (JMenuItem) obj;
    			if(item==newItem) {                  //文件栏
    				new TextPad();
    			}else if(item==openItem) {
    				chooser=new JFileChooser();
    				chooser.showOpenDialog(null);
    				file=chooser.getSelectedFile();
    				try {
    					FileInputStream fis=new FileInputStream(file);
    					byte[] b = new byte[fis.available()];
    					fis.read(b);
    					area.append(new String(b));
    					fis.close();
    					
    				} catch (FileNotFoundException e) {
    					e.printStackTrace();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}else if(item==saveItem) {
    				
    				file=chooser.getSelectedFile();
    				FileOutputStream fos;
    				try {
    					fos = new FileOutputStream(file);
    					byte[] b=area.getText().getBytes();
    					fos.write(b);
    					fos.close();
    				} catch (FileNotFoundException e) {
    					e.printStackTrace();
    				} catch (IOException e) {				
    				}			
    			}else if(item==saveAnotherItem) {
    				chooser=new JFileChooser();
    				chooser.showSaveDialog(null);
    				file=chooser.getSelectedFile();
    				try {
    					if(!file.exists()) {
    						file.createNewFile();
    					}
    					FileOutputStream fos=new FileOutputStream(file);
    					byte[] b=area.getText().getBytes();
    					fos.write(b);
    					fos.close();
    				} catch (FileNotFoundException e) {					
    					e.printStackTrace();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    				
    			}else if(item==closeItem) {
    				System.exit(1);
    				
    			}
    			else if(item==cutItem) {                           //编辑栏
    				area.cut();
    			}else if(item==copyItem) {
    				area.copy();
    			}else if(item==stickItem) {
    				area.paste();
    			}else if(item==allItem) {
    				area.selectAll();
    			}else if(item==deleteItem) {
    				String temp=area.getSelectedText();
    				int start=area.getSelectionStart();
    				int end=area.getSelectionEnd();
    				area.replaceRange("", start, end);
    			}else if(item==timeDateItem) {
                    Date d = new Date();
                    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String dateNewStr=sdf.format(d);
                    area.append(dateNewStr);
    		}
    		
    	}
    	}
    }
    
    

    总结

    眨眼间,一个学期就过去了,这个学期学的语言是java,java和c有很多相似的又有很多不同。最初接触java时给我最大的不同便是语法,第一次看java代码时给我的感觉是一堆一堆很繁琐,不像c,很简洁很明了。后来经过一段时间的学习,也慢慢了解了java,慢慢发现java有很多还是和c很相象的,例如循环语句,条件语句这些,但也有很多不用,首先最大的不同便是语法上的。在这个学期开始时,对于java其实是没有跟上去的,可能与c的相差还是有点大,对于java的编程有点习惯用c的想法去想去思考,导致很多理解不来,所以最初一段时间是没跟上来,后来经过之后的学习以及自己再往前复习复习才慢慢跟上,现在也还是理解最基础的很多还是不知道,所以这个学期的java其实是没怎么学好的。之后再寒假还得多看看java。

  • 相关阅读:
    Maven简介,安装,配置
    Centos 安装 Tomcat 并验证
    Centos 安装 jdk 和配置环境变量
    java基本数据类型
    centos7中docker安装并启动jpress
    在docker中访问网络
    在docker中运行一个nginx
    Centos7 安装docker 及使用其简单命令
    Centos7安装dnf工具管理rpm包
    C#获取外网IP地址;C#获取所在IP城市地址
  • 原文地址:https://www.cnblogs.com/cxnkkk/p/12037163.html
Copyright © 2011-2022 走看看