javase——110个入门必须掌握知识点大全

目录:

知识点1: main函数

知识点2:    if else 

知识点3:转义字符     

知识点4:逻辑运算符

  &和&&的特点:

 |和||的特点:      

知识点5:if和switch   

知识点6:变量的格式

知识点7: 数组

    知识点8:for语句

知识点9:for和while

知识点10:打印规律

知识点11:无限循环

知识点12:函数定义的格式

    知识点13:如何定义一个函数呢?

知识点14:什么时候用重载?

知识点15:continue:

知识点16:break和continue语句

知识点17:while和do while

知识点18:数组的操作:

知识点19:面向对象

知识点20:成员变量和局部变量

知识点21:匿名对象

知识点22:private

知识点23:构造函数

知识点24:构造代码块。

知识点25:this

知识点26:静态

知识点27:public

知识点28:对象

知识点29:public static void main(String[] args) 介绍

知识点30:设计模式

知识点31:饿汉式和懒汉式

知识点32:静态代码块

知识点33:static

    知识点34:什么使用静态?什么时候定义静态函数呢?

知识点35:抽象

知识点36:继承

知识点37:子父类出现后,类成员的特点:

知识点38:子父类中的函数。

知识点39:子父类中的构造函数。

知识点40:final 

知识点41:接口

知识点42:模版方法

知识点43:数据库的操作

知识点44:多态

知识点45:在多态中成员函数的特点:

知识点46:Object

知识点47:继承和接口

知识点48:异常

知识点49:自定义异常

知识点50:RuntimeException 

知识点51:内部类的访问规则:

知识点52:匿名内部类:

知识点53:finally代码块

知识点54: finally代码块三个格式: 

知识点55:异常在子父类覆盖中的体现

知识点56:import.

知识点57:异常:

知识点58:死锁

知识点59:单例设计模式饿汉式和懒汉式

知识点60:如果同步函数被静态修饰后,使用的锁是什么呢?

知识点61:同步函数用的是哪一个锁呢?

知识点62:进程和线程

知识点63:

知识点64:等待和唤醒

知识点65:join:

知识点67:进程和线程

知识点68:基本数据类型对象包装类

知识点69:StringBuffer

知识点70:String类

知识点71:字符串思路

知识点72:多线程

知识点73:集合框架

知识点74:Set和HashSet:

知识点75:LinkedList:特有方法:

知识点76:堆栈和队列

知识点77:List和Set

知识点78:枚举

知识点79:泛型

知识点80:通配符

知识点81:HashSet和TreeSet

知识点82:比较器

知识点83:Map集合

知识点84:map集合的两种取出方式:

知识点85:Arrays和asList

知识点86:集合框架的工具类

知识点87:集合变数组

知识点88:高级for循环

知识点89:方法的可变参数

知识点90:StaticImport  静态导入

知识点91:字符流和字节流

知识点92:Runtime对象

知识点93:输入输出

知识点94:字符读取流缓冲区

知识点95:字符流和字节流

    字符流:

    字节流:

知识点96:装饰和继承

知识点97:File类常见方法:

    1,创建。

    2,删除。

    3,判断。

    4,获取信息。

知识点98:JavaFileList

知识点99:PrintStreamDemo

    打印流:

    字节打印流:

    字符打印流:

知识点100:PropertiesDemo

知识点101:RemoveDir

知识点102:RunCount

知识点103:ByteArrayStream

知识点104:DataInputStream与DataOutputStream

知识点105:EncodeDemo

知识点106:RandomAccessFile

知识点107:GUI

    创建图形化界面:

    事件监听机制的特点:

知识点108:编码

知识点109:网络架构:

    C/S:Client/Server

    B/S:Browser/Server

知识点110:正则表达式:

    具体操作功能:

    操作步骤:


知识点1: main函数

        main函数可以保证该的独立运行。
        它是程序的入口。
        它会被JVM所调用。

知识点2:    if else 

 if else 结构 简写格式: 变量 = (条件表达式)?表达式1:表达式2;
        三元运算符:
        好处:可以简化if else代码。
        弊端:因为是一个运算符,所以运算完必须要有一个结果。

知识点3:转义字符     

转义字符:通过\ 来转变后面字母或者符号的含义。
        \n:换行。
        \b:退格。相当于backspace。
        \r:按下回车键。window系统,回车符是由两个字符来表示\r\n.
        \t:制表符。相当于tab键。    

知识点4:逻辑运算符

class OperateDemo2 
{
    public static void main(String[] args) 
    {

        int x  = 7;

        //逻辑运算符用于连接boolean类型的表达式。

        //x>3 & x<6 = true & true = true;
        /*
        true & true = true;
        true & false = false;
        false & true = false;
        false & false = false;

        & : 只要两边的boolean表达式结果,有一个为false。那么结果就是false。
            只有两边都为true,结果为true。
        */
        /*
        true | true = true;
        true | false = true;
        false | true = true;
        false | false = false;
        | : 两边只要有一个为true,结果为true。
            只有两边都有false,结果为false。
        */

        /*
        ^ : 异或;就是和|有点不一样。当true ^ true = false;
        true ^ true = false;
        true ^ false = true;
        false ^ true = true;
        false ^ false = false;
        ^ : 两边相同结果是false。
            两边不同结果是true。

        */

        /*
        !!true
        */

        
        int a = 2;

        //a>3 && a<6;

        /*


  &和&&的特点:

       &:无论左边是true是false。右边都运算。
        &&:当左边为false时,右边不运算。

 |和||的特点:      

        |:两边都参与运算
        ||:当左边为true。右边不运算。
        

      

 System.out.println(false ^ false);
        System.out.println(~6);


        int n = 3,m = 8;
        System.out.println("n="+n+",m="+m);
        
        //1,通过第三方变量。
        /*int temp;
        temp = n;
        n = m;
        m = temp;
        */

        //2不用第三方变量。
        //11 = 3 +  8;

        //3 = 11 - 8;
        //8 = 11 - 3;
        /*
        n = n + m;//如果n和m的值非常大,容易超出int范围。
        m = n - m;
        n = n - m;
        */

        n = n ^ m;

        m = n ^ m;//(n^m)^m;

        n = n ^ m;//n ^ (n ^ m)

        System.out.println("n="+n+",m="+m);
    }
}

知识点5:if和switch   

 if和switch语句很像。
        具体什么场景下,应用哪个语句呢?
        如果判断的具体数值不多,而是符合byte short int char这四种类型。
        虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。

        其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围 更广。

知识点6:变量的格式


        定义变量的格式;
        数据类型  变量名 =  初始化值;
        什么时候定义变量?
        当数据不确定的时候。需要对数据进行存储时。
        就定义一个变量来完成存储动作。

知识点7: 数组


        元素类型[] 数组名 = new 元素类型[元素个数或数组长度];


    
知识点8:for语句


        for(初始化表达式;循环条件表达式;循环后的操作表达式)
        {
            执行语句;
        }

知识点9:for和while


        1,变量有自己的作用域。
        对于for来讲:如果将用于控制循环的增量定义在for语句中。
        那么该变量只在for语句内有效。
        for语句执行完毕。该变量在内存中被释放。

        2,for和while可以进行互换。如果需要定义循环增量。用for更为合适。

知识点10:打印规律


        *
        **
        ***
        ****
        *****
        
        不是规律的规律:
        尖朝上,可以改变条件。让条件随着外循环变化。

        尖朝下,可以初始化值,让初始化随着外循环变化。

知识点11:无限循环


        无限循环的最简单表现形式。
        for(;;){}

        while(true){}

知识点12:函数定义的格式


          先明确函数定义的格式。
        修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,)
        {
            执行语句;
            return 返回值;
        }
    
        当函数运算后,没有具体的返回值时,这是返回值类型用一个特殊的关键字来标识。
        该关键字就是void。void:代表的是函数没有具体返回值的情况。
        当函数的返回值类型是void时,函数中的return语句可以省略不写。


    
知识点13:如何定义一个函数呢?


        1,既然函数是一个独立的功能,那么该功能的运算结果是什么先明确
        因为这是在明确函数的返回值类型。
        2,在明确在定义该功能的过程中是否需要未知的内容参与运算。
        因为是在明确函数的参数列表(参数的类型和参数的个数)。

知识点14:什么时候用重载?


        当定义的功能相同,但参与运算的未知内容不同。
        那么,这时就定义一个函数名称以表示起功能,方便阅读,而通过参数列表的不同来区分多个同名函数。

知识点15:continue:


        continue:只能作用于循环结构。继续循环。
        特点:结束本次循环,继续下一次循环。

 

