《Java 2实用教程》读书笔记


第一章:Java入门

1.Java可以在计算机的操作系统之上再提供一个Java运行环境(Java Runtime Environment,JRE)。

2.JRE由Java虚拟机(Java Virtual Machine,JVM)、类库、以及一些核心文件组成。

3.Java虚拟机的核心是所谓的字节码指令,即可以被Java虚拟机直接识别、执行的一种由0、1组成的序列代码。字节码并不是机器指令,因为它不和特定的平台相关,不能被任何平台直接识别、执行。

4.Java针对不同平台提供的Java虚拟机的字节码指令都是相同的,Java提供的编译器不针对特定的操作系统和CPU芯片进行编译,而是针对Java虚拟机把Java源程序编译成称为字节码的“中间代码”。字节码是可以被Java虚拟机识别、执行的代码。

5.Java虚拟机负责解释运行字节码,其原理是:Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台(本地的操作系统)运行机器码。

6.名称:

  • Java SE(曾称J2SE):称为Java标准版或Java标准平台。Java SE提供了标准的Java Development Kit(JDK)。利用该平台可以开发Java桌面应用程序和低端的服务器应用程序。
  • Java EE(曾称J2EE):称为Java企业版或Java企业平台。使用Java EE可以构建企业级的服务应用,Java EE平台包含了Java SE平台,并增加了附加类库,以便支持目录管理、交易管理和企业级消息处理等功能。

7.保存Java源文件时,如果源文件有多个类,那么只能由一个类是public类,如果有一个类是public类,那么源文件的名字必须和这个类的名字完全相同,扩展名是.java,如果源文件没有public类,那么源文件的名字可任意(建议和某个类的名字相同),并且扩展名是.java。

8.一个Java应用程序必须有一个类含有一个public static void main(String[] args)方法,称这个类为此应用程序的主类

9.命令

  • 编译器:javac.exe,解释器:java.exe
  • 编译:javac 源文件名.java,可以只编译主类的源文件,Java系统会自动地先编译主类需要的其他源文件
  • 运行:java 主类名
  • 反编译:javap 类名(因为反编译的操作对象是.class字节码文件)
  • 压缩为jar包:使用jar.exe命令把一些类的字节码文件压缩成一个jar文件,然后将这个jar文件放到jre的扩展中,即将这个jar文件放到JDK安装目录的jre\lib\ext文件夹中。
  • 生成文档:使用javadoc.exe命令制作源文件类结构的html格式文档

10.当使用Java解释器运行应用程序时,Java虚拟机首先将程序需要的字节码文件加载到内存,然后解释执行字节码文件。当虚拟机将主类的字节码文件加载到内存时,就为主类中的main方法分配了入口地址,以便Java解释器调用main方法开始运行程序。

11.注意main方法不要写错,例如漏掉static、错写为mian等错误。

12.一个Java程序需经历的三个步骤:编写源文件、编译源文件生成字节码和加载运行字节码。


第二章:基本数据类型与数组

1.标识符:

  • 标识符由字母、下画线、美元符号和数字组成,长度不受限制
  • 标识符的第一个字符不能是数字字符
  • 标识符不能是关键字
  • 标识符不能是true、false和null(尽管它们不是Java的关键字)

2.Java语言使用Unicode标准字符集,最多可以识别65536个字符,Unicode字符集的前128个字符刚好是ASCII码。

3.基本数据类型:

  • 逻辑类型:
    (1)boolean型:常量:true,false

  • 整数类型:

    (1)byte型:Java中不存在byte型常量的表示法,但可以把一定范围内的int型常量赋值给byte型变量。
    (2)short型:和byte型类似,Java中也不存在short型常量的表示法,但可以把一定范围内的int型常量赋值给short变量。
    (3)int型:常量:123(十进制),077(八进制),0x3ABC(十六进制)
    (4)long型:常量:用后缀L来表示,123L(十进制),077L(八进制),0x3ABCL(十六进制)

  • 字符类型:
    (1)char型:常量:‘A’, ‘\t’,如char x = ‘a’;内存x中存储的是97,即字符a在Unicode表中的排序位置,因此也可以写成char x = 97;。

  • 浮点类型:
    (1)float型:常量后面必须要有后缀f或F。
    (2)double型:常量后缀可以有d或D,但允许省略。

