zoukankan      html  css  js  c++  java
  • java 学习

     

    1.java语言的特点

      1.java语言是纯面向对象的语言。

      2.平台无关性。

      3.提供很多内置的类库,简化程序设计,造好轮子。

      4.对web应用的开发的支持。servlet和jsp开发web应用程序,socket分布式应用程序。

      5.具有较好的安全性和健壮性,防止恶意代码攻击的安全机制(数组边界检测和bytecode校验)、java的强类型机制、垃圾回收器、异常处理和安全检查机制使得java语言具有很好的健壮性

    2.java与c++的异同

      java与c++都是面向对象语言(java 封装、继承、多态、抽象)

      1.java是解释性语言,程序源代码经过java编译器编译成字节码,然后由jvm解释执行。c++是编译型语言,源代码经过编译和链接后生成可执行的二进制代码,java速度慢但是跨平台执行。

      2.java 纯面向对象的语言,所有代码(函数、变量)必须在类中实现、除基本数据类型(int、float),所有类型都是类,java语言中不存在全局变量或者全局函数,c++兼具面向对象和面向过程的特点,可以定义全局变量和全局函数。

      3.java中没有指针。

      4.java不支持多重继承,可以同时实现多个接口,接口具有多态特性,java通过多个接口来实现类似多重继承的特点。

      5.java 垃圾回收器

    java 不支持运算符重载,没有预处理功能,提供import机制类似预处理功能,不支持默认函数参数,java不提供goto语句(goto为保留字),不支持强制类型转化,由开发人员显示的强制类型转化。java具有平台无关性,每种数据都分配固定长度

    3.public static void main(String[] args) java 程序的入口方法,jvm在运行程序时,首先查找main()方法,其中public是权限修饰符,表明任何类或对象都可以访问这个方法,static 表明main()方法是一个静态方法,方法中代码存储在静态存储区内,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问。直接通过类名.main()直接访问,jvm在启动时就按照上述方法的签名(必须有public与圣拓陶瓷修饰,返回值为void,而且方法的参数为字符串数组)来查找方法的入口地址,若找到则执行,找不到就报错

    public static void main(String[] args)

    static public void main(String[] args)

    public static final void main(String[] args)

    static public synchronized void main(String[] args)

    4. 静态块在类被加载前是就会被调用,因此在mian()方法执行前

    5.java程序初始化顺序,当实例化对象时,对象所在的类的所有成员变量首先要初始化,只有当所有类成员完成初始化后,才会调用对象所在的类的构造器函数创建对象。

    1.静态对象(变量)优先于非静态对象(变量)初始化,静态对象只初始化一次,非静态对象可能会初始化很多次。2.父类优先于子类进行初始化。3。按照成员变量的定义顺序进行初始化,即使变量定义散布于方法定义之中,他们依然在任何方法(构造函数)被调用之前先初始化。

    6.作用域

    作用域与可见性 当前类 同一package 子类 其他package
    public

     √
    protected  ×

    default

    ×  ×
    private × ×  ×

     7.一个java文件中可以定义多个类,最多只能一个类被public修饰,并且这个类的类名与文件名必须相同,若这个文件中没有public类,则文件名随便是一个类的名字即可,当用javac指令编译这个.java 文件时,它会给每个类生成一个对应的.class文件

    8.构造函数

    1.构造函数必须与类名相同,不能有返回值(返回值也不能为void)

    2.每个类可以有多个构造函数,默认无参构造器,提供了构造器,就不会创建默认的无参构造器

    3.构造器可以有0,1或者1个以上的参数

    4.构造函数总是伴随着new操作一起调用,必须是系统调用。构造函数在对象实例化时会被自动调用,只运行一次,普通的方法是在程序执行时被调用,可以被调用多次

    5.构造函数的作用:对象的初始化工作

    6.构造函数不能被继承,不能覆盖,能够重载,使用不同的参数个数或者参数类型来定义多个构造函数

    7.子类通过super关键字来显式调用父类的构造函数,当父类没有提供无参数的构造函数时,子类的构造函数中必须显式的调用父类的构造函数,如果父类提供了无参数的构造函数,此时子类的构造函数可以不用显式的调用父类的构造函数,在这种情况下编译器会默认调用父类提供的无参数的构造函数,当有父类时,在实例化对象时先执行父类的构造函数,然后执行子类的构造函数。

    8.当父类和子类都没有定义构造函数时,编译期会为父类生成一个默认的无参数的构造器函数,给子类生成一个默认的无参数的构造函数。默认的构造器修饰符只跟当前类的修饰符有关(当一个类定义为public,构造函数也是public)

    9.接口

    接口 :抽象方法定义的集合,特殊的抽象类,接口中包含方法的定义,没有方法的实现。接口中成员的作用于修饰符都是public,接口中常量值默认使用 public static final 修饰。

     10

    java在处理基本数据类型(int,double),采用按值传递(传递的是输入参数的复制)的方法执行,除此之外的其他类型都是按照引用传递(传递的对象的一个引用)的方式执行。对象除了在函数调用时是引用传递,在使用=也是引用传递

    new一个变量的时候对象真正在堆区,栈上保存了一个指向堆区存放该对象内存的地址。函数调用的时候传递引用也就是传递这个地址的一个拷贝,通过这个地址值可以修改这个地址在堆区的内容。

    11.java反射

    得到一个对象所属的类,获取一个所有成员变量和方法,在运行时创建对象,在运行时调用对象的方法

    Class c = Class.forName("javase.demo1.Sub");
    Base b = (Base)c.newInstance();

    java创建对象:1.通过new实例化对象。2.通过反射机制创建对象。 通过clone方法。通过反序列化方式。

    12 java通过接口实现类似c语言的函数指针功能。

    先定义接口,接口中声明要调用的方法,实现这个接口,把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,实现回调函数的功能。

    2.2java 面向对象

    1.抽象,抽象忽略一个主题中与目标无关的那些方面,过程抽象和数据抽象

    2.继承,继承是一种连接类的层次模型,允许和鼓励类的重用,他提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,此过程称为类继承。新类继承了原始类的特性。派生类可以从它的基类哪里继承方法和实例便令,并且派生类可以修改或增加新的方法使之适合特殊的需要

    3.封装,封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以将自己的数据金额方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

    4.多态,多态指允许不同的类的对象对同一消息作出响应。多态包括参数化多态和包含多态。

    2.4继承

    1.java不支持多重继承,但可以通过过个接口来实现多重继承的目的

    2.子类只能继承父类的非私有的成员变量和方法。

    3.子类中定义的成员变量和父类定义的成员变量同名时,子类的成员变量会覆盖父类的成员变量而不会继承。

    4.子类中的方法与父类中的方法有相同的函数签名(相同的方法名,形同的参数个数与类型),子类覆盖父类的方法,不会继承。

    2.5 多态

    表现形式:

    1.方法的重载。重载是指一个类中有多个同名的方法,但这些方法有不同的参数,在编译时就可以确定到底调用哪个方法,他是一种编译时多态。重载可以看做一个类中的方法的多态性。

    2.方法的覆盖。子类可以覆盖父类的方法。

    成员变量是无法实现多态的,成员变量的值取父类还是子类并不取决于创建对象的类型,而是取决于所定义的变量的类型。

    Base b = new Derived() 取Base类型的成员变量。

    编译时多态通过方法的重载实现的,运行时多态方法的覆盖(子类覆盖父类)实现的

    2.7 重载和覆盖

    重载是在一个类中多态性的表现,是指在一个类中定义了多个同名的方法,他们或有不同的参数个数或者有不同的参数类型

    1.重载是通过不同的方法参数来区分的,不同的参数个数、不同的参数类型或者不同的参数顺序。

    2.不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。

    3.对于继承来说,如果基类方法的访问权限为private,那么就不能在其的派生类中对其重载,如果派生类中也定义了一个同名函数,这只是一个新的方法,不会达到重载的效果。

    覆盖是指派生类函数覆盖基类的函数。覆盖一个方法并对其重写,以达到不同的作用

    1.派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数。

    2.派生类中的覆盖方法的返回值必须和基类中覆盖方法的返回值相同。

    3.派生类覆盖方法所抛出的异常必须和基类中覆盖的方法抛出的异常一致。

    4.基类中被覆盖的方法不能为private,否则只是在子类中定义了一个方法,并没有对其覆盖。

    覆盖是子类和父类之间的关系,重载是一个类中方法之间的关系

    覆盖要求参数列表相同,重载要求参数列表不同。

    覆盖关系中,调用方法是根据对象的类型来决定,重载关系中根据调用时的实参表与形参表来选择方法体的

    2.8 抽象类和接口

    一个类中包含抽象方法,这个类就是抽象类。可以通过把类或者类中的某些方法声明为abstract来表示一个类是抽象类(abstract只能修饰类或者方法,不能修饰属性)。接口止一个方法的集合,接口中所有方法没有方法体,接口通过interface实现的。

    抽象类和接口都是支持抽象类定义的两种机制。只要包含一个抽象方法的类就是必须声明为抽象类,抽象类可以声明方法的存在而不去实现它,被声明为抽象的方法不能包含方法体。在实现时,必须包含相同或者更低的访问级别。抽象类在使用过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。抽象类的子类为父类中所有抽象方法提供具体的实现,否则他们也是抽象类。。接口中所有方法都是抽象的,通过抽象实现多重继承。接口中成员变量都是static final 类型。

    接口和抽象类相同点:

    1.都不能实例化。2.接口的实现类或者抽象类的子类都只有实现了接口或者抽象类的方法后才能被实例化。

    不同点:

    1.接口中只有定义,方法不能再接口中实现,只有实现接口的类才能实现接口中定义的方法,抽象类可以有定义与实现,方法可以在抽象类中被实现。

    2.接口需要实现,抽象类只能被继承。一个类可以实现多个接口,但是一个类只能继承一个抽象类,接口可以实现多重继承的目的。

    3.接口中定义的成员变量默认为 public static final 只能够有静态的不能被修改的数据成员,而且必须给其赋初值,其所有成员方法都是public abstract的,只能被这两个关键字修饰。

    2.9 内部类

    将一个类定义到另一个类的内部,在类里面的这个类就叫做内部类,外面的类就叫做外部类。内部类可看做外部类的一个成员(与类的属性和方法类似),还有一种类称为顶层类,类定义代码不嵌套在其他类定义中的类

    内部类分为四种:静态内部类,成员内部类,局部内部类和匿名内部类

     静态内部类被指声明为static的内部类,他可以不依赖于外部类实例而被实例化,而通常的内部类需要在外部类实例化后才能被实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类的静态成员和静态方法。

    一个静态内部类,去掉static关键字,称为成员内部类。成员内部类为非静态内部类,他可以自由的引用外部类的属性和方法,无论这些属性和方法是静态还是非静态的。只有外部的类被实例化后,这个内部类才能被实例化。非静态内部类中不能有静态成员。

    局部内部类是指定义在一个代码块中的类,就像局部变量一样,不能被public、protected、private、static修饰,只能访问定义为final类型的局部变量。

    匿名内部类是一种没有类名的内部类,不使用关键字class,extends ,implements .没有构造函数,他必须继承其他类或实现其他接口。匿名内部类不能有构造函数。匿名内部类不能定义静态成员、方法、类,匿名内部类不能是public、protected、private、static,只能创建匿名内部类的一个实例,一个匿名内部类一定是在new的后面,这个匿名内部类必须继承一个父类或者实现一个接口,匿名内部类为局部内部类

    2.10  获取父类名字

    this.getClass().getSuperClass().getName()

    2.11 this 与 super

    xpd123

    子类构造函数 需要显示调用父类构造函数时候,super()必须为构造函数的第一条语句。

    4.3.1 标识符

    标识符只能由字母、数字、下划线和$组成,标识符第一个字符是字母、下划线或者$

    4.3.3 final ,finally,finalize

    1.final 声明属性、方法和类,分别表示属性不可变、方法不可覆盖和类不能被继承(不能派生出新的子类)

     实例变量:变量归对象所有(实例化对象才可以)。每当实例化一个对象时候,会创建一个副本并初始化,如果没有显示初始化,初始化一个默认值,各个对象中的实例变量互不影响。

    局部变量:在方法中定义的变量,在使用之前必须初始化。

    类变量:用static 可修饰的属性、变量归类所有,只有类被加载,这个变量就可以被使用(类名、变量名)。所有实例化对象共享类变量。

    final 变量:表示这个变量是常量,不能被修改

    对于变量 static final修饰,一旦赋值就不可修改,对于方法,static final修饰,方法不可覆盖

     4.3.6  switch

    switch  用于分支选择switch(express) express只能是一个枚举常量(内部也是由整型或字符类型实现)或者一个整数表达式,整数表达式可以是基本类型int或者其对应的包装类Integer,byte,short char h和枚举类型

    jdk1.7 switch 支持string类型(本质是int 类型值匹配)

    4.4.1 java 基本数据类型

    数据类型 字节长度 范围 默认值 包装类
    int 4 -231~221-1 Integer 
     short -32768~32767   Short
    long  8 -263~263-1  0L或者0l   Long
     byte 1  -128~127 Byte 
    float   32位IEEE754单精度范围 0.0f   Float
    doubel   8  64位IEEE754单精度范围  0.0   Double
     char  2 Unicode[0,65535]   u0000  Character
     boolean true或者false  false   Bollean

    int 长度数据类型:byte(8 bit) 、short(16 bit)、int(32 bit)、long(64 bit)

    float 长度数据类型: 单精度(32 bit float)、双精度(64 bit double)

    Boolean类型变量的取值(true,false)

    char 数据类型;unicode字符(16 bit)

    4.4.3

    值传递和引用传递

    1.值传递

    方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有相同的值,但有不同的存储单元,对形参的改变不会影响实参的值

    2.引用传递

    方法调用时,传递的是对象(看做是对象的地址),形参与实参的对象指向同一块存储单元,对形参的修改会影响实参的值。

      java语言中,原始数据类型传递参数时按照按值传递,包装类型在传递参数时按照引用传递。

    4.5.1 字符串创建与存储

    1.String s1 = new String("abc") 语句与 String s2 = new String("abc") 语句时候,存在两个引用对象s1,s2两个内容相同的字符串对象“abc”,它们在内存中的地址是不同的,只要用到new总会生成新的对象。

    2.String s1 = "abc" 语句与String s2 = "abc" 语句,在jvm中存在一个字符串池,其中保存着很多得String 对象,并且可以被共享使用,s1,s2引用是同一常量池的对象。由于String 的实现采用了Flyweight的设计模式,

    String s1 = "abc";

    String s2 = "abc";

    String s3 = new String("abc");

    String s4 = new String("abc");

     4.5.3

    String 不可变类,StringBuilder与StringBuffer类似,可变类,字符串缓冲区,StringBuilder不是线程安全的

    在执行效率,StringBuilder>StringBuffer>String

    4.5.4

    数组是指相同类型的数据集合。具有固定的长度,并且在内存中占据连续的空间。java中数组就是对象。每个数据类型都有对应的类型

     4.5.5

    数组初始化

    1.int[] a = new int[5]; //动态创建了一个包含5个整型值的数组,默认初始化为0;

    2.int[] a = {1,2,3,4,5}; //声明了一个数组类型变量并且初始化

    4.5.6

    java 数组中提供了length属性来获取数组的长度,length() j计算字符串的长度

    4.6 异常处理

    4.6.1 finally块作用是为了保证无论出现什么情况,finally块里的代码一定会被执行。由于程序执行return就以为结束对当前函数的调用并跳出这个函数体,因此任何语句执行都只能在return前执行,因此finally块里的代码也是在return前执行的,finally块里的代码是在return前执行的,对于基本类型数据,在finally块中改变return的值对返回值没有任何影响,而对引用类型的数据有影响

    finally 不一定会执行

    1.进入try语句块之前就出现异常,会直接结束,不会执行finally在块中的代码

    2.try 块中强制退出不会执行finally块中的代码

    4.6.2 异常处理

    异常是指程序运行时所发生的非正常情况或错误,当程序违法了语义规则时,jvm就会出现的错误表示为一个异常并抛出。这个遗产可以再catch程序块中进行捕获,然后处理

    Throwable 做我所有异常的父类,异常分为为error和exception两大类。

    error 运行异常,错误不可恢复,属于jvm层次严重错误,导致程序终止执行。

    exception 可恢复的异常,检查异常和运行异常

     检查异常:IO异常和SQL异常,异常发生在编译阶段,java编译器强制程序去捕获此次类型的异常。

    异常发生后并不会导致程序出错,程序依赖于不可靠的外部条件。

    运行时异常 NullPointerException(空指针异常)、ClassCastException(类型转换异常)、ArrayIndexOutOfBoundsException(数组越界异常)、ArrayStoreException(数组存储异常)、BufferOverflowException(缓冲区溢出异常)、ArithmeticException(算术异常),出现运行异常后,系统会将异常往上层抛出,知道遇到处理代码为止,若没有处理块,则抛出到最上层。如果不对运行时异常处理,后果很严重,一旦发生,要么线程终止,要么主程序终止。

    捕获异常时,先捕获子类,在捕获基类

    2.尽早抛出异常,同事对捕获异常处理

    3.根据需求自定义异常类。

    4.异常不能处理就抛出

    4.7.1 IO

    字节流和字符流

    字节流以字节(8bit)为单位,InputStream(输入流)和OutputStream(输出流)

    字符流以字符(16bit)为单位,Reader(输入流)和Writer(输出流)

    字符流和字节流区别:字节流在处理输入输出时不会用到缓存,字符流用到了缓存

     4.7.2 管理文件和目录

    4.7.3  socket

    面向连接的socket通信协议(TCP)和面向无连接的Socket通信协议(UDP)

     4.8.1

    java 平台独立性

    平台独立性 中间码和java虚拟机。java程序编译后不是生成能在硬件平台上可执行的代码,而是生成一个中间码

    4.8.3 jvm 加载class文件的原理

    JAVA语言是一种具有动态性解释型语言,类(class)只有被加载到jvm中后才能运行,当运行指定程序时,jvm会将编译生成的。class文件按照需求和一定的规则加载到内存中,并组织成一个完整的java应用程序。这个加载过程由类加载器来完成的,classloader和它的子类来实现的。类加载器本身也是一个类,其实质是吧类文件从硬盘读取到内存中。

    4.9.1

    list queue set stack 继承collection 接口

    set 集合中元素不能重复,存入set的每个元素必须定义equals() 方法来确保对象的唯一性。接口实现类:Hash-Set 和TreeSet ,TreeSet 实现了SortSet接口,treeset容器中的元素是有序的

    List 有序的collection,它按对象进入的顺序保存对象。它能对列表中的每个元素的插入和删除位置都进行精准的控制,保存重复对象,LinkedList ArrayList 都实现了list接口。

    Map  从键映射到值的数据结构,保存键值对,值可以重复。键是唯一的不可以重复。

    迭代器 是一个对象,他的工作是遍历并且选择序列中的对象,它提供了一种访问一个容器对象中的各个元素,而又不暴露该对象内部细节的方法,

    9.3 ArrayList   Vector   LinkedList  

    ArrayList Vector 都是存储元素Object[] array 来实现的,它们会在内存中开辟一块连续的空间来存储,因此支持用下标来访问元素,索引数据的速度比较快。ArrayList 异步使用不是线程安全

    4.9.4  HashMap 常用map 根据键的hashcode值来存储数据,根据键值可以获取它的值,较快的访问速度

    1.HashMap是HashTable 的轻量级实现(非线程安全),实现了Map接口,主要区别:HashMap允许空键值。

    2.HashMap把HashTable的contains方法去掉,改成了containsValue和containsKey,

    3.HashTable的方法是线程安全的,HashMap不是线程安全的

    4.都采用hash算法

    5.HashTable,hash数组默认为11,增加的方式是old*2+1,HashMap中,hash数组的默认大小为16,而且一定是2的指数

    HashTable上下文中,同步意味着在一个时间点只能由一个线程可以修改hash表,任何线程在执行HashTable的更新操作前都需要获取对象锁,其他线程等待锁的释放

    4.9.6  Collection和Collections

    Collection 集合接口,提供了对集合对象进行基本操作的通用接口方法,实现该接口的有List和Set

    Collections 集合类的包装类,提供了一系列静态方法以实现对各种集合的搜索、排序和线程安全化等操作

    4.10.1

    线程是指程序在执行过程中,执行程序代码的一个执行单元,线程状态:运行、就绪、挂起和结束。

    进程是指一段正在执行的程序,线程称为轻量级进程,程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间以及一些进程级资源,各个线程拥有自己的栈空间

    程序的执行都是以进程为单位的,每个进程中都会有多个线程互不影响并发执行的

    1.使用多线程可以减少程序的响应时间,在单线程情况下,影响其他操作

    2.与进程相比,线程的创建和切换开销更小。启动一个新的线程必须给这个线程分配独立的地址空间,建立许多数据结构来维护线程代码段和数据段等信息。运行于同一进程的线程共享代码段、数据段,线程的启动或者切换的开销比进程要少很多。多线程在数据分享方面效率非常高。

    3.使用多线程简化程序的结构,使程序便于理解和维护。

    4.10.2

    同步和异步

    多线程的环境中,数据共享的问题,多个线程需要访问同一个资源时,需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,否则,程序的运行结果将会不可预料,在这种情况下必须对数据同步,多个线程同时对同一数据进行写操作,当线程a使用某个资源时,如果这个资源正在被线程b使用,同步机制会让线程a一直等待下去,直到线程b结束对该资源的使用后,线程a才能使用这个资源,同步机制保证资源的安全。

    实现同步操作,获得每一个线程对象的锁。获得它可以保证在同一时刻只有一个线程能够进入临界区,并且这个锁被释放之前,其他线程就不能再进入这个临界区。如果还有其他线程要获得该对象的锁,只能进入等待队列等待。只有当拥有该对象所的线程退出临界区,锁才会被释放,等待队列中优先级最高的线程才能获得该锁,进入共享代码区。

    实现同步方式:利用同步代码块来实现同步,利用同步方法实现同步

    4.10.3 实现多线程

    1.继承Thread类,重写run方法

    2.实现Runnable 接口,实现该接口的run方法

     4.10.4 run方法和start方法

    系统通过调用县城类start方法启动一个线程,此线程处于就绪状态,而非运行状态,线程可以被jvm来调度执行。在调度的过程中,jvm通过调用县城类的run()方法来完成实际的操作。run方法结束后,线程就会终止

    如果值机调用线程类的run方法,当做一个普通的函数调用,程序中仍然有主线程这一个线程,start方法能够异步的调用run的方法,但是直接调用run方法确实同步的,无法达到多线程的目的。】】

    4.10.5 多线程同步

    1.synchronized 

    没大哥对象都有一个对象锁与之相关联,该锁表明对象在任何时候只被一个线程所拥有,当一个线程调用对象的一段synchronized代码时候,需要先获取这个锁后执行相应的代码,执行结束后,释放锁。

    2.wait方法和notify方法

    当时用synchronized来修饰摸个共享资源时,如果线程a1在执行synchronized代码,一个线程a2也要同时执行同一对象的同一synchronized代码时,线程a2将要等到线程a1执行完成后,才能继续执行。在此情况下使用wait和notify方法

     4.10.6  sleep方法与wait方法

    sleep方法使线程暂停执行一段时间的方法。wait方法使线程暂停执行的方法,线程交互时候,如果线程对一个同步对象x发出一个wait调用申请,该线程会暂停执行,被调对象进入等待状态,知道被唤醒或者等待时间超时。

    1.原理不同,sleep方法是Thread类的静态方法,线程来控制自身流程的,它会使次线程暂停执行一段时间,而把执行机会让给其他线程,等到计时时间一道,次线程会自动苏醒。例如,当线程执行报时功能,每一秒钟打印一个时间,那么此时就需要在打印方法前面加上一个sleep方法,以便让自己每隔1s执行一次,该过程如同闹钟一样。而wait方法是object类的方法,由于线程间通信,这个方法会使当前拥有该对象所的进程等待,其他线程低啊用notify方法才醒来,不高开发人员也可以给它指定一个时间,自动醒来。与wait方法配套的方法还有notify方法和notifyall方法。

    2.对锁的处理机制不同。由于sleep方法的主要作用让线程暂停执行一段时间,时间一到则自动恢复,不涉及线程间的通信,因此,调用sleep方法的主要作用让线程暂停执行一段时间,时间一到则自动恢复,不涉及线程间的通信,因此,调用sleep方法不会释放锁。而wait方法则不同,调用wait方法后,线程会释放它所占用的锁,,从而使线程所在对象中的其他synchronized数据可被别的线程使用。

    3.使用区域不同。wait方法特殊意义,因此它必须放在同步控制方法或者同步语句块中使用,sleep方法可以放在任何地方使用。

    sleep方法必须捕获异常,wait方法、notify方法以及notifyall方法不需要捕获异常。在sleep的过程中,有可能被其他对象调用它的interrupt,产生interruptedException异常。

    sleep方法与yield方法

    sleep方法给其他线程运行机会时不考虑线程的优先级,一次会给低优先级的线程以运行的机会,yield方法只会给相同优先级或者更高优先级的线程以运行的机会

    2.线程执行sleep方法转入阻塞状态,执行sleep方法的线程在指定的时间内肯定不会被执行。而yield方法只是使当前线程重现回到可执行状态,所以执行yield方法的线程可能进入到可执行状态后又被执行。

    3.sleep方法声明抛出了InterruptedException ,yield方法没有声明任何异常

    4.10.7  终止线程方法

    使用stop方法与suspend方法来终止线程的执行,当用Thread.stop 来终止线程时候,它会释放已经锁定的所有监视资源,如果当前任何一个受这些监视资源保护的对象处于一个不一致的状态,其他线程将会看到这个不一致的状态,这可能会导致程序执行的不确定性。。调用suspend 方法容易发生死锁。

    一般采用让线程执行结束后进入dead状态。一个线程进入dead状态,即执行完run方法,也就是说,如果想要停止一个线程的执行,就要提供某种方式额昂线程能够自动结束run方法的执行。在实现时候可以设置一个flag标志来控制循环是否执行,通过这种方法让线程离开run方法从而终止线程。

    4.11.1 jdbc

    用于java程序中实现数据库操作的功能,执行sql语句、访问各种数据库的方法,并以各种不容的数据库提供统一的操作接口

    1.加载jdbc驱动器,加载包

    2.加载驱动,注册到DriverManager,一般使用反射Class.forName

    3.建立数据库链接,取得connecttion对象。DriverManager.getConnection(url,username,passwd)方法实现

    4.创建Statement对象或者PreparedStatement对象

    5.执行sql语句

    6。访问结果集ResultSet对象

    7.关闭对象,释放资源。

    4.11.2 

    一个事物是由一条或者多条对数据库操作的sql语句所组成的一个不可分割的工作单元,只有当事务中所有操作都正常执行完了,整个事务才会被提交给数据库。在jdbc中,一般通过commit方法或者rollback方法来结束事务的操作。其中commit方法表示完成对事务的提交,rollback表示完成事务的回滚,事务默认操作是自动提交,操作完成后,系统自动调用commit方法,否则将调用rollback方法】、

    setAutoCommit(false)方法禁止自动提交

    jdbc有哪些事务隔离级别

     5.1 servlet 与 jsp 

    5.1.1页面请求的工作流程

    一个web应用程序一般都是由客户端程序与服务端程序两部分组成。客户端主要是指用户和浏览器,用户可以通过浏览器查找所需的资源,而这些资源则位于服务器上。

    浏览器:1.完成与服务器端的交互。2.完成html语言的解析。从而实现把用户需要查看的资源信息以直观的形式展现出来。服务端用来接受客户端发来的请求,并对该请求进行处理,找到客户端请求的资源,最后把查到的资源返回给客户端。这些资源包括HTML页面。图片音频视频

    5.1.2 get和post请求

    get请求:从服务器端获取用户所需资源。并将其作为响应返回客户端。get方法主要用来获取服务端资源信息,如同数据库中的查询操作,不会影响到资源自身状态。例如删除、修改或者新增是不可以的。post方法提供了比get方法更强大的功能,除了从服务端获取资源外,还可以上服务端上传数据

    1.get方法向服务器上传数据,一般将数据添加到url后面,并且两者用?链接,各个变量之间用&链接由于url长度存在限制,上传的数据量很小,post方法传送数据量大

    2.get方法存在安全隐患。

    5.1.3 servlet

    servlet java语言编写的服务端程序,余星雨web服务器中的servlet容器中,提供请求、响应的web服务模式,可以生成动态的web内容

    优点:1较好的移植性无需修改代码就可以部署到多种不同类型的web服务器上

    2.执行效率高。由于cgi针对每个请求都会创建一个进程来处理,servlet针对每个请求创建一个线程来执行,创建的线程比创建进程的开销要小,servlet在交互过程中有更短的响应时间,响应效率更高

    3.功能强大 servlet可以与web服务器进行交互

    4.使用方便。servlet提供了非常有用的接口来读取或者设置http头消息,处理cookie和跟踪回话状态

    5.可扩展性强

    用户通过单击一个连接来向servlet发起请求

    web服务器接受到该请求后,会把请求交给相应的容器来处理,容器发现这是对servlet发起的请求后,容器会创建两个对象:HttpServletResponse和HttpServletRequest

    容器根据请求消息中的url消息来找到对应的servlet,然后针对该请求创建一个单独的线程.

     5.1.4  dopost方法与doget方法

    web容器处理http请求的流程看出,最终的请求交给servlet来处理,servlet通过调用service方法处理请求的,service方法根据不同的请求类型分别调用dopost方法或doget方法来处理用户请求。当http请求中的method属性为get时候,调用doget请求,method属性为post时,调用dopost请求

    5.1.5servlet生命周期

    servlet运行在容器中,没有main方法,因此,整个生命周期都是由容器来控制的

    servlet生命周期:未创建状态与初始化状态。inti(),service() 和destroy方法

    init方法是servlet的生命的起点,用于创建或者打开人户与servlet相关的资源以及执行初始化工作。service方法是servlet中真正处理客户端传过来的请求的方法,根据http请求的方法(get,post等)将请求分发到doget,dopost方法,destroy方法释放任何在init方法中打来的与servlet相关的资源。

    servlet生命周期 加载、创建、初始化、处理客户请求和卸载

    1.加载:容器通过类加载器使用servlet类对应的文件来加载servlet

    2.创建:通过调用servlet的构造函数来创建一个servlet实例

    3.初始化:通过调用servldeinit方法来完成初始化工作。这个党阀是在servlet已被创建但向客户端提供服务之前调用的。需要注意的是,init方法只会被调用一次。

    4.处理客户请求:servlet一旦被创建之后,他就可以为客户端提供服务了。每当有新的客户请求到来时,容器都会创建一个新的线程来处理该请求,接着会调用servlet的service方法来完成客户端的请求。当然,service方法会根据请求的method属性值的不同调用决定是调用doget方法还是dopost方法来完成具体的响应。

    5.卸载。容器在servlet之前调用destroy方法,让servlet自己释放其占用的系统资源,一旦destroy方法被调用,容器不会像servlet发送任何请求的消息了。如果容器需要这个servlet。就必须重新创建并初始化一个实例。destroy方法只会被调用一次。

     5.1.6 jsp 优点嵌入Java代码的html文件

    jsp可以看做一个特殊的servlet,它只不过是对servlet的扩展,只要是jsp可以完成的工作,servlet可以完成】

    servlet的实现形式就是在java中嵌入html代码,编写和修改html非常不方便,适合做流程控制和业务处理。jsp的实现形式就是在html中嵌入java代码,比较适合页面的显示

    servlet没有内置对象,jsp中的内置对象都是必须通过httpservletRequest、httpServletResponse对象以及Httpservlet对象得到

     5.1.8  mvc 

    model view controller 

    模型层实现系统中的业务逻辑,可以javabean或者ejb来实现。视图层用于用户的交互,jsp来实现。控制层则是模型与视图之间沟通的桥梁。

    1.模型(业务逻辑层)

    模型表示企业数据和业务逻辑,他是应用程序的主体部分。业务流程的处理过程对其它层来说是黑箱操作,模型接收视图请求数据,并返回最终的处理结果。业务模型设计师mvc核心的部分

    mvc 把应用的模型按照一定的规则抽象出来。业务模型中还有一个重要的模型就是数据模型。数据模型主要是指实体对象的数据持续化。

    2.视图(表示层)

    根据客户类型显示信息,显示模型的结构,而不关心信息是如何获得的

    3 控制器

    控制器接收用户的输入并调用模型和视图去完成用户的需求。当用户单击web页面中的超链接和发送html表单时候,空盒子器本身不输出任何东西。也不执行任何处理。他只是接收请求并决定调用哪个模型构件去处理请求,然后确定哪个视图来显式模型处理返回的数据

    mvc处理过程:对于每一个用户输入的请求,先被控制器接收,并决定由哪个模型来进行处理,然后模型通过业务逻辑层处理用户的请求并返回数据,然后控制器用相应的视图格式化模型返回的数据,并通过显示页面呈现给用户。

    1.低耦合性。由于视图层和业务层的分离,是的修改视图层代码不需要重新编译模型和控制器代码,同样一个应用的业务流程或者业务规则的改变只需要改动mvc的模型层即可

    2.高重用性和可适用性

    3.较低的生命周期成本

    4.部署快速

    5.可维护性

    6.有利于软件工程化管理

     视图模块采用jsp实现,主要负责数据的展现,视图可以从控制器上获取模型的状态,当然不是直接从控制器上获取,而是控制器把模型的数据放到一个视图可以访问到的地方,通过间接方式来访问模型的数据。。控制器采用servlet来是想,客户端所有请求都发送给servlet,它接收请求,并根据请求的消息把他们分发给对应的jsp页面来响应。同时根据需求生成的Javabean实例供jsp使用。模型采用Javabean实现。这个模块实现了实际的业务逻辑。

     servlet 中的forward 和redirect 

    forward (转发)服务器内部重定向,服务器直接访问目标地址的url,把url的响应的内容读取过来,而客户端不知道,因此在客户端浏览器的地址栏中不会显示转向后的地址,还是原来的地址。由于整个定向的过程中用的是同一个Request,因此forWord会将request的信息带到被指定的jsp或者servlet中使用。

    redirect(重定向) 客户端的重定向,完全的跳转,客户端浏览器会获取到跳转后的地址,然后重新发送请求。浏览器会显示跳转后地址。由于这种方式比forward方式多了一次网络请求。

    5.1.10  jsp内置对象

    jsp 提供了9个内置对象:

    request(请求对象)、response(响应对象)、pageContext(页面上下文对象)、session(会话对象)、application(应用程序对象)、out(输出对象)、config(配置对象)、page(页面对象)与exception(例外对象)

    名称 描述
    request 客户端请求,次请求包含来自get/post请求的参数。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应,因此request对象时用来获取请求参数的非常重要途径。它是httpservletrequest类的实例
    response 服务器对客户端的响应,将web服务器处理后的结果返给客户端。但是在jsp很少使用它,它是httpservletresponse类的实例
    pagecontext 提供了对jsp页面的所有对象及命名空间的访问,也就是说,用它可以访问到本页面中的所有其他对象,例如前面已将描述的request、response以及以后要介绍的session和application对象等,它的本类名也叫pagecontext
    session 用来表示客户端与服务端的一次会话。从客户端与web服务器建立连接的时候会话开始。直到关闭浏览器时结束会话。它是httpsession的实例
    application jsp所属的web应用的本身。application对象可以放全局变量,因此可以实现用户间的数据共享。他的生命周期和服务器的生命周期一致。在任何地方,对此对象属性的操作进影响到其他用户对此的访问。它是servletcontext类的实例
    out 客户端浏览器内输出信息
    config 去的服务器的配置信息。当一个servlet初始化时候,容器把某些信息通过config对象传递给servlet,servlet可以使用这个对象获取所需的配置信息
    page 当前jsp页面 java.lang.object对象
    exception 表示异常,一个页面在运行过程中发生了例外,就会产生这个对象,若果jsp需要使用这个对象,就必须把iserrorpage设为true。负责无法编译。它是java.lang.Throwable对象

      5.1.13jsp中include指令和include动作区别

    include主要动作用来在当前文件中引入另一个文件,以便在当前文件中使用

    include指令方法:<%@ include file="test.jsp" %>

    include动作的方法:

    <jsp:include page="test.jsp" flush="true"> <jsp:param name="name" value="value"/></jsp:include>

    include 指令与include动作之间的根本性差异在于二者被调用的时间。include指令是编译阶段的指令,即在编译时候,编译期会把指令所指向目标文件的内容复制到指令所在的位置,替换指令,最终形成一个文件,在运行时候只有一个文件。include指令所包含文件的内容实在编译时候插入jsp文件的,当文件内容有变化时候就需要重新编译,因此适合包含静态页面的情况,例如可以包含一个servlet。

    include动作是运行时候的语法,在主页面被请求时候,才将用到的页面包含进来,涉及两个文件,类似方法的调用,更适用于包含动态页面的情况

    1.当使用include动作时候,页面中声明的变量不可用于另一只文件,除非将变量防止在request,session,application 作用域中,而在使用include指令时候,当前页面和被包含页面可以共享变量。

    2.当时用include指令时候,新生成的jsp页面要符合jsp语法要求,应该避免变量名的冲突,而在使用include动作时候,不存在变量名冲突问题。

    3.include指令会修改被包含文件,但不会立即生效,除非修改主页面或删除主页面的类,而include动作修改被包含的文件,会立即生效。

    考虑到include动作在维护上的优势,优先考虑include动作。

    5.1.14 回话跟踪

    1.开发web应用程序经常需要做到数据共享或者在不同页面之间可以传递参数,而且,一个绘画中的数据会在不同的地方使用,因此需要有专用的机制来传递和保存这些数据。

    会话:从客户端打开与服务器链接并发出请求到服务器响应客户端请求的全过程。回话跟踪是对同一个用户对服务器的连续请求和接收响应的监视。由于客户端和服务端之间通过http进行通信,http本身是无状态协议,不能保存客户的信息,即一次响应完成之后链接就断开了,下次请求时候,需要重新建立链接,等到建立完连接后还需要判读是否为一个用户。会话跟踪数据

    1.page:代表与一个页面相关的对象和属性。一个页面由一个编译好的javaservlet类表示,既包括servlet又包括被编译成servlet的jsp页面。

    2.request :代表与web客户端发送的一个请求相关对象和属性。一个请求可能跨越多个页面,涉及多个web组件

    3.session 代表与用于某个web客户端的一个用户体验相关的对象和属性,一个web会话可以经常跨越多个客户端请求。

    4.application 代表与某个web应用程序相关的对象和属性,这实际上市跨越多个web应用程序。包括多个页面、请求和会话的一个全局作用域。

    5.1.16 ajax

    ajax 结合了java技术、xml技术以及JavaScript的编程技术,不刷新页面的情况下通过与服务器进行少量数据交互来提高页面的交互性,减少响应时间,从而改善用户体验。

    ajax技术可以只向服务器发送并取回必须的数据内容,数据交互大幅降低,降低服务器网络负载,通过使用soap(建党对象访问协议)或其他一些机遇xml的webservice接口没在客户端采用js处理来自服务器的响应,降低了web服务器的处理时间,异步请求方式

    5.1.17  cookie和session

    cookie 是在http下,服务器与或脚本可以维护客户工作站上信息的一种方式。它是由web服务器保存在用户浏览器上的小文件,可以包含相关用户的信息。session是指用来客户端与服务端之间保持状态的解决方案以及存储结构。

    1.cookie机制采用客户端保持状态的方案,数据存放在客户的浏览器上,session放在服务器上。

    2.cookie安全性不够

    3.cookie性能更高,session保存在服务器上,访问量增多时,降低服务器性能。

    4.单个cookie保存数据不超过4kb,浏览器限制一个站点保存20个cookie

    5.2.1 j2ee

    j2ee是java平台企业版的简称,用来开发和部署企业级应用的一个架构,提供了一种统一的、开放标准的多层平台。该平台主要由构件、服务和通信3个模块构成。

    构件:客户端构件和服务端构件两种类型。客户端构件:applets和application clients

    服务端构件:web构件(servlet和jsp)ejbs(javabean)

    服务:j2ee平台提供商实现,serviceAPI和运行时服务

    通信:容器提供的支持协作构件之间的通信。

    5.2.2

    web服务器:驻留在Internet上的计算机程序

    web容器:web应用服务器,服务程序,用来给运行在其中的程序提供运行环境。

    ejb容器:服务器端容器

    applet容器:客户端容器,包含组件为applet

    application client容器:客户端容器,包含组件为 application client

    jndi:java 命名和目录接口,开酥查找和定位分布式应用程序的功能

    jms:java平台中面向消息中间件的api

    jta:java 事务服务

    jaf:数据处理框架

    rmi:远程方法的调用

    5.2.3 ejb 分布式组件对象模型

    session bean(会话bean) entity bean(实体bean) message driven bean(消息驱动bean)

    5.2.4 javabean 容器创建,无参构造器,实现serializable接口实现bean的持久性

    5.2.11 web

    web服务器 与web应用服务器

    web服务器可以向发出请求的浏览器提供文档的程序。提供网上信息浏览服务,接收浏览器请求并把处理结果传回浏览器进行显示。web服务器有 iis和Apache

    应用服务器提供访问业务逻辑的途径以供客户端应用程序使用。通过http、tcp/ip或者jrmp等协议来提供业务逻辑接口,例如tomcat

    web服务器一般是通用的,应用服务器是专用的。tomcat只处理java应用程序

    5.2.12 webservice

    webservice 机遇网络的分布式模块化组件。将可调用的功能发布到web上以供应用程序访问。

    1.可扩展可标记语言(xml),实现web service的基础,非常适用于网络上传输数据使用。

    2.web服务描述语言(wsdl)采用xml语言来描述web service属性的语言。它将webservice 描述为进行消息交换的服务访问点的集合

    3.通用描述、发现与集成服务(uddi)。

    4.简单对象存取协议(soap)通信协议。用户通过uddi找到对应的wsdl描述符后,通过soap调用web服务中操作。

    调用webservice时,服务提供者把锁提供的服务发布到服务代理的一个目录上,然后服务请求者使用uddi首先到服务地阿里提供的目录上搜索服务,得到如何调用该服务的信息wsdl,根据得到的调用信息使用soap调用服务者提供的服务。

    1.完好的封装性。2.松耦合。3.高度客户操作性。4.动态性,自动发现服务并进行调用。

     5.3.1 Struts

    Struts 体系结构采用了mvc设计模式,同时包含客户端(client)请求以及业务逻辑处理(business logic) mvc设计模式主要有模型(model)、视图(view)、和控制器(controller)三部分组成

    1.客户端(client)

    通过浏览器发送http请求,另一个方面可以把接受到的http响应信息在浏览器上展现出来。

    2.控制器(controller)

    控制器主要包括actionservlet类和requestProcessor类。其中actionservlet类是mvc实现的控制器部分,框架的核心部分,用来接收用于请求,并根据用户的请求从模型模块中获取用户所需的数据,然后选择合适的视图来响应用户的请求。通过struts-config.xml配置文件来确定处理请求的action类。在处理用户请求时候,关于请求的处理大部分交由requestProcessor.process()方法来处理。

    requestProcessor类的process()方法采用了模板的设计模式

     1.processPath(request,response) 。根据url来得到actionmapping元素的路径。

    2.processMapping(request,response) 根据路径信息找到actionmapping对象

    3.processRoles(request,response,mapping) struts为web应用提供了一种认证机制,用户登录时候,通过processroles方法调用requestisUserRole()方法来检查这个用户是否有权限执行给定的actionmaping

    4.processvalidate(request,response,form,mapping)调用actionForm的validate()方法

    5.processactioncreate(request,response,mapping)这个方法从action的type属性得到action类名,创建返回它的实例

    6.processactionperform(req,res,action,form,mapping)这个方法调用action类的execute()方法,其中execute()方法包含了业务逻辑的实现。action类不是线程安全的

    (3)业务逻辑(business logic)

    servlet在接收到请求后根据配置文件中的对应关系,把请求转给指定的action类来处理。action类采用适配器设计模式,对业务逻辑进行了包装。

     (4) 模型(model)

    在struts体系结构中,模型分为两部分;系统的内部状态和可以改变状态的操作(业务逻辑)。内部状态通常由一组actionform bean 表示,actionform 封装了http请求的数据的类或对象。actionform是一个抽象类,每一个输入表单都对应着它的子类。配置文件struts-config.xml中保存了http请求表单与具体actionform类的映射关系。

    (5)视图(view)

    视图就是一个jsp文件,该jsp文件中没有业务逻辑的处理,也不保存系统的状态信息,它通过一些标签把数据以浏览器能识别的方式展示出来。

    5.3.2  Struts 框架响应客户请求

    控制器是:actionservlet,业务逻辑的操作主要由action、actionmapping、actionforward等组件协调完成。action扮演了真正的控制逻辑实现者的借宿,actionmapping和actionforward指定不同业务逻辑或者流程的运行方向

    采用struts框架的web应用而言,web应用启动时候,加载并且初始化actionservlet,actionservlet从struts-config.xml文件中读取配置信息。保存到actionmapping对象中

    actionservlet接收到客户请求后:

    1.检索和用户请求匹配的actionmapping实例,如果不存在,就返回用户请求路径无效的信息。

    2.如果actionform实例不存在,就创建一个actionform对象,把客户提交的表单数据保存到actionform对象中。

    3.根据配置信息决定是否需要表单验证。如果需要验证,就要调用actionform的validate()方法

    4.如果actionform的validate()方法返回null或者返回一个不包含actionmessage的actionErrors对象,表示表单验证成功。

    5.actionservlet根据actionmapping实例包含的映射信息决定将请求转发给那个action,如果对应的action实例不存在,先创建一个实例,调用action的execute方法。

    6.action的execute方法返回一个actionforeard对象,actionservlet在把客户请求转发给actionforward对象指向的jsp组件

    7.actionforward对象指向的jsp组件生成动态页面,返回给客户。

    5.3.6

    action一般用于控制业务逻辑的处理,例如增删改查,actionForm  bean用户封装用户请求的参数。当接收到页面输入的数据后

    5.3.11  IoC

    控制反转(Ioc) 依赖注入,降低对象之间的耦合关系。通过IoC方式,是的上次不在依赖下层的接口,通过采用一定的机制来选择不同的下层实现,实现控制反转。

    通过IoC容器,开发人员不需要关注队形如何被创建,增加新类也很方便,修改配置文件实现对象的热插拔。通过配置文件来确定需要注入的实例化对象。

    AOP

    面向切面编程,允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求。

    5.3.13  Spring框架

    支持控制反转和面向切面

    Spring aop 、Spring orm、Spring dao 、Spring web 、spring context 、Spring web mvc 、Spring core

    web容器中用来管理web服务器端的模块 如servlet 。管理用于访问数据库的hibernate。 Spring在管理business object和dao时候使用了IOC和aop思想。Spring管理的对象都可以脱离ejb容器单独运行,被Spring容器管理时候,增加配置文件

  • 相关阅读:
    Swift
    Swift
    书籍
    Swift
    Swift
    iOS系统架构
    Reveal真机(越狱)查看任意APP
    Swift
    Swift
    Swift
  • 原文地址:https://www.cnblogs.com/xxwtfw/p/7474561.html
Copyright © 2011-2022 走看看