知识点16:break和continue语句


        记住:
        1,break和continue语句作用的范围。
        2,break和continue单独存在时,下面没有任何语句。因为都执行不到。


知识点17:while和do while


        while:先判断条件,只有条件满足才执行循环体。
        do while: 先执行循环体,在判断条件,条件满足,再继续执行循环体。
        简单一句话:do while:无论条件是否满足,循环体至少执行一次。

知识点18:数组的操作:


        获取数组中的元素。通常会用到遍历。    
        组中有一个属性可以直接获取到数组元素个数。

知识点19:面向对象

        三个特征:
        封装,继承,多态      

 以后开发:
        其实就是找对象使用。没有对象,就创建一个对象。
        找对象,建立对象,使用对象。维护对象的关系。

        类就是:
        对现实生活中事物的描述。

        对象:
        就是这类事物,实实在在存在个体。
        属性对应是类中变量,行为对应的类中的函数(方法)。
        其实定义类,就是在描述事物,就是在定义属性和行为。属性和行为共同成为类中的成员(成员变量和成员方法)。
        

知识点20:成员变量和局部变量


        作用范围。
        成员变量作用于整个类中。
        局部变量变量作用于函数中,或者语句中。
        在内存中的位置:
        成员变量:在堆内存中,因为对象的存在,才在内存中存在。
        局部变量:存在栈内存中。

知识点21:匿名对象


        匿名对象使用方式一:当对对象的方法只调用一次时,
        可以用匿名对象来完成,这样写比较简化。
        如果对一个对象进行多个成员调用,必须给这个对象起个名字。
        匿名对象使用方式二:可以将匿名对象作为实际参数进行传递。

 

知识点22:private


        private :私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。
        私有只在本类中有效。
        注意:私有仅仅是封装的一种表现形式。
        在访问方式中加入逻辑判断等语句。对访问的数据进行操作。提高代码健壮性。

知识点23:构造函数


        对象一建立就会调用与之对应的构造函数。

        构造函数的作用:可以用于给对象进行初始化。

        构造函数的小细节:
        当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
        当在类中自定义了构造函数后,默认的构造函数就没有了。

        构造函数和一般函数在写法上有不同。

        在运行上也有不同。
        构造函数是在对象一建立就运行。给对象初始化。
        而一般方法是对象调用才执行,给是对象添加对象具备的功能。

        一个对象建立,构造函数只运行一次。
        而一般方法可以被该对象调用多次。

        什么时候定义构造函数呢?
        当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。

知识点24:构造代码块。


        作用:给对象进行初始化。
        对象一建立就运行,而且优先于构造函数执行。
        和构造函数的区别:
        构造代码块是给所有对象进行统一初始化,
        而构造函数是给对应的对象初始化。
        构造代码快中定义的是不同对象共性的初始化内容。

知识点25:this


        this:看上去,是用于区分局部变量和成员变量同名情况。
        this为什么可以解决这个问题?
        this到底代表的是什么呢?

        this:就代表本类的对象,到底代表哪一个呢?
        this代表它所在函数所属对象的引用。
        简单说:哪个对象在调用this所在的函数,this就代表哪个对象。

        this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
        但凡本类功能内部使用了了本类对象,都用this表示。

        this语句 :用于构造函数之间进行互相调用。
        this语句只能定义在构造函数的第一行。因为初始化要先执行。

知识点26:静态


        静态的应用。
        每一个应用程序中都有共性的功能,
        可以将这些功能进行抽取,独立封装。
        以便复用。

        虽然可以通过建立ArrayTool的对象使用这些工具方法,对数组进行操作。
        发现了问题:
        1,对象是用于封装数据的,可是ArrayTool对象并未封装特有数据。
        2,操作数组的每一个方法都没有用到ArrayTool对象中的特有数据。

        这时就考虑,让程序更严谨,是不需要对象的。
        可以将ArrayTool中的方法都定义成static的。直接通过类名调用即可。

        将方法都静态后,可以方便于使用,但是该类还是可以被其他程序建立对象的。
        为了更为严谨,强制让该类不能建立对象。
        可以通过将构造函数私有化完成。

知识点27:public


        一个类中默认会有一个空参数的构造函数,
        这个默认的构造函数的权限和所属类一致。
        如果类被public修饰,那么默认的构造函数也带public修饰符。
        如果类没有被public修饰,那么默认的构造函数,也没有public修饰。
        默认构造构造函数的权限是随着的类的变化而变化的。

知识点28:对象


    1,java语法(变量,语句,函数,数组),
    2,面向对象(类和对象的关系,封装(机箱故事),继承,多态,构造函数,this,static,内部类,抽象类,接口)
    3,多线程。
    4,JavaApi(其实就是java给我们提供的已经定义好的对象。工具对象:集合框架)
    5,输入输出(IO)
    6,java的图形界面。--事件监听机制。
    7,网络通讯。Socket