4.基本数据类型精度从低到高排序:
byte short char int long float double
注:所占字节数分别为1,2,2,4,8,4,8


第三章:运算符、表示式和语句

5.位运算:

  • 按位与运算:&
  • 按位或运算:|
  • 按位非运算:~
  • 按位异或运算:^
    (1)位相同为0,位不同为1
    (2)例如:a ^ a = 0, a ^ 0 = a

6.for遍历:for(int i : array){}


第四章:类与对象

1.编程语言的几个发展阶段:

  • 面向机器语言:汇编语言 and so on…
  • 面向过程语言:C语言 and so on…
  • 面向对象语言:Java语言 and so on…

2.面向对象编程的三个特性:封装、继承和多态

3.对象:类声明的变量被称为对象变量,简称对象。

4.类的结构:

  • 类:类包括类声明和类体
  • 类体:类声明之后的一对大括号"{“,”}"以及它们之间的内容(大括号之间的内容称为类体的内容)。
  • 类体的内容由两部分组成:变量的声明和方法的定义
  • 变量的声明所声明的变量称为成员变量或域变量,成员变量又分为实例变量和类变量
  • 方法的定义:分为方法头和方法体。方法头由方法的类型、名称和名称之后的小括号以及其中的参数列表所构成,无参数方法定义的方法头中没有参数列表,方法体由一对大括号"{“,”}"以及它们之间的内容组成,方法体的内容包括局部变量的声明和Java语句。方法分为构造方法、实例方法和类方法

5.UML图:

  • 关联关系:A类中的成员变量是用B类声明的对象。A——>B
  • 依赖关系:A类中的某个方法的参数或返回类型是用B类声明的对象。A------>B
  • 继承关系:
    (1)A类是B类的父类。B——I>A
    (2)A类(抽象类)是B类的父类。B------I>A
  • 接口关系:A接口的一个实现是B类。B------I>A

6.对象的内存模型:声明对象后,如Point p,p的内存中还没有任何数据,称这时的p是一个空对象,空对象不能使用,因为它还没有任何“实体”,必须再进行为对象分配变量的操作,即为对象分配实体,如p = new Point(),为各变量(实例变量和局部变量)分配内存,为类中的实例方法分配入口地址(当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,只有该类创建对象后,类中的实例方法才被分配入口地址,需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,从而实例方法可以被类创建的任何对象调用执行,也就是说实例方法的入口地址被所有对象共享,当所有的对象都不再存在时,方法的入口地址才被取消; 而类中的类方法,在该类被加载到内存时,就分配了入口地址,从而类方法可以被类创建的任何对象调用执行,也可以直接通过类型调用,类方法的入口地址直到程序退出时才被取消),并计算出一个称作引用的值(该值包括代表这些变量和方法的内存地址及相关重要信息。

7.对象的引用存在栈中,对象的实体存在堆中。Java自动管理堆和栈,程序员不能直接设置堆和栈。栈的优势是,存取速度比堆快,缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性;堆的优势是,可以动态地分配内存大小,生成期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据(两个对象如果引用相同,则二者具有完全相同的实体,所谓的“垃圾收集”机制,就是周期性的简称某个实体是否已不再被任何对象所拥有,如果发现这样的实体,就释放实体占有的内存),但缺点是,由于要在运行时动态分配内存,存取速度较慢。

8.分配给对象的变量被习惯性的称作对象的实体,没有实体的对象称作空对象,空对象不能使用,加入程序中使用了空对象,程序在运行时会出现异常NullPointerException,由于对象可以动态地被分配实体,所有Java编译器对空对象不做检查,因此,在编写程序时要避免使用空对象。

9.可变参数:
public void f(double a, int … x),可变参数列表x可看作数组对待。

10.重写与重载:
首先需要清楚方法头和方法体的概念,其概念如下:
方法头: 修饰符+返回类型 +方法名(形参列表) 例如:public static void main(String []args)
方法体: { }的内容(包括这两个大括号和内部所有语法)
重写与其父类方法方法名、形参列表完全相同;修饰符可以相同,可以不同(但不能降低访问权限);返回类型可以相同,也可以是父类方法的子类型;方法体的内容不一样;所以可以理解成外壳相似,内部不一样。
例如:假设A类有如下方法:
public void speak(int a){
System.out.println(“A”);
}
B继承于A,如果B中定义一个方法如下:
public void speak(int b){//(也可以(public void speak(int a))
System.out.println(“B”);
}
则对此个例子来说,称B类的speak方法重写了A类中的speak方法

重载两个或多个方法的方法头中除方法名相同外,其他都可以不相同,方法体也不相同。
例如:有一个方法定义为float add(float a, float b),然后,再定义一个方法long add(long a, long b)

11.包:
例如package tome.jiafei;

  • 编译:
    (1)进入tom\jiafei的上一层目录1000编译,字节码默认保存在C:\1000\tom\jiafei中。
    C:\1000> javac tom\jiafei\Student.java
    C:\1000> javac tom\jiafei\Example.java
    (2)使用通配符*,编译全部源文件
    C:\1000\tom\jiafei> javac *.java

  • 运行:
    必须到tom\jiafei的上一层目录1000中来运行
    C:\1000> java tom.jiafei.Example

12.访问权限:


第五章:子类与继承

1.如果子类与父类在同一包中,子类则继承了父类中不是private的:成员变量、方法,继承的成员变量和方法的访问权限不变。如果子类与父类不在同一包中,则父类的private和友好访问权限的:成员变量、方法,不会被子类继承

2.java中子类会不会继承父类的static变量和static方法:无论是static修饰的变量,还是static修饰的方法,我们都知道他们是属于类本身的,不是属于某一个对象的,当声明一个对象时,并不产生static变量和方法的拷贝。也就是说,用static修饰的变量和方法在类加载的时候,只分配一块存储空间,所有此类的对象都可以操控此块存储空间。注:这里要说明的是,当子类没有与之同名的static变量(或方法时),子类的对象也可以操控这块内存空间。但是子类并没有继承父类中static修饰的变量和方法。因为static修饰的变量和方法是属于父类本身的。

3.当用子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量被分配了内存,而且父类的成员变量也都分配了内存空间,但只将其中一部分,即子类继承的那部分成员变量,作为分配给子类对象的变量。也就是说,如果在同一包中,父类的private成员变量尽管分配了内存空间,也不作为子类对象的变量,同样,如果不在同一包中,那么子类也不继承父类的友好成员变量。但是不是可以说子类创建对象时似乎浪费了一些内存呢,因为当子类创建对象时,父类的成员变量也都分配了内存空间,但只将其中一部分作为分配给子类对象的变量。答案是否定的,因为子类中还有一部分方法是从父类继承的,这部分方法却可以操作这部分未继承的变量

4.当用子类的构造方法创建一个子类对象时,子类的构造方法总时先调用父类的某个构造方法,也就是说,如果子类的构造方法没有明显地指名使用父类的哪个构造方法,子类就调用父类中不带参数的构造方法。由于子类不继承父类的构造方法,因此,子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法的头一条语句,即如果在子类的构造方法中没有明显地写出super关键字来调用父类的某个构造方法,那么默认也有super();因此,在父类中定义多个构造方法时,应当包含一个不带参数的构造方方法,以防子类省略super时出现错误。

5.final关键字:

  • final类不能被继承
  • final方法不能被重写
  • final常量不能变值

6.java上转型对象的理解,性质,优点:

  • 理解:
    A类是B类的父类,当用子类(B类)创建一个对象b,并把此对象的引用赋值给父类(A类)的对象a中时,称对象a是对象b的上转型对象
    例如: A a = new A(); a = new B();

  • 性质:
    ●上转型对象可以访问子类继承的成员变量或成员方法也可以访问子类重写的成员方法,但不能操纵子类新增的成员变量或成员方法。
    ●可以将上转型对象强制转回为子类对象。

  • 优点:
    方便面向接口的编程思想和面向抽象的编程思想,(上转型对象可理解为树的主干,其每个子类可理解为树枝)。

7.多态性:指父类的某个方法被其多个子类重写时,这多个子类可以按自己的需求,重写此方法产生各自的功能行为。

8.java抽象类的例子,性质,优点:

  • 例如:
public abstract class A {abstract int add(int x,int y);int sub(int x,int y) { return x-y;}
}
  • 性质:
    ●抽象类的类名前加修饰符abstract,可以包含抽象方法(用abstract修饰,只有方法原型,没有方法的实现),也可以包含非抽象方法,可包含常规类能包含的任何成员;
    ●抽象类是没有具体实例对象的类,不能使用new方法进行实例化,只能用作超类,只有当子类实现了抽象超类中的所有抽象方法,子类才不是抽象类,才能产生实例,如果子类中仍有抽象方法未实现,则子类也只能是抽象类;
    ●只有抽象类才可以包含抽象方法。

  • 抽象方法的优点:
    1.隐藏具体细节信息,所有的子类使用的都是相同的方法原型,其中包含了调用该方法时需要了解的全部信息;
    2.强迫子类完成指定的行为,规定所有子类的标准行为。

9.java接口的介绍,性质,例子,优点:

  • 介绍:
    ●接口包括接口声明和接口体,接口体包括常量的定义(必有初值),方法的声明(无方法体)。
    例如:
interface Shape2D {public static final double pi = 3.14;//public static final可省略public abstract double area();//public abstract可省略
}
  • 性质:
    ●接口可理解为纯抽象类;
    ●接口没有构造方法;
    ●常量(final),方法(public abstract,注意实现类中方法的访问权限为public);
    ●类实现某一接口要实现此接口的所有方法;
    ●接口的拓展:接口可继承(extends)多个超接口。

  • 优点:
    ●建立类和类之间的“协议”口将类根据其实现的功能分组用接口代表,而不必顾虑它所在的类继承层次;
    这样可以最大限度地利用动态绑定,隐藏实现细节;
    ●实现多继承的思想。

10.java接口回调及接口多个性质的例子:

interface Shape {public static final double pi = 3.14;//public static final可省略public abstract double area();//public abstract可省略
}
interface another{//只用来做多继承思想的说明
}
class Circle implements Shape,another{//为多继承思想的体现double radius;//新增变量public Circle(double r) {//新增方法radius = r;}public double area() {//实现接口的方法return (pi*radius*radius);//调用接口中的pi常量(可理解为继承过来的)}
}
public class Exampleke9 {public static void main(String[] args) {Circle cir = new Circle(2.0);System.out.println("Area of cir = "+cir.area());Shape shape;//声明接口变量shape = new Circle(2.0);//接口变量中存放对象的引用System.out.println("Area of cir = "+shape.area());//shape.area()为接口回调,若多个类implements一个接口,接口回调可以体现多态性}
}

11.abstract类与接口的比较:
abstract类除了提供重要的需要子类重写的abstract方法外,也提供了子类可以继承的变量和非abstract方法。

如果某个问题需要使用继承才能更好地解决,例如,子类除了需要重写父类的abstract方法外,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑abstract类

如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。

12.自定义异常类:
一个方法在声明时可以使用throws关键字声明要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并用throw关键字抛出该异常对象,导致该方法结束执行,程序必须在try-catch块语句中调用可能发生异常的方法,try部分中发生异常时,try部分立刻结束执行,执行跳转到catch部分,其中catch的作用就是捕获throw关键字抛出的异常对象。

13.断言:
断言语句可以在某个错误发生时,要求程序必须立即停止执行。在调试代码阶段非常有用,当程序正式运行时,就可以关闭断言语句。使用assert关键字声明。


第八章:常用实用类

1.String类常用方法:

  • public int length()
  • public boolean equals(String s)
  • public boolean startsWith(String s) / endsWith(String s)
  • public int compareTo(String s)
  • public boolean contains(String s)
  • public int indexOf(String s [, int startpoint]) / lastIndexOf(String s)
  • public String substring(int startpoint [, endpoint])
  • public String trim()
  • public static String valueOf(其他类型 n)
  • public void getChars(int start, int end, char[] c, int offset)
  • public char[] toCharArray()
  • public byte[] getBytes([String charsetName])
  • public String replaceAll(String regex, String replacement)
  • public String[] split(String regex)

2.StringTokenizer类:是String对象的分析器,可以分解String对象的字符序列,StringTokenizer对象称为字符串分析器。

3.StringBuffer类:可变字符串对象。

4.正则表达式:

5.Date类、Calendar类与日期的格式化

6.Math类、BigInteger类和Random类

7.数字格式化:String.format()

8.Class类:该类的实例可以帮助程序创建其他类的实例,创建对象最常用的方式就是使用new运算符和类的构造方法,实际上也可以使用Class对象得到某个类的实例。
(1)public static Class forName(String className) throws ClassNot FoundException,该方法返回一个和参数className指定的类相关的Class对象,如果该类在某个包中,className必须带有包名。
(2)public Object newInstance() throws InstantiationException, IllegalAccessException,该方法使用Class对象调用newInstance()实例化一个className类的对象时,className类必须有无参数的构造方法。

9.Console类:在键盘上输入一行文本时,不让该文本回显,即不再命令行显示。

10.Pattern类与Matcher类


第九章:组件与事件处理

1.Java Swing概述:

  • 容器类(Container)和组件类(Component)。javax.swing包中JComponent类是java.awt包中Container类的一个直接子类,是java.awt包中Component类的一个间接子类。
  • Component类的子类或间接子类创建的对象称为一个组件。
  • Container的子类或间接子类创建的对象称为一个容器。
  • 可以向容器中添加组件,Continer类提供了一个public方法add()。
  • 容器调用removeAll()可以移除容器中所有组件,remove(Component c)可以移除某个组件。
  • 容器本身也是一个组件,可以把一个容器添加到另一个容器中。
  • 每当容器添加新的组件或移除组件时,应当让容器调用validate()方法,以保证容器中的组件能正确显示出来。
  • 一个基于GUI的应用程序应当提供一个能和操作系统直接交互的容器,该容器可以直接被显示、绘制在操作系统所控制的平台上,例如显示器上,这样的容器被称作GUI设计中的底层容器,Java提供的JFrame类的实例就是一个底层容器,即通常所称的窗口。
  • 如果应用程序需要一个和用户交互的按钮,那么该按钮必须出现在底层容器中,否则用户无法看见,更无法操作。
  • JFrame类时Container类的间接子类,当需要一个窗口时,可使用JFrame或其子类创建一个对象,窗口也是一个容器,可以添加组件,窗口默认被系统添加到显示器屏幕上,因此不允许将一个窗口添加到另一个容器中。
  • 创建的普通容器习惯性地称为中间容器,中间容器需要添加到底层容器中才能发挥作用。

2.常用容器:

  • JPanel面板
  • JTabbedPane选项卡窗格
  • JScrollPane滚动窗格
  • JSplitPane拆分窗格
  • JLayeredPane分层窗格

3.常用布局:

  • FlowLayout布局
  • BorderLayout布局
  • CardLayout布局
  • GirdLayout布局
  • null布局
  • BoxLayout布局

4.常用组件:

  • JTextField(文本框)

  • JTextArea(文本区)

  • JButton(按钮)

  • JLabel(标签)

  • JCheckBox(复选框)

  • JRadioButton(单选按钮)

  • JComboBox(下拉列表)

  • JPasswordField(密码框)

  • 附图

5.事件:


第十章:输入、输出流


未完待续…

【Java万字笔记】重要基础知识点整理与汇总相关推荐

  1. java基础知识点整理一

    java基础知识点整理一 引言 '''突然发觉任何一门语言的基础知识部分,都比较杂一些.如果个人经过梳理之后,知识体系系统化,可以让基础更加牢靠一些.但是还是会有一些遗忘.所以,我想把一些比较重要但是 ...

  2. java重要基础知识点_java基础知识点整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 java基础知识点整理1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. ...

  3. 百度 java基础_java基础知识点整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 java基础知识点整理1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. ...

  4. Java基础知识点整理(2022年最新版)

    看了网上很多关于Java基础知识点整理的文章,但是感觉都不是很好,要么不全面,要么不准确,要么排版太乱了,所以今天整理了一份Java基础知识点整理(2022年最新版),希望对大家有帮助哈~ 由于本文篇 ...

  5. Java进阶3 - 易错知识点整理(待更新)

    Java进阶3 - 易错知识点整理(待更新) 该章节是Java进阶2- 易错知识点整理的续篇: 在前一章节中介绍了 ORM框架,中间件相关的面试题,而在该章节中主要记录关于项目部署中间件,监控与性能优 ...

  6. Java学习笔记之基础篇

    Java学习笔记之基础篇 目录 Java如何体现平台的无关性? 面向对象(OO)的理解 面向对象和面向过程编程的区别 面向对象三大特征 静态绑定和动态绑定(后期绑定) 延伸:类之间的关系 组合(聚合) ...

  7. Golang基础知识点整理

    Golang基础知识点整理 Go语言strconv包实现字符串和数值类型的相互转换 1 Slice 1.1 定义 1.2 切片的底层原理 1.3 切片的创建方式 1.3.1 从已有的数组或切片生成新的 ...

  8. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  9. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

  10. 计算机二级基础知识点全部讲解,计算机二级基础知识点整理

    计算机二级基础知识点整理 第一章 数据结构与算法 算法---是一组严谨地定义运算顺序的规则 算法的基本要素---一是对数据对象的运算和操作,二是算法的控制结构 算法设计基本方法---列举法.归纳法.递 ...

最新文章

  1. dx使用出现的错误总结
  2. python编写姓名年龄_python小工具 - alert弹框输出姓名年龄、求和
  3. rcp rapido_为什么气流非常适合Rapido
  4. Docker服务启动时报错:Job for docker.service failed because the control process exited with error
  5. python 超参数_OpenCV python sklearn随机超参数搜索的实现
  6. [链接].VGA信号时序
  7. mini6410 uboot board.c 分析
  8. Clip_by_norm 函数理解
  9. php 线性回归算法,线性回归方程计算器
  10. dbv oracle驱动,oracle dbv使用详解
  11. 计算机的网络技术说课稿模板,精选信息技术说课稿模板汇编五篇
  12. php保存快捷键,pr保存快捷键是什么?
  13. 巧用CSS,愚人节极客式恶搞
  14. MySQL必知必会(3)
  15. 支付宝网商贷是雪中送炭么?
  16. 尚硅谷的Netty介绍(一)
  17. powerpoint html文件类型,PowerPoint 2016无法打开此种文件类型怎么办-PPT打不开文件解决办法...
  18. 微信小程序——漂亮的步骤条(好看)
  19. 牛客 20859 兔子的名字
  20. 【f1c200s/f1c100s】使用genimage工具制作img系统镜像

热门文章

  1. shit!Vxworks!Shit!WorkBench!
  2. [转]Boost智能指针——scoped_ptr
  3. 精通SQL的30张简图
  4. fastdfs 集群 java,第四套:FastDFS 分布式文件系统集群与应用(视频)
  5. 如何用搜索引擎搜js css源码例子
  6. QML 环形进度条canvas 98行代码实现
  7. c语言多位数加减,两个超长正整数的加法
  8. laravel连接mysql连接数过多_php – Laravel 4和MySQL的连接太多了
  9. WinInet 错误代码 (12001 - 12156 )
  10. C#控制台应用程序执行结果一闪而过的解决方法