知识点29:public static void main(String[] args) 介绍


    主函数:是一个特殊的函数。作为程序的入口,可以被jvm调用。

    主函数的定义:
    public:代表着该函数访问权限是最大的。
    static:代表主函数随着类的加载就已经存在了。
    void:主函数没有具体的返回值。
    main:不是关键字,但是是一个特殊的单词,可以被jvm识别。
    (String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串    类型的数组。

    主函数是固定格式的:jvm识别。

    jvm在调用主函数时,传入的是new String[0];

知识点30:设计模式


    设计模式:解决某一类问题最行之有效的方法。
    java中23种设计模式:
    单例设计模式:解决一个类在内存只存在一个对象。


    想要保证对象唯一。
    1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象
    2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
    3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

    这三部怎么用代码体现呢?
    1,将构造函数私有化。
    2,在类中创建一个本类对象。    
    3,提供一个方法可以获取到该对象。

    对于事物该怎么描述,还怎么描述。
    当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。

知识点31:饿汉式和懒汉式


        是先初始化对象。称为:饿汉式。
    对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。 

知识点32:静态代码块


    静态代码块。格式:
    static
    {    
        静态代码块中的执行语句。
    }

    特点:随着类的加载而执行,只执行一次,并优先于主函数。
    用于给类进行初始化的。

知识点33:static


    静态:static。
    用法:是一个修饰符,用于修饰成员(成员变量,成员函数).
    当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
    还可以直接被类名调用。类名.静态成员。

    static特点:
    1,随着类的加载而加载。
       也就说:静态会随着类的消失而消失。说明它的生命周期最长。

    2,优先于的对象存在
    明确一点:静态是先存在。对象是后存在的。

    3,被所有对象所共享
    4,可以直接被类名所调用。

    实例变量和类变量的区别:
    1,存放位置。
    类变量随着类的加载而存在于方法区中。
    实例变量随着对象的建立而存在于堆内存中。
    2,生命周期:
    类变量生命周期最长,随着类的消失而消失。
    实例变量生命周期随着对象的消失而消失。

    静态使用注意事项:
    1,静态方法只能访问静态成员。
    非静态方法既可以访问静态也可以访问非静态。
    2,静态方法中不可以定义this,super关键字。
    因为静态优先于对象存在。所以静态方法中不可以出现this。
    3,主函数是静态的。
    
    静态有利有弊
    利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存    储一份
    可以直接被类名调用。
    弊端:生命周期过长。
      访问出现局限性。(静态虽好,只能访问静态。)


    
知识点34:什么使用静态?什么时候定义静态函数呢?


    什么使用静态?
    要从两方面下手:
    因为静态修饰的内容有成员变量和函数。
    什么时候定义静态变量(类变量)呢?
    当对象中出现共享数据时,该数据被静态所修饰。
    对象中的特有数据要定义成非静态存在于堆内存中。

    什么时候定义静态函数呢?
    当功能内部没有访问到肺静态数据(对象的特有数据),
    那么该功能可以定义成静态的。

知识点35:抽象


    当多个类中出现相同功能,但是功能主体不同,
    这是可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。

    抽象:看不懂。

    抽象类的特点:
    1,抽象方法一定在抽象类中。
    2,抽象方法和抽象类都必须被abstract关键字修饰。
    3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
    4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用
    如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

    抽象类和一般类没有太大的不同。
    该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。
    这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体。
    通过抽象方法来表示。

    抽象类比一般类多个了抽象函数。就是在类中可以定义抽象方法。
    抽象类不可以实例化。

    特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。

    练习:
    abstract 关键字,和哪些关键字不能共存。
    final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
    private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。
        而抽象方法出现的就是需要被复写。
    static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。
        可是抽象方法运行没意义。

    抽象类中是否有构造函数?
    有,抽象类是一个父类,要给子类提供实例的初始化。

知识点36:继承


    继承:
    1,提高了代码的复用性。
    2,让类与类之间产生了关系。有了这个关系,才有了多态的特性。

    注意:千万不要为了获取其他类的功能,简化代码而继承。
    必须是类与类之间有所属关系才可以继承。所属关系 is a。

    Java语言中:java只支持单继承,不支持多继承。

    因为多继承容易带来安全隐患:当多个父类中定义了相同功能,
    当功能内容不同时,子类对象不确定要运行哪一个。
    但是java保留这种机制。并用另一种体现形式来完成表示。多实现。

    java支持多层继承。也就是一个继承体系
    如何使用一个继承体系中的功能呢?

    想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。
    通过了解共性功能,就可以知道该体系的基本功能。
    那么这个体系已经可以基本使用了。
    那么在具体调用时,要创建最子类的对象,为什么呢?
    一是因为有可能父类不能创建对象,
    二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。
    简单一句话:查阅父类功能,创建子类对象使用功能。

知识点37:子父类出现后,类成员的特点:


    类中成员:
    1,变量。
    2,函数。
    3,构造函数。

    1,变量
    如果子类中出现非私有的同名成员变量时,
    子类要访问本类中的变量,用this
    子类要访问父类中的同名变量,用super。

    super的使用和this的使用几乎一致。
    this代表的是本类对象的引用。
    super代表的是父类对象的引用。

知识点38:子父类中的函数。


    当子类出现和父类一模一样的函数时,
    当子类对象调用该函数,会运行子类函数的内容。
    如同父类的函数被覆盖一样。

    这种情况是函数的另一个特性:重写(覆盖)

    当子类继承父类,沿袭了父类的功能,到子类中,
    但是子类虽具备该功能,但是功能的内容却和父类不一致,
    这时,没有必要定义新功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内    容。

    覆盖:
    1,子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。
    2,静态只能覆盖静态。

    记住大家:
    重载:只看同名函数的参数列表。
    重写:子父类方法要一模一样。

知识点39:子父类中的构造函数。


    在对子类对象进行初始化时,父类的构造函数也会运行,
    那是因为子类的构造函数默认第一行有一条隐式的语句 super();
    super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是    super();

    为什么子类一定要访问父类中的构造函数。

    因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何    对这些数据进行初始化的。
    所以子类在对象初始化时,要先访问一下父类中的构造函数。
    如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

    注意:super语句一定定义在子类构造函数的第一行。

    子类的实例化过程。

    结论:
    子类的所有的构造函数,默认都会访问父类中空参数的构造函数。
    因为子类每一个构造函数内的第一行都有一句隐式super();

    当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。

    当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
    子类中至少会有一个构造函数会访问父类中的构造函数。

知识点40:final 


    final : 最终。作为一个修饰符,
    1,可以修饰类,函数,变量。
    2,被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。
    3,被final修饰的方法不可以被复写。
    4,被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,有可以修饰局部变量
    当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值    起个名字。方便于阅读。
    而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写    ,如果由多个单词组成。
    单词间通过_连接。
    5,内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。

知识点41:接口


    接口:初期理解,可以认为是一个特殊的抽象类
    当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。
    class用于定义类
    interface 用于定义接口。

    接口定义时,格式特点:
    1,接口中常见定义:常量,抽象方法。
    2,接口中的成员都有固定修饰符。
    常量:public static final
    方法:public abstract 
    记住:接口中的成员都是public的。

    接口:是不可以创建对象的,因为有抽象方法。
    需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。
    否则子类是一个抽象类。

    接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。

知识点42:模版方法


    需求:获取一段程序运行的时间。
    原理:获取程序开始和结束的时间并相减即可。

    获取时间:System.currentTimeMillis();

    当代码完成优化后,就可以解决这类问题。

    这种方式,模版方法设计模式。

    什么是模版方法呢?
    在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用    不确定的部分,
    那么这时就将不确定的部分暴露出去。由该类的子类去完成。

知识点43:数据库的操作


    需求:数据库的操作。
    数据是:用户信息。
    1,连接数据库。JDBC  Hibernate
    2,操作数据库。
    c create r read  u update  d delete
    3,关闭数据库连接。

知识点44:多态


    多态:可以理解为事物存在的多种体现形态。

    人:男人,女人

    动物:猫,狗。

    猫 x = new 猫();

    动物 x = new 猫();

    1,多态的体现
    父类的引用指向了自己的子类对象。
    父类的引用也可以接收自己的子类对象。
    2,多态的前提
    必须是类与类之间有关系。要么继承,要么实现。
    通常还有一个前提:存在覆盖。

    3,多态的好处
    多态的出现大大的提高程序的扩展性。

    4,多态的弊端:
    提高了扩展性,但是只能使用父类的引用访问父类中的成员。

    5,多态的应用

知识点45:在多态中成员函数的特点:


    在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
    在运行时期:参阅对象所属的类中是否有调用的方法。
    简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

    在多态中,成员变量的特点:
    无论编译和运行,都参考左边(引用型变量所属的类)。

    在多态中,静态成员函数的特点:
    无论编译和运行,都参考做左边。

知识点46:Object


    Object:是所有对象的直接后者间接父类,传说中的上帝。
    该类中定义的肯定是所有对象都具备的功能。
    Object类中已经提供了对对象是否相同的比较方法。

    如果自定义类中也有比较相同的功能,没有必要重新定义。
    只要沿袭父类中的功能,建立自己特有比较内容即可。这就是覆盖。

知识点47:继承和接口


    继承:
    特点:
        1,提高了代码的复用性。
        2,让类与类之间产生关系,是多态性的前提。

            Java中的继承。
        1,java只支持单继承,不支持多继承。为啥呢?
        答案:因为继承了多个父类如果有相同方法时,子类对象不确定运行哪一个。
        2,Java还支持多层继承。A-->B--->C  原来可以形成继承体系。
            想要使用体系功能,"查阅父类功能,建立子类对象调用功能。"
            注解:父类的由来其实是由事物中的共性内容不断向上抽取而来的                            所以父类中定义的是该体系中的最基本,最共性功能。


    
    继承出现后,代码上也有一些特点:
    1,变量。
        当子父类中定义了相同的名称的成员变量,
        子类要使用父类中的同名变量时,需要使用关键字super来区分。
        一般不会出现这种情况,因为父类中有了,子类不需要定义。
        而且父类定义时,一般变量都私有化。

    2,函数。
        子类可以直接访问父类中非私有的成员函数。
        特殊情况:当子类中定义了与父类一模一样的方法时,会发生覆盖操作。大多指的是非静态方法。
        最终会运行子类的方法,父类相当于被覆盖了。
         函数的另一个特性:覆盖(重写,复写)。

        什么时候用啊?
        当父类的功能要被修改时,不建议修改源码。因为是灾难。只要通过一个类继承原有类,定义一个新的升级后的    功能即可。但是功能是相同的,只是实现方    法改变。这是子类可以沿袭父类中的功能定    义, 并重写功能内容。
        这就是覆盖。

          覆盖很爽,但是有注意事项:
          1,子类覆盖父类时,必须权限要大于等于父类权限。
          2,静态不能覆盖非静态。
            
    3,构造函数。
        构造函数可以本类进行对象初始化,也可以给子类对象进行初始化。
        子类对象初始化过程:
        子类中的所有构造方法都会访问父类中空参数的构造函数,
        因为每一个构造函数的第一行,都有一句隐式的super语句。
        为什么要有这条语句?
        因为子类会获取到父类中的数据,必须要先明确父类对数据的初始化过程。

        当父类中没有空参数构造函数时,子类构造函数必须通过super句来明确要访问的父类中指定的构造函数。

        当时子类构造函数也可以通过this语句访问本类中的构造函数。
        但是子类中肯定,至少有一个构造函数会访问父类。

    
        抽象类:其实就是在分析事物时,事物中的功能有些是不明确的内容的。这些不明确内容就是抽象的。
        可以通过抽象函数来描述。

        抽象函数一定要定义在抽象类中,因为,抽象函数所在类,也必须被抽象标识
        写法特点:
        1,抽象函数只对函数进行声明,没有函数主体。
        2,抽象类和抽象函数都需要用abstract修饰。
        3,抽象类不可以进行实例化。
        4,想要使用抽象功能,必须通过子类覆盖了父类中所有的抽象方法后,才可以对子类实例化。
            如果只覆盖了部分抽象方法,那么子类还是一个抽象类。

        也可以理解为:抽象类是一个父类,是不断向上抽取而来的,
        在抽取过程中,只抽取了方法声明,但没有抽取方法实现。

        抽象类和一半类差不多。
        区别:
        抽象类可以定义抽象方法。
        抽象类不可以建立对象。

        其实抽象类一样用于描述事物,既可以定义抽象方法,也可以定义非抽象方法
    接口
     初期理解:接口看上去是一个特殊的抽象类。里面存的都是抽象方法。

     特点:
     格式:
        1,通过interface来定义。
        2,接口中常见成员:常量,抽象方法。
            而且这些成员都有固定的修饰符。
            常量:public static final
            方法:public abstract 
        3,接口中的成员都是共有的。
        4,一个类可以对接口进行多实现,也弥补了多继承带来的安全隐患,所以                java对多继承进行了改良。
            用多实现方法来体现多继承的特性。
        5,一个类可以继承一个类的同时,实现多个接口。
        6,接口与接口之间是继承关系,而且可以多继承。


    应用特点:
        1,接口是对外暴露的规则。
        2,接口是功能的扩展。
        3,接口的出现降低了耦合性。
        别忘了说的时候,需要举例。如usb。pci,主板。插座。


    抽象类和接口异同:
    相同:
    1,都可以在内部定义抽象方法。
    2,通常都在顶层。
    3,都不可以实例化,都需要子类来实现。

    不同点:
    1,抽象类中可以定义抽象方法和非抽象方法,
    而接口中只能定义抽象方法。
    2,接口的出现可以多实现。
    抽象类只能单继承。
    也就是说:接口的出现避免了单继承的局限性。
    3,继承和实现的关系不一致。继承:is a,实现:like a 

知识点48:异常


    异常:就是程序在运行时出现不正常情况。
    异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述    。
    并封装成对象。其实就是java对不正常情况进行描述后的对象体现。

    对于问题的划分:两种:一种是严重的问题,一种非严重的问题。

    对于严重的,java通过Error类进行描述。
    对于Error一般不编写针对性的代码对其进行处理。

    对与非严重的,java通过Exception类进行描述。
    对于Exception可以使用针对性的处理方式进行处理。

    无论Error或者Exception都具有一些共性内容。
    比如:不正常情况的信息,引发原因等。

    Throwable
        |--Error
        |--Exception

    2,异常的处理

    java 提供了特有的语句进行处理。
    try
    {
    需要被检测的代码;
    }
    catch(异常类 变量)
    {
    处理异常的代码;(处理方式)
    }
    finally
    {
    一定会执行的语句;
    }


    3,对捕获到的异常对象进行常见方法操作。
    String getMessage():获取异常信息。
    在函数上声明异常。
    便于提高安全性,让调用出进行处理。不处理编译失败。


    对多异常的处理。

    1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
    2,对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
    如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。


    建立在进行catch处理时,catch中一定要定义具体处理方式。
    不要简单定义一句 e.printStackTrace(),
    也不要简单的就书写一条输出语句。

知识点49:自定义异常


    因为项目中会出现特有的问题,
    而这些问题并未被java所描述并封装对象。
    所以对于这些特有的问题可以按照java的对问题封装的思想。
    将特有的问题。进行自定义的异常封装。

    自定义异常。

    需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的。
    那么就需要对这个问题进行自定义的描述。

    当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
    要么在内部try catch处理。
    要么在函数上声明让调用者处理。

    一般情况在,函数内出现异常,函数上需要声明。

    发现打印的结果中只有异常的名称,却没有异常的信息。
    因为自定义的异常并未定义信息。

    如何定义异常信息呢?
    因为父类中已经把异常信息的操作都完成了。
    所以子类只要在构造时,将异常信息传递给父类通过super语句。
    那么就可以直接通过getMessage方法获取自定义的异常信息。

    自定义异常:
    必须是自定义类继承Exception。

    继承Exception原因:
    异常体系有一个特点:因为异常类和异常对象都被抛出。
    他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。

    只有这个体系中的类和对象才可以被throws和throw操作。

    throws和throw的区别
    throws使用在函数上。
    throw使用在函数内。

    throws后面跟的异常类。可以跟多个。用逗号隔开。
    throw后跟的是异常对象。

知识点50:RuntimeException 


    Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常。
    
    如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过。

    如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;

    之所以不用在函数声明,是因为不需要让调用者处理。
    当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后
    对代码进行修正。

    自定义异常时:如果该异常的发生,无法在继续进行运算,
    就让自定义异常继承RuntimeException。

    对于异常分两种:
    1,编译时被检测的异常。
    
    2,编译时不被检测的异常(运行时异常。RuntimeException以及其子类)

知识点51:内部类的访问规则:


    1,内部类可以直接访问外部类中的成员,包括私有。
    之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式     外部类名.this
    2,外部类要访问内部类,必须建立内部类对象。

    访问格式:
    1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
    可以直接建立内部类对象。
    格式
    外部类名.内部类名  变量名 = 外部类对象.内部类对象;
    Outer.Inner in = new Outer().new Inner();

    2,当内部类在成员位置上,就可以被成员修饰符所修饰。
    比如,private:将内部类在外部类中进行封装。
        static:内部类就具备static的特性。
        当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问    局限。

        在外部其他类中,如何直接访问static内部类的非静态成员呢?
        new Outer.Inner().function();

        在外部其他类中,如何直接访问static内部类的静态成员呢?
        uter.Inner.function();

    注意:当内部类中定义了静态成员,该内部类必须是static的。
          当外部类中的静态方法访问内部类时,内部类也必须是static的。

    当描述事物时,事物的内部还有事物,该事物用内部类来描述。
    因为内部事务在使用外部事物的内容。

    内部类定义在局部时,
    1,不可以被成员修饰符修饰
    2,可以直接访问外部类中的成员,因为还持有外部类中的引用。
    但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。

知识点52:匿名内部类:


    1,匿名内部类其实就是内部类的简写格式。
    2,定义匿名内部类的前提:
    内部类必须是继承一个类或者实现接口。
    3,匿名内部类的格式:  new 父类或者接口(){定义子类的内容}
    4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。
    可以理解为带内容的对象。
    5,匿名内部类中定义的方法最好不要超过3个。

知识点53:finally代码块


    finally代码块:定义一定执行的代码。
    通常用于关闭资源。

知识点54: finally代码块三个格式:

 

   第一个格式:
    try
        {
    
        }
    catch ()
    {
    }

    第二个格式:
    try
    {
    
    }
    catch ()
    {
    }
    finally
    {

    }

    第三个格式:
    try
    {
    
    }
    finally
    {
    }


    记住一点:catch是用于处理异常。如果没有catch就代表异常没有被处理过,
    如果该异常是检测时异常。那么必须声明。

  

  class Demo
    {
    public void method()
    {
        try
        {
            throw new Exception();
        }
        finally
        {
            //关资源。
        }
    }
    }

知识点55:异常在子父类覆盖中的体现


    1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常    或者该异常的子类。
    2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
    3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
    如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。

知识点56:import.


    为了简化类名的书写,使用一个关键字,import.
    import 导入的是包中的类。
    建议,不要写通配符 * ,需要用到包中的哪个类,就导入哪个类。

知识点57:异常:


    异常:
    是什么?是对问题的描述。将问题进行对象的封装。
    ------------
    异常体系:
    Throwable
        |--Error
        |--Exception
            |--RuntimeException

    异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。
                也就是说可以被throw和throws关键字所操作。
                只有异常体系具备这个特点。


    --------------
    throw和throws的用法:

    throw定义在函数内,用于抛出异常对象。
    throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。


    当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,都在编译    失败。
    注意,RuntimeException除外。也就说,函数内如果抛出的RuntimeExcpetion异常,    函数上可以不用声明。
    --------------


    如果函数声明了异常,调用者需要进行处理。处理方法可以throws可以try。

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

异常处理语句:
    try
    {
    需要被检测的代码;
    }
    catch ()
    {
    处理异常的代码;
    }
    finally
    {
    一定会执行的代码;
    }

    有三个结合格式:
    1.    try
    {
        
    }
    catch ()
    {
    }

    2.    try
    {
        
    }
    finally
    {
    
    }


    3.    try
    {
        
    }
    catch ()
    {
    }
    finally
    {
    
    }


    注意:
    1,finally中定义的通常是 关闭资源代码。因为资源必须释放。
    2,finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。

    --------------

    自定义异常:
    定义类继承Exception或者RuntimeException
    1,为了让该自定义类具备可抛性。
    2,让该类具备操作异常的共性方法。

    当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
    异常异常信息传递给父类的构造函数。

    class MyException extends Exception
    {
        MyException(String message)
        {
            super(message);
        }
    }

    自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装。
    --------------

    异常的好处:
    1,将问题进行封装。
    2,将正常流程代码和问题处理代码相分离,方便于阅读。


    异常的处理原则:
    1,处理方式有两种:try 或者 throws。
    2,调用到抛出异常的功能时,抛出几个,就处理几个。
        一个try对应多个catch。
    3,多个catch,父类的catch放到最下面。
    4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。
        也不要不写。
        当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
 

       try
        {
            throw new AException();
        }
        catch (AException e)
        {
            throw e;
        }

        如果该异常处理不了,但并不属于该功能出现的异常。
        可以将异常转换后,在抛出和该功能相关的异常。

        或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,
        当调用者知道。并处理。也可以将捕获异常处理后,转换新的异常。
    

    try
        {
            throw new AException();
        }
        catch (AException e)
        {
            // 对AException处理。
            throw new BException();
        }

        比如,汇款的例子。

    
    异常的注意事项:
    在子父类覆盖时:
    1,子类抛出的异常必须是父类的异常的子类或者子集。
    2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

    参阅
    ExceptionTest.java 老师用电脑上课
    ExceptionTest1.java 图形面积。

知识点58:死锁


    同步中嵌套同步。


知识点59:单例设计模式饿汉式和懒汉式


  

 //饿汉式。
    /*
    class Single
    {
    private static final Single s = new Single();
    private Single(){}
    public static Single getInstance()
    {
        return s;
    }
    }
    */


    //懒汉式
    class Single
    {
    private static Single s = null;
    private Single(){}


    public static  Single getInstance()
    {
        if(s==null)
        {
            synchronized(Single.class)
            {
                if(s==null)
                    //--->A;
                    s = new Single();
            }
        }
        return s;
    }
    }

    class SingleDemo 
    {
    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
    }
    }

知识点60:如果同步函数被静态修饰后,使用的锁是什么呢?


    通过验证,发现不在是this。因为静态方法中也不可以定义this。

    静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
    类名.class  该对象的类型是Class

    静态的同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class

知识点61:同步函数用的是哪一个锁呢?


    函数需要被对象调用。那么函数都有一个所属对象引用。就是this。
    所以同步函数使用的锁是this。

    通过该程序进行验证。

    使用两个线程来买票。
    一个线程在同步代码块中。
    一个线程在同步函数中。
    都在执行买票动作。

知识点62:进程和线程


    进程:是一个正在执行中的程序。
    每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元
    线程:就是进程中的一个独立的控制单元。
        线程在控制着进程的执行。

    一个进程中至少有一个线程。

    Java VM  启动的时候会有一个进程java.exe.

    该进程中至少一个线程负责java程序的执行。
    而且这个线程运行的代码存在于main方法中。
    该线程称之为主线程。

    扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程。

    1,如何在自定义的代码中,自定义一个线程呢?

    通过对api的查找,java已经提供了对线程这类事物的描述。就Thread类。

    创建线程的第一种方式:继承Thread类。
    步骤:
    1,定义类继承Thread。
    2,复写Thread类中的run方法。
    目的:将自定义代码存储在run方法。让线程运行。

    3,调用线程的start方法,
    该方法两个作用:启动线程,调用run方法。

    发现运行结果每一次都不同。
    因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。
    明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)
    cpu在做着快速的切换,以达到看上去是同时运行的效果。
    我们可以形象把多线程的运行行为在互相抢夺cpu的执行权。

    这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。

    为什么要覆盖run方法呢?

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

    也就是说Thread类中的run方法,用于存储线程要运行的代码。

知识点63:


    线程间通讯:
    其实就是多个线程在操作同一个资源,
    但是操作的动作不同。

知识点64:等待和唤醒


    wait:
    notify();
    notifyAll();

    都使用在同步中,因为要对持有监视器(锁)的线程操作。
    所以要使用在同步中,因为只有同步才具有锁。

    为什么这些操作线程的方法要定义Object类中呢?
    因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁,
    只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。
    不可以对不同锁中的线程进行唤醒。

    也就是说,等待和唤醒必须是同一个锁。

    而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。

知识点65:join:


    当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。

    join可以用来临时加入线程执行。

知识点66:run方法


    stop方法已经过时。

    如何停止线程?
    只有一种,run方法结束。
    开启多线程运行,运行代码通常是循环结构。

    只要控制住循环,就可以让run方法结束,也就是线程结束。


    特殊情况:    
    当线程处于了冻结状态。
    就不会读取到标记。那么线程就不会结束。

    当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
    强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。

    Thread类提供该方法 interrupt(); 

知识点67:进程和线程


    进程:正在执行的程序。

    线程:是进程中用于控制程序执行的控制单元(执行路径,执行情景)

    进程中至少有一个线程。

    对于JVM,启动时,只好有两个线程:jvm的主线程。jvm的垃圾回收线程。

    如何在程序中自定义线程呢?

    Java给我们提供了对象线程这类事物的描述。该类是Thread

    该类中定义了,
    创建线程对象的方法(构造函数).
    提供了要被线程执行的代码存储的位置(run())

    还定义了开启线程运行的方法(start()).
    同时还有一些其他的方法用于操作线程:
    static Thread currentThead():
    String getName():
    static void sleep(time)throws InterruptedException:


    要运行的代码都是后期定义的。
    所以创建线程的第一种方式是:继承Thread类。
    原因:要覆盖run方法,定义线程要运行的代码。

    步骤:
    1,继承Thread类。
    2,覆盖run方法。将线程要运行的代码定义其中。
    3,创建Thread类的子类对象,其实就是在创建线程,调用start方法。

    如果自定义的类中有多线程要运行的代码。但是该类有自己的父类。
    那么就不可以在继承Thread。怎么办呢?

    Java给我们提供了一个规则。Runnable接口。
    如果自定义类不继承Thread,也可以实现Runnable接口。
    并将多线程要运行的代码存放在Runnable的run方法中。
    这样多线程也可以帮助该类运行。
    这样的操作有一个好处:避免了单继承的局限性。

    创建线程的第二种方式:实现Runnable接口。

    步骤:
    1,定义了实现Runnable接口。
    2,覆盖接口的run方法。将多线程要运行的代码存入其中。
    3,创建Thread类的对象(创建线程),并将Runnable接口的子类对象
    作为参数传递给Thread的构造函数。
    为什么要传递?因为线程要运行的代码都在Runnable子类的run方法中存储。
    所以要将该run方法所属的对象
    传递给Thread。让Thread线程去使用该对象调用其run方法。
    4,调用Thread对象的start方法。开启线程。

    动手写代码。
    两种方式的特点:
    实现方式,因为避免了单继承的局限性,所以创建线程建议使用第二种方式。
    ##############################
    #第一重点:创建线程的两种方式#
    ##############################
    作为了解:
    线程的状态。
    1,被创建。
    2,运行。
    3,冻结。
    4,消亡。

    其实还有一种特殊的状态:临时状态。

    该临时状态的特点:
    具备了执行资格,但不具备执行权。

    冻结状态的特点:
    放弃了执行资格。

    多线程具备随机性。因为是由cpu不断的快速切换造成的。

    就有可能会产生多线程的安全问题。

    问题的产生的原因:
    几个关键点:
    1,多线程代码中有操作共享数据。
    2,多条语句操作该共享数据。

    当具备两个关键点时,
    有一个线程对多条操作共享数据的代码执行的一部分。
    还没有执行完,另一个线程开始参与执行。
    就会发生数据错误。

    解决方法:
    当一个线程在执行多条操作共享数据代码时,其他线程即使获取了执行权,
    也不可以参与操作。

    Java就对这种解决方式提供了专业的代码。
    同步
    同步的原理:就是将部分操作功能数据的代码进行加锁。

    示例:火车上的卫生间。

    同步的表现形式:
    1,同步代码块。
    2,同步函数。
    两者有什么不同:
    同步代码块使用的锁是任意对象。
    同步函数使用的锁是this。

    注意:对于static的同步函数,使用的锁不是this。是 类名.class 是该类的字节码文件对象。
    涉及到了单例设计模式的懒汉式。

    同步的好处:解决了线程的安全问题。

    弊端:
    较为消耗资源。
    同步嵌套后,容易死锁。

    要记住:同步使用的前提:
    1,必须是两个或者两个以上的线程。
    2,必须是多个线程使用同一个锁。
    这是才可以称为这些线程被同步了。

    死锁代码一定会写。但开发时一定注意避免。

    ##############################
    #第二重点:同步的所有特性    #
    ##############################

知识点68:基本数据类型对象包装类

    byte    Byte
    short    short
    int        Integer
    long    Long
    boolean Boolean
    float    Float
    double    Double
    char    Character

    基本数据类型对象包装类的最常见作用,
    就是用于基本数据类型和字符串类型之间做转换

    基本数据类型转成字符串。

    基本数据类型+""

    基本数据类型.toString(基本数据类型值);

    如: Integer.toString(34);//将34整数变成"34";


    字符串转成基本数据类型。

    xxx a = Xxx.parseXxx(String);

    int a = Integer.parseInt("123");

    double b = Double.parseDouble("12.23");

    boolean b = Boolean.parseBoolean("true");

    Integer i = new Integer("123");

    int num = i.intValue();

    十进制转成其他进制。
 

   toBinaryString();
    toHexString();
    toOctalString();

    其他进制转成十进制。

    parseInt(string,radix);

知识点69:StringBuffer


    StringBuffer是字符串缓冲区。

    是一个容器。
    特点:
    1,长度是可变化的。
    2,可以字节操作多个数据类型。
    3,最终会通过toString方法变成字符串。

    C create U update R read D delete

    1,存储。
    StringBuffer append():将指定数据作为参数添加到已有数据结尾处。
    StringBuffer insert(index,数据):可以将数据插入到指定index位置。


    2,删除。
    StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
    StringBuffer deleteCharAt(index):删除指定位置的字符。
    
    3,获取。
    char charAt(int index) 
    int indexOf(String str) 
    int lastIndexOf(String str) 
    int length() 
    String substring(int start, int end) 
 
    4,修改。
    StringBuffer replace(start,end,string);
    void setCharAt(int index, char ch) ;


    5,反转。
    StringBuffer reverse();
 
    6,
    将缓冲区中指定数据存储到指定字符数组中。
    void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 

    
    JDK1.5 版本之后出现了StringBuilder.

    StringBuffer是线程同步。
    StringBuilder是线程不同步。

    以后开发,建议使用StringBuilder

    升级三个因素:
    1,提高效率。
    2,简化书写。
    3,提高安全性。

知识点70:String类


    String类适用于描述字符串事物。
    那么它就提供了多个方法对字符串进行操作。

    常见的操作有哪些?
    "abcd"

    1,获取。
    1.1 字符串中的包含的字符数,也就是字符串的长度。
        int length():获取长度。
    1.2 根据位置获取位置上某个字符。
        char charAt(int index):
    1.3 根据字符获取该字符在字符串中位置。
        int indexOf(int ch):返回的是ch在字符串中第一次出现的位置。
        int indexOf(int ch, int fromIndex) :从fromIndex指定位置开始,获取ch在字符串中出现的位置。

        int indexOf(String str):返回的是str在字符串中第一次出现的位置。
        int indexOf(String str, int fromIndex) :从fromIndex指定位置开始,获取str在字符串中出现的位置。

        int lastIndexOf(int ch) :

        
    2,判断。
    2.1 字符串中是否包含某一个子串。
        boolean contains(str):
        特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1.表示该str不在字符串中存在。
                所以,也可以用于对指定判断是否包含。
                if(str.indexOf("aa")!=-1)

                而且该方法即可以判断,有可以获取出现的位置。

    2.2 字符中是否有内容。
        boolean isEmpty(): 原理就是判断长度是否为0. 
    2.3 字符串是否是以指定内容开头。
        boolean startsWith(str);
    2.4 字符串是否是以指定内容结尾。
        boolean endsWith(str);
    2.5 判断字符串内容是否相同。复写了Object类中的equals方法。
        boolean equals(str);
    2.6 判断内容是否相同,并忽略大小写。
        boolean equalsIgnoreCase();


    3,转换。
    3.1 将字符数组转成字符串。
        构造函数:String(char[]) String(char[],offset,count):将字符数组中的一部分转成字符串。

        静态方法:
                static String copyValueOf(char[]);
                static String copyValueOf(char[] data, int offset, int count) 

                static String valueOf(char[]):

        
    3.2 将字符串转成字符数组。**
        char[] toCharArray():

    3.3 将字节数组转成字符串。
            String(byte[])
            String(byte[],offset,count):将字节数组中的一部分转成字符串。

    3.4 将字符串转成字节数组。
            byte[]  getBytes():
    3.5 将基本数据类型转成字符串。
        static String valueOf(int)
        static String valueOf(double)

        //3+"";//String.valueOf(3);

        特殊:字符串和字节数组在转换过程中,是可以指定编码表的。

    4,替换
    String replace(oldchar,newchar);

    5,切割
    String[] split(regex);

    6,子串。获取字符串中的一部分。
    String substring(begin);
    String substring(begin,end);

    7,转换,去除空格,比较。
    7.1 将字符串转成大写或则小写。
         String toUpperCase();
         String toLowerCase();

    7.2 将字符串两端的多个空格去除。
        String trim();

    7.3 对两个字符串进行自然顺序的比较。
        int compareTo(string);

知识点71:字符串思路

    1,模拟一个trim方法,去除字符串两端的空格。
        思路:
        1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。
        结尾处判断空格也是如此。
        2,当开始和结尾都判断到不是空格时,就是要获取的字符串。

    2,将一个字符串进行反转。将字符串中指定部分进行反转,"abcdefg";abfedcg
        思路:
        1,曾经学习过对数组的元素进行反转。
        2,将字符串变成数组,对数组反转。
        3,将反转后的数组变成字符串。
        4,只要将或反转的部分的开始和结束位置作为参数传递即可。

知识点72:多线程


    1,线程间通信。
    等待/唤醒机制。

    也就是常见的生产者消费者问题。

    1.当多个生产者消费者出现时,
    需要让获取执行权的线程判断标记。
    通过while完成。

    2.需要将对方的线程唤醒。
    仅仅用notify,是不可以的。因为有可能出现只唤醒本方。
    有可能会导致,所有线程都等待。
    所以可以通过notifyAll的形式来完成 。

    这个程序有一个bug。就是每次notifyAll。都会唤醒本方。
    可不可以只唤醒对方呢?

    JDK1.5版本提供了一些新的对象,优化了等待唤醒机制。

    1,将synchronized 替换成了Lock接口。
    将隐式锁,升级成了显示锁。
    Lock
        获取锁:lock();
        释放锁:unlock();注意:释放的动作一定要执行,所以通常定义在finally中。
        获取Condition对象:newCondition();
    2,将Object中的wait,notify,notifyAll方法都替换成了Condition的await,signal,signalAll。
    和以前不同是:一个同步代码块具备一个锁,该所以具备自己的独立wait和notify方法。
    现在是将wait,notify等方法,封装进一个特有的对象Condition,而一个Lock锁上可以有多个Condition对象。


  

  Lock lock = new ReentrantLock();

    Condition conA = lock.newCondition();
    Condition conB = lock.newCondition();

    con.await();//生产,,消费

    con.signal();生产


    set()
    {
        if(flag)
            conA.await();//生产者,
        code......;

        flag = true;
        conB.signal();
    }
    
    out()
    {
        if(!flag)
            conB.await();//消费者

        code....;
        flag = false;
        conA.signal();
    }

    wait和sleep的区别:
    wait:释放cpu执行权,释放同步中锁。
    sleep:释放cpu执行权,不释放同步中锁。


    synchronized(锁)
    {
    wait();
    }

    停止线程:
    stop过时。
    原理:run方法结束。run方法中通常定义循环,指定控制住循环线程即可结束。

    1,定义结束标记。
    2,当线程处于了冻结状态,没有执行标记,程序一样无法结束。
        这时可以循环,正常退出冻结状态,或者强制结束冻结状态。
        强制结束冻结状态:interrupt();目的是线程强制从冻结状态恢复到运行状态。
        但是会发生InterruptedException异常。

    线程中一些常见方法:
    setDaemon(boolean):将线程标记为后台线程,后台线程和前台线程一样,开启,一样抢执行    权运行,
    只有在结束时,有区别,当前台线程都运行结束后,后台线程会自动结束。

    join():什么意思?等待该线程结束。当A线程执行到了B的.join方法时,A就会处于冻结状态。
            A什么时候运行呢?当B运行结束后,A就会具备运行资格,继续运行。

    加入线程,可以完成对某个线程的临时加入执行。

    多线程重点:
    1,多线程的创建的两种方式,以及区别。

    2,
    同步的特点。
    同步的好处:
    同步的弊端:
    同步的前提:
    同步的表现形式以及区别。
    特例:static同步函数锁是哪一个。

    死锁代码要求写的出来。


    3,线程间通信,看以上总结。


    4,wait和sleep,  yield:临时暂停,可以让线程是释放执行权。


知识点73:集合框架


    Collection定义了集合框架的共性功能。
    1,添加
    add(e);
    addAll(collection);

    2,删除
    remove(e);
    removeAll(collection);
    clear();

    3,判断。
    contains(e);
    isEmpty();

    4,获取
    iterator();
    size();

    5,获取交集。
    retainAll();

    6,集合变数组。
    toArray();

    1,add方法的参数类型是Object。以便于接收任意类型对象。

    2,集合中存储的都是对象的引用(地址)


    什么是迭代器呢?
    其实就是集合的取出元素的方式。
    如同抓娃娃游戏机中的夹子。

    迭代器是取出方式,会直接访问集合中的元素。
    所以将迭代器通过内部类的形式来进行描述。
    通过容器的iterator()方法获取该内部类的对象。

知识点74:Set和HashSet:


    |--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
    |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
            HashSet是如何保证元素唯一性的呢?
            是通过元素的两个方法,hashCode和equals来完成。
            如果元素的HashCode值相同,才会判断equals是否为true。
            如果元素的hashcode值不同,不会调用equals。

            注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。


    |--TreeSet:

    Set集合的功能和Collection是一致的。

知识点75:LinkedList:特有方法:


    addFirst();
    addLast();

    getFirst();
    getLast();
    获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

    removeFirst();
    removeLast();
    获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

    在JDK1.6出现了替代方法。

    offerFirst();
    offerLast();

    peekFirst();
    peekLast();
    获取元素,但不删除元素。如果集合中没有元素,会返回null。

    pollFirst();
    pollLast();
    获取元素,但是元素被删除。如果集合中没有元素,会返回null。

知识点76:堆栈和队列


    使用LinkedList模拟一个堆栈或者队列数据结构。
    堆栈:先进后出  如同一个杯子。
    队列:先进先出 First in First out  FIFO 如同一个水管。

知识点77:List和Set


    Collection
    |--List:元素是有序的,元素可以重复。因为该集合体系有索引。
        |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍    慢。线程不同步。
        |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不        同步。
        |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。


    |--Set:元素是无序,元素不可以重复。、


    List:
    特有方法。凡是可以操作角标的方法都是该体系特有的方法。

    增
    add(index,element);
    addAll(index,Collection);

    删
    remove(index);

    改
    set(index,element);
    查
    get(index):
    subList(from,to);
    listIterator();
    int indexOf(obj):获取指定元素的位置。
    ListIterator listIterator();

    List集合特有的迭代器。ListIterator是Iterator的子接口。

    在迭代时,不可以通过集合对象的方法操作集合中的元素。
    因为会发生ConcurrentModificationException异常。

    所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
    只能对元素进行判断,取出,删除的操作,
    如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

    该接口只能通过List集合的listIterator方法获取。

知识点78:枚举


    枚举就是Vector特有的取出方式。
    发现枚举和迭代器很像。
    其实枚举和迭代是一样的。

    因为枚举的名称以及方法的名称都过长。
    所以被迭代器取代了。
    枚举郁郁而终了。

知识点79:泛型


    泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。

    好处
    1.将运行时期出现问题ClassCastException,转移到了编译时期。,
    方便于程序员解决问题。让运行时问题减少,安全。,

    2,避免了强制转换麻烦。


    泛型格式:通过<>来定义要操作的引用数据类型。

    在使用java提供的对象时,什么时候写泛型呢?

    通常在集合框架中很常见,
    只要见到<>就要定义泛型。

    其实<> 就是用来接收类型的。

    当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

    //泛型类定义的泛型,在整个类中有效。如果被方法使用,
    //那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
    //为了让不同方法可以操作不同类型,而且类型还不确定。
    //那么可以将泛型定义在方法上。
    特殊之处:
    静态方法不可以访问类上定义的泛型。
    如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

知识点80:通配符


    ? 通配符。也可以理解为占位符。
    泛型的限定;
    ? extends E: 可以接收E类型或者E的子类型。上限。
    ? super E: 可以接收E类型或者E的父类型。下限

知识点81:HashSet和TreeSet


    Set:无序,不可以重复元素。
    |--HashSet:数据结构是哈希表。线程是非同步的。
                保证元素唯一性的原理:判断元素的hashCode值是否相同。
                如果相同,还会继续判断元素的equals方法,是否为true。

    |--TreeSet:可以对Set集合中的元素进行排序。
                底层数据结构是二叉树。
                保证元素唯一性的依据:
                compareTo方法return 0.

                TreeSet排序的第一种方式:让元素自身具备比较性。
                元素需要实现Comparable接口,覆盖compareTo方法。
                也种方式也成为元素的自然顺序,或者叫做默认顺序。

                TreeSet的第二种排序方式。
                当元素自身不具备比较性时,或者具备的比较性不是所需要的。
                这时就需要让集合自身具备比较性。
                在集合初始化时,就有了比较方式。

    需求:
    往TreeSet集合中存储自定义对象学生。
    想按照学生的年龄进行排序。

    记住,排序时,当主要条件相同时,一定判断一下次要条件。

知识点82:比较器


    当元素自身不具备比较性,或者具备的比较性不是所需要的。
    这时需要让容器自身具备比较性。
    定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

    当两种排序都存在时,以比较器为主。

    定义一个类,实现Comparator接口,覆盖compare方法。

知识点83:Map集合


    Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
    1,添加。
        put(K key, V value) 
        putAll(Map<? extends K,? extends V> m) 

    2,删除。
        clear() 
        remove(Object key) 

    3,判断。
        containsValue(Object value) 
        containsKey(Object key) 
        isEmpty() 


    4,获取。
        get(Object key) 
        size() 
        values() 

        entrySet() 
        keySet() 

    Map
    |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
    |--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高
    |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。


    和Set很像。
    其实大家,Set底层就是使用了Map集合。

知识点84:map集合的两种取出方式:


    1,Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
    所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
        

    Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。


    2,Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
                而这个关系的数据类型就是:Map.Entry

                Entry其实就是Map中的一个static内部接口。
                为什么要定义在内部呢?
                因为只有有了Map集合,有了键值对,才会有键值的映射关系。
                关系属于Map集合中的一个内部事物。
                而且该事物在直接访问Map集合中的元素。

知识点85:Arrays和asList


    Arrays:用于操作数组的工具类。
    里面都是静态方法。
    asList:将数组变成list集合

知识点86:集合框架的工具类


    Collections:集合框架的工具类。里面定义的都是静态方法。

    Collections和Collection有什么区别?
    Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
        它有两个常用的子接口,
        List:对元素都有定义索引。有序的。可以重复元素。
        Set:不可以重复元素。无序。
    
    Collections是集合框架中的一个工具类。该类中的方法都是静态的
        提供的方法中有可以对list集合进行排序,二分查找等方法。
        通常常用的集合都是线程不安全的。因为要提高效率。
        如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。

知识点87:集合变数组


    Collection接口中的toArray方法。

知识点88:高级for循环


    格式:
    for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)
    {
    
    }

    对集合进行遍历。
    只能获取集合元素。但是不能对集合进行操作。

    迭代器除了遍历,还可以进行remove集合中元素的动作。
    如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。

    传统for和高级for有什么区别呢?

    高级for有一个局限性。必须有被遍历的目标。

    建议在遍历数组的时候,还是希望是用传统for。因为传统for可以定义脚标。

知识点89:方法的可变参数


    JDK1.5版本出现的新特性。

    方法的可变参数。
    在使用时注意:可变参数一定要定义在参数列表最后面。

知识点90:StaticImport  静态导入


    当类名重名时,需要指定具体的包名。
    当方法重名是,指定具备所属的对象或者类。

知识点91:字符流和字节流


    字节流两个基类:
    InputStream   OutputStream

    字符流两个基类:
    Reader Writer

    先学习一下字符流的特点。

    既然IO流是用于操作数据的,
    那么数据的最常见体现形式是:文件。

    那么先以操作文件为主来演示。

    需求:在硬盘上,创建一个文件并写入一些文字数据。

    找到一个专门用于操作文件的Writer子类对象。
    FileWriter。  后缀名是父类名。 前缀名是该流对象的功能。

知识点92:Runtime对象


    该类并没有提供构造函数。
    说明不可以new对象。那么会直接想到该类中的方法都是静态的。
    发现该类中还有非静态方法。
    说明该类肯定会提供了方法获取本类对象。而且该方法是静态的,并返回值类型是本类类型。
    由这个特点可以看出该类使用了单例设计模式完成。

    该方式是static Runtime getRuntime();

知识点93:输入输出


    System:类中的方法和属性都是静态的。
    out:标准输出,默认是控制台。
    in:标准输入,默认是键盘。

    描述系统一些信息。

    获取系统属性信息:Properties getProperties();

知识点94:字符读取流缓冲区


    该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。
    当返回null时,表示读到文件末尾。
    readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

    缓冲区的出现是为了提高流的操作效率而出现的。

    所以在创建缓冲区之前,必须要先有流对象。

    该缓冲区中提供了一个跨平台的换行符。
    newLine();


知识点95:字符流和字节流


    字符流:


    FileReader
    FileWriter。

    BufferedReader
    BufferedWriter

    字节流:


    InputStream  OutputStream

    需求,想要操作图片数据。这时就要用到字节流。
    复制一个图片.
    读取键盘录入。
    System.out:对应的是标准输出设备,控制台。
    System.in:对应的标准输入设备:键盘。
    需求:
    通过键盘录入数据。
    当录入一行数据后,就将该行数据进行打印。
    如果录入的数据是over,那么停止录入。

知识点96:装饰和继承


    MyReader//专门用于读取数据的类。
    |--MyTextReader
        |--MyBufferTextReader
    |--MyMediaReader
        |--MyBufferMediaReader
    |--MyDataReader
        |--MyBufferDataReader

    class MyBufferReader
    {    
    MyBufferReader(MyTextReader text)
    {}
    MyBufferReader(MyMediaReader media)
    {}
    }
    上面这个类扩展性很差。
    找到其参数的共同类型。通过多态的形式。可以提高扩展性。

    class MyBufferReader extends MyReader
    {
    private MyReader r;
    MyBufferReader(MyReader r)
    {}
    }    


    MyReader//专门用于读取数据的类。
    |--MyTextReader
    |--MyMediaReader
    |--MyDataReader
    |--MyBufferReader


    以前是通过继承将每一个子类都具备缓冲功能。
    那么继承体系会复杂,并不利于扩展。

    现在优化思想。单独描述一下缓冲内容。
    将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。
    这样继承体系就变得很简单。优化了体系结构。

    装饰模式比继承要灵活。避免了继承体系臃肿。
    而且降低了类于类之间的关系。

    装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
    所以装饰类和被装饰类通常是都属于一个体系中的。

知识点97:File类常见方法:


    1,创建。


    boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false
    和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

    boolean mkdir():创建文件夹。
    boolean mkdirs():创建多级文件夹。


    2,删除。


    boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
    void deleteOnExit();在程序退出时删除指定文件。


    3,判断。


    boolean exists() :文件是否存在.
    isFile():
    isDirectory();
    isHidden();
    isAbsolute();

    4,获取信息。


    getName():
    getPath():
    getParent():

    getAbsolutePath() 
    long lastModified() 
    long length() 

知识点98:JavaFileList


    列出指定目录下文件或者文件夹,包含子目    录中的内容。
    也就是列出指定目录下所有内容。

    因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
    在列出过程中出现的还是目录的话,还可以再次调用本功能。
    也就是函数自身调用自身。
    这种表现形式,或者编程手法,称为递归。

    递归要注意:
    1,限定条件。

    2,要注意递归的次数。尽量避免内存溢出。

 

知识点99:PrintStreamDemo


    打印流:


    该流提供了打印方法,可以将各种数据类型的数据都原样打印。

    字节打印流:


    PrintStream
    构造函数可以接收的参数类型:
    1,file对象。File
    2,字符串路径。String
    3,字节输出流。OutputStream

    字符打印流:


    PrintWriter
    构造函数可以接收的参数类型:
    1,file对象。File
    2,字符串路径。String
    3,字节输出流。OutputStream
    4,字符输出流,Writer。

知识点100:PropertiesDemo


    Properties是hashtable的子类。
    也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。

    是集合中和IO技术相结合的集合容器。

    该对象的特点:可以用于键值对形式的配置文件。

    那么在加载数据时,需要数据有固定格式:键=值。

知识点101:RemoveDir


    删除一个带内容的目录。
    删除原理:
    在window中,删除目录从里面往外删除的。
    既然是从里往外删除。就需要用到递归。

知识点102:RunCount


    用于记录应用程序运行次数。
    如果使用次数已到,那么给出注册提示。

    很容易想到的是:计数器。
    可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。
    可是随着该应用程序的退出,该计数器也在内存中消失了。

    下一次在启动该程序,又重新开始从0计数。
    这样不是我们想要的。

    程序即使结束,该计数器的值也存在。
    下次程序启动在会先加载该计数器的值并加1后在重新存储起来。

    所以要建立一个配置文件。用于记录该软件的使用次数。

    该配置文件使用键值对的形式。
    这样便于阅读数据,并操作数据。

    键值对数据是map集合。
    数据是以文件形式存储,使用io技术。
    那么map+io -->properties.

    配置文件可以实现应用程序数据的共享。

 

知识点103:ByteArrayStream


    用于操作字节数组的流对象。

    ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。

    ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。
    这就是数据目的地。

    因为这两个流对象都操作的数组,并没有使用系统资源。
    所以,不用进行close关闭。

    在流操作规律讲解时:

    源设备,
    键盘 System.in,硬盘 FileStream,内存 ArrayStream。
    目的设备:
    控制台 System.out,硬盘FileStream,内存 ArrayStream。

    用流的读写思想来操作数据。

知识点104:DataInputStream与DataOutputStream


    可以用于操作基本数据类型的数据的流对象。

知识点105:EncodeDemo


    编码:字符串变成字节数组。

    解码:字节数组变成字符串。

    String-->byte[];  str.getBytes(charsetName);

    byte[] -->String: new String(byte[],charsetName);

知识点106:RandomAccessFile


    该类不是算是IO体系中子类。
    而是直接继承自Object。

    但是它是IO包中成员。因为它具备读和写功能。
    内部封装了一个数组,而且通过指针对数组的元素进行操作。
    可以通过getFilePointer获取指针位置,
    同时可以通过seek改变指针的位置。

    其实完成读写的原理就是内部封装了字节输入流和输出流。

    通过构造函数可以看出,该类只能操作文件。
    而且操作文件还有模式:只读r,,读写rw等。

    如果模式为只读 r。不会创建文件。会去读取一个已存在文件,
    如果该文件不存在,则会出现异常。
    如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。

知识点107:GUI


    import java.awt.*;
    import java.awt.event.*;


    创建图形化界面:


    1,创建frame窗体。
    2,对窗体进行基本设置。
    比如大小,位置,布局。
    3,定义组件。
    4,将组件通过窗体的add方法添加到窗体中。
    5,让窗体显示,通过setVisible(true)


    事件监听机制的特点:


    1,事件源。
    2,事件。
    3,监听器。
    4,事件处理。

    事件源:就是awt包或者swing包中的那些图形界面组件。
    
    事件:每一个事件源都有自己特有的对应事件和共性事件。

    监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。

    以上三者,在java中都已经定义好了。
    直接获取其对象来用就可以了。

    我们要做的事情是,就是对产生的动作进行处理。

知识点108:编码


    汉字的默认编码gbk。
    所以一个汉字两个字节。都是负数。
    只有判断最后一个字节是否是负数。
    如果是,就往前继续看有多少负数。如果是偶数个,不舍弃。
    如果是奇数个,即舍弃最后一个字节。

知识点109:网络架构:


    C/S:Client/Server


    客户端,服务端。
    特点:
    1,需要在客户端和服务端都需要按照编写的软件。
    2,维护较麻烦。
    好处:可以减轻服务端的压力,如网络游戏。

    B/S:Browser/Server


    浏览器 ,服务端。
    1,客户端不用单独编写软件。
    因为客户端用的就是浏览器。
    2,对于软件升级,只要考虑服务端即可。

    弊端:所有的程序都运行在服务端,客户端的浏览器毕竟解析能力较弱。对游戏等。

知识点110:正则表达式:


    正则表达式:符合一定规则的表达式。
    作用:用于专门操作字符串。
    特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
    所以学习正则表达式,就是在学习一些特殊符号的使用。

    好处:可以简化对字符串的复杂操作。
    弊端:符号定义越多,正则越长,阅读性越差。


    具体操作功能:

    1,匹配:String  matches方法。用规则匹配整个字符串,
    只要有一处不符合规则,就匹配结束,返回false。
    
    2,切割:String split();

    3,替换:String replaceAll(regex,str);如果regex中有定义组,
    可以在第二参数中通过$符号获取正则表达式中的已有的组。

    4,获取:将字符串中的符合规则的子串取出。

    操作步骤:


    1,将正则表达式封装成对象。
    2,让正则对象和要操作的字符串相关联。
    3,关联后,获取正则匹配引擎。
    4,通过引擎对符合规则的子串进行操作,比如取出。

发布了148 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/liu17234050/article/details/104376632