java疯狂讲义 摘录

一。

  1. 编译型语言:编译+链接,一次性编译成机器码,可以脱离开发环境独立运行,运行效率较高,但是不易移植;解释型语言:相当于编译型中的编译+解释过程混合,但是每次执行都需要编译一次,所以效率较低;移植性相对强,只需要提供对应平台的解释器就行了。
  2. jvm:可运行java字节码的虚拟计算机。
  3. jre:java runtime environment,包括jvm+环境支持;jdk=jre+其他开发工具包
  4. 安装后文件bin:存放jdk各种工具命令,如java,javac;db:安装javac db的路径;include:特定头文件;jre:jre环境;lib:jdk工具命令的实际执行程序;src.zip:java所有核心类库的源码;
  5. 操作系统查找命令方式:根据path环境变量查找;Windows不区分大小写,linux区分;对于java来说,把java和javac命令路径添加到path变量中即可编译运行java。系统变量优先于用户变量,系统变量对所有用户生效,用户变量对当前用户生效。classpath:添加lib/dt.jar,lib/tools.jar类的路径,jdk1.5以后的不需要手动添加。
  6. 一个java源文件最多只能定义一个public类。
  7. java虚拟机只会从main方法开始执行。
  8. 垃圾回收机制:发现无用对象;回收被无用对象占用的内存空间
  9. 不要从IDE工具开始学习----------我直接是从eclipse开始的,现在在用idea,但是并不了解IDE按钮的作用,所以有可能真得从头做起

二。面向对象基础

  1. 成员变量+方法=类定义
  2. 对象间的合作需要“消息”机制协助进行,消息机制是对象通信的机制。
  3. java不支持多继承
  4. 封装指将对象实现细节隐藏起来,通过公用方法暴露对象功能,如各接口。
  5. 多态是在继承的基础上的,判断一个语言是否面向对象,通常可以使用继承和多态进行判断。

三。数据类型和运算符

  1. java语言是强类型语言,包含如下含义:所有变量必须先声明后使用;指定类型的变量只能接受与之匹配类型的值。强类型语言在编译时就可以发现错误。
  2. 注释:文档注释/**  */ ,命令:javadoc 选项 源文件|包;常用javadoc标记:@author,@version,@deprecated 不推荐使用的方法,@param,@return,@see 参见,@exception,@throws
  3. java语言中的空格包括space,tab,enter等
  4. 常用分隔符:(),{},[],圆点,空格,分号
  5. 每个变量都代表一块内存,而且变量是有名字的,程序对变量赋值,实际上就是把数据装入变量对应内存区域的过程。变量分为基本类型(primitive type)和引用类型(referrence type)。基本类型包括boolean类型和数值类型,数值类型包括整数类型和浮点类型。整数类型包括byte(1B),short(2B),int(4B),long(8B),char(2B,代表字符型,也相当于无符号整数类型).浮点类型包括float(4B),double(8B)。引用类型包括类,接口和数组,还有特殊的null类型。所谓引用数据类型就是对一个对象的引用,对象包括实例和数组。实际上,引用类型变量就是一个指针。
  6. 用16位的unicode字符集编码方式表示字符型。
  7. char字符用单引号括起来,String类用双引号括起来。
  8. 自动类型转换,强制类型转换格式:(targettype)value。java中8种基本类型包装类都有对应方法将字符串转换为基本类型,parsexxx(String str)
  9. 表达式类型自动提升,提升规则:所有byte,short,char类型提升到int类型;整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
  10. 直接量,定义变量的时候直接赋给变量的值。字符串直接量,当程序第一次使用某个字符串直接量时,会使用常量池(constant pool)缓存。
  11. 运算符:算术运算符,赋值,移位,逻辑运算符,比较运算符,类型相关运算符
  12. ==比较数值类型,即使数据类型不同,只要值相等,也返回true,如5.0==5就返回true;而如果是两个引用类型,比较的是内存地址,并且两者必须具有父子继承关系才能进行比较。三木运算符:(?:)可以嵌套
  13. 位运算符与逻辑运算符有相似的地方,如与,或,异或等
  14. 大部分运算符是从左到右结合的,只有单目运算符,赋值运算符,三木运算符

四。流程控制与数组

  1. 使用if else语句时,一定要优先处理范围小的情况
  2. switch语句,参数类型只能是int,byte,char,short,枚举,String类型(不能是stringbuffer,stringbuild)。每个case后需要加break语句。
  3. continue结束本次循环剩余语句,break结束本次循环;return直接结束整个方法体
  4. java 的数组可以存储基本数据类型,也可以存储引用数据类型。数组定义:type[] name,type name[],定义数组时不能指定内存空间,必须通过初始化定义内存空间(也就是为数组元素分配空间),数组长度不可变
  5. 静态初始化,动态初始化不要同时使用静态初始化和动态初始化。
  6. foreach(type 变量名:array|collection){}自动遍历数组元素

五。面向对象

  1. static,修饰的成员表明属于类本身,不属于类的单个实例。
  2. Person p=new Person(),p是引用变量,指向实例
  3. this关键字,总是指向调用该方法的对象。this关键字最大的作用,就是让类中一个方法,访问该类里另一个方法或者实例变量。汉语中主谓宾的语法适用于程序,所以有时候看省略了this,实际上代码底层已做处理。如果是static修饰,则默认使用该类作为主语;而非static修饰,则默认使用this作为主语。static修饰的方法和变量不能直接访问非static修饰的方法和变量。简单来说,static修饰的不需要实例化,非static修饰的需要实例化,然后用实例调用。this关键字在构造器中代表该构造器正在初始化的对象。
  4. java里方法的参数传递只有一种:值传递,就是将实际参数值的副本传入方法内,参数本身不会受到影响。当系统开始执行方法时,系统为形参初始化,实际上就是把实参变量的值赋给形参变量,方法中操作的并不是实参变量。同样的,引用类型也使用的是值传递,只是传递的是指针,相当于把变量的地址赋给了形参,所以会造成赋给的是实参的错觉。因为赋给的是内存地址,所以实际上操作的是同一块内存地址所指向的值。
  5. 形参可变test(String... books),当做一个数组传入;test(String[] books)这种调用方式要求实参传入参数必须是数组定义方式
  6. 递归方法:方法体内调用自身
  7. 方法重载:同一个类中方法名相同,参数列表不同,与返回值类型,修饰符等没关系。
  8. 局部变量和成员变量成员变量无需显式初始化,默认初始化的赋值规则与数组动态初始化的元素赋值规则相同。方法局部变量和代码块局部变量需要显式初始化,而且生命周期只作用于定义的代码块或者方法体内。局部变量和成员变量同名时,局部变量会覆盖成员变量。eyenum变量属于static定义的类变量,因此和实例变量并不属于一块内存区域。
  9. 封装:将类的实现细节隐藏起来,只暴露方法。使用访问控制符实现。JavaBean类是一个封装良好的类,对应set胎儿和getter方法可以设置和获取private 变量中变量的值。
  10. 包名建议用公司域名倒写。Java默认为所有源文件导入java.lang包下所有类。如果需要导入其他类,用import关键字。
  11. 方法重写(override),也叫方法重载,发生在子类和父类直接。两同两小一大原则:相同名字,相同形参个数;子类返回值类型比父类更小或者相等,子类抛出异常比父类更小或者相等;子类方法的访问权限比父类更大或者相等。如果父类访问权限是private,那么如果子类符合上述定义规则,也只是相当于子类定义了一个方法,并不是重写父类方法。子类和父类要么都是类方法,要么都是实例方法,不可以不统一。子类需要调用父类的方法,用super关键字。父类和子类也可能发生重载,因为子类会继承父类的方法,如果此时定义了一个方法名相同,形参列表不同,就发生了重载。
  12. 新建一个子类实例时,会为这个对象分配两块内存,分别存储子类和父类中的实例变量和方法。
  13. 调用构造方法,都是先调用父类的构造方法,才调用子类构造方法, 只是我们感觉不到。
  14. Java引用变量有两个类型:编译时类型,声明该变量时的类型决定;运行时类型,实际赋给该变量的对象决定。如果编译时和运行时类型不一致,就可能出现多态。通过Object p=new Person()定义的变量p,只能调用Object类的方法,而不能调用Person类定义的方法。通过引用变量访问实例变量,系统总是试图访问她编译时类型定义的成员变量,而不是运行时的变量。
  15. 强制类型转换:(type)variable,换算前用instanceof运算符判断一下是否可以转换。a instanceof ClassType;子类--》父类,向上转型;父类--》子类,强制转换。
  16. 引用变量 instanceof 类、接口,判断对象是否属于后面的类,是则返回true。如果操作数与后面的类不具有继承关系,编译会报错。
  17. 初始化块:当Java创建一个对象时,系统先为该对象的所有实例变量分配内存,然后开始执行初始化。初始化顺序是:先执行初始化块或声明实例变量时指定的初始值,再执行构造器里指定的初始值。
  18. 自动装箱(autoboxing),自动拆箱(autounboxing),基本类型变量和对应包装类变量的转换机制。
  19. toString()方法是一个“自我描述”方法,返回该对象实现类的类名+@+hashcode值,因此总是需要重写Object类的toString方法。
  20. ==判断变量是否相等,如果是基本类型变量,只要数值相等就返回true;引用型变量,只有指向同一个对象才返回true,而且==不可以用来比较没有父子关系的两个对象。equals()方法是Object类提供的一个实例方法,因此所有变量都可调用该方法来判断是否与其他引用变量相等,但是使用标准与==没有区别,同样要求指向同一个对象才返回true。
  21. 单例(singleton)类,只能创建一个类实例
  22. final修饰符:可以用来修饰类,变量,方法,赋值以后不可改变。final修饰的成员变量必须显示指定初始值。final修饰符指向的引用变量指向的地址不会发生改变,但是里面的对象内容可以发生改变。
  23. 宏变量:定义final变量时就为该变量指定了初始值,而且编译时已经确定值,那么这个final变量就相当于“宏变量”。
  24. final类不可以有子类。
  25. 抽象类:abstract修饰,抽象类不能被实例化,无法使用new关键字调用抽象类的构造器创建实例。含有抽象类方法的类只能被定义成抽象类,抽象方法如abstract test();没有方法体。abstract不能和static同时修饰某个方法;abstract修饰的方法必须被子类重写,所以要定义为public。abstract类可以包含普通方法和抽象方法。
  26. 接口:接口里所有方法都是抽象方法。接口里成员变量默认是使用public static final修饰的。接口主要用途:定义变量;调用接口中定义的常量;被其他类实现。
  27. 枚举类:关键字enum,地位与类,接口相同。
  28. Jar包,一种压缩文件,将应用相关的类文件打包,供别人使用。添加jar包文件到classpath变量中,则Java虚拟机就可以自动在内存中解压这个jar包,查找相关类。默认包含名为meta-inf/manifest。mf的清单文件。
  29. 创建jar包:jar c(v)f  test.jar test;查看jar包:jar t(v)f test.jar;解压缩:jar v(v)f test.jar;更新jar包:jar u(v)f test.jar test.class

六。基础类库

  1. public static void main(String[] args)static,JVM直接通过该类来调用主方法;void,主方法被JVM调用,因此返回值给jvm没有任何意义。字符串数组形参:谁调用方法,谁负责赋值。
  2. 使用scanner获取键盘输入,scanner是基于正则表达式的文本扫描器,可以从文件、输入流、字符串中解析出基本类型和字符串。hasNextXXX()判断是否有下一个输入项;nextxxx()获取下一个输入项
  3. System类,
  4. Runtime类,代表java程序的运行时环境,每个java程序都有一个Runtime实例。可以通过getRuntime()获取Runtime对象。
  5. String类是不可变类;StringBuffer可变,如append(),insert(),reverse(),setCharat(),setLength()改变对象的字符串序列,最终确定字符串以后,可以通过toString()方法转换为string对象。String.toCharArray()将String对象转换成char数组。String.valueOf(X x)各基本类转换为String类。
  6. Math类;Random类,Random rand=new Random(System.currentTimeMillis)
  7. BigDecimal类,创建此类对象时,要直接用String类对象作为构造器参数,不要直接用double数字。
  8. Date类:Date()生成代表当前日期时间的Date对象,底层调用System。currentTimeMillis()获得long整数作为日期参数。deprecated表示java不再推荐使用。Calender类是Date类的补充。
  9. 正则表达式:

正则表达式必须先被编译为Pattern对象,Pattern p=Pattern.compile("a.b");再利用Pattern对象创建Matcher对象,Matcher m=p.mattches("aaabbb");boolean b=m.matches,返回true;多个Matcher可共享同一个Pattern对象

Matcher.find(),返回目标字符串中是否包含与Pattern匹配的子串;Matcher.group()返回上一次与Pattern匹配的子串

  1. java国际化,通过以下三个类完成,java.util.ResourceBundle,java.util.Locale(封装特定的国家/区域,语言环境),java.text.MessageFormat
  2. MessageFormat处理包含占位符的字符串;
  3. NumberFormat
  4. DateFormat,SimpleDateFormat,处理日期格式化,Date date=Date.parse(String xxx),String sss=date.format(Date d);Java 8提供了新类;DateTimeFormatter合并两者。

七。集合

  1. 保存不确定的数据,以及保存具有映射关系的数据,java提供了集合类,也称为容器类,位于java.util包下。集合里只能保存对象(对象的引用变量)。
  2. Collection分为Set(无序集合)和List(有序集合),Queue类似List;Map类用于保存具有映射关系的数据,以key-value对表示。Set元素不能重复,且无法记住元素顺序;List类似数组,可以记住存储顺序,且List长度可变;Map类似Set,只是每项数据由两个值组成。
  3. Iterable借口的foreach方法可以用来遍历集合元素,用Lambda表达式,程序会依次将集合元素传递给Consumer的accept(T t)方法。
  4. 使用foreach循环遍历集合元素for(Object obj:books)
  5. HashSet:向集合中存入元素,Hashset调用该对象的hashCode()方法得到hashcode值,根据这个值决定存储位置。hashset集合判断两个元素相等的标准是两个对象通过equals方法相等,并且hashcode也相等。
  6. LinkedHashset,TreeSet,Enumset都是set集合,符合set集合特性。
  7. ArraysList和Vector都是基于List的子类,基于数组实现。
  8. Queue用于模拟队列这种数据结构
  9. LinkedList可以被当成双端队列来使用,因此既可以当“栈”使用,也可以当队列使用。以链表形式存储数据。
  10. Map类中key和value是一对一关系。Map的实现类和子接口中key集的存储形式和对应Set集合中元素存储的方式完全相同。Object put(Object key ,Object value)
  11. 操作集合的工具类:Collections

八。泛型(相当凌乱中)

  1. java集合有个缺点,把一个对象扔进集合里之后,集合就会忘记对象的类型。再次取出此对象时,该对象的编译类型就变成了 Object(运行时类型未发生变化)。
  2. java引入了参数化类型的概念(parametized type),允许程序在创建集合时指定传入参数的类型。这种类型称为泛型generic
  3. 菱形语法:List<String> books=new List<>()
  4. 创建泛型声明的自定义类,为该类定义构造器时,构造器名还是原来的类名,不要加泛型,如A类构造器是A,而不是A<T>
  5. 泛型并不会生成真正的类,比如ArrayList<String>和ArrayList<Integer>实际上都是ArrayList类。不能在静态变量声明,静态方法中使用类型形参
  6. 使用类型通配符List<?> c表示泛型父类

九。异常捕获

  1. try,catch:执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该对象被提交给运行时环境,这个过程称为抛出异常。java运行时环境收到异常对象时,寻找合适的catch块捕获异常;找不到则运行时环境终止,程序退出。
  2. try块对应的语句只能执行一个catch块,try和catch中语句即便只有一条,花括号也不可以省略,if语句如果只有一条语句是可以省略花括号的。异常捕获原则:先捕获小异常,后捕获大异常。
  3. 多异常捕获
  4. 访问异常信息
  5. 使用throws声明抛出异常:当前方法不知道如何处理,该异常又上一级调用者处理;如果main方法也不知道如何处理,使用throws声明抛出异常,交给JVM处理,打印异常的跟踪栈信息,终止程序运行。
  6. 使用throw自行抛出异常(非系统抛出),抛出的是一个实例

十。mysql与JDBC

  1. use database进入数据库;show tables展示这个数据库下有几个表  use dev_fund_bh;SHOW TABLES;
  2. innoDb提供事务安全的存储机制。
  3. truncate 删除表中数据;drop删除表;
  4. unique唯一约束,针对一列或者几列数据进行约束,数据不能重复;主键约束相对应非空约束和唯一约束;check约束(mysql不支持)
  5. create index a_index on tablename(列名)
  6. 视图:create or replace view 视图名 as subquery ,其实就是一条被命名的sql语句;视图并不存储数据
  7. select语句可以使用算术运算符进行筛选

用concat进行字符

串连接运算

select 列名 as 别名,或者select 列名 别名

  1. between and ,expr in(1,2,3。。)expr=括号里任意一个表达式的值;=判断相等,<>判断不等,:=赋值
  2. _下划线代表匹配一个字符,%匹配多个字符,\转移字符
  3. 逻辑运算符:and,or,not,优先级低于比较运算符
  4. 数据库函数:单行函数:select CURDATE();select curtime();case函数
  5. 多行函数:min,max,sum,avg,distinct与*不可以同时使用,group by,having;
  6. having和where的区别:
  7. 子查询 

十一。Annotation 注释

deprecated 已废弃,@Documentation @override 覆盖

十二。文件

  1. 输入输出流是根据程序运行所在内存的角度考虑的
  2. 字节流:InputStream,OutputStream,八位字节;字符流:Reader,Writer,16位字符
  3. 节点流,处理流

十三.多线程

  1. 每个运行中的程序就是一个进程。程序进入内存就变成了进程。
  2. 并发性concurrency同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,宏观上看起来是多个进程同时执行。并行性parallel同一时刻,有多条指令在多个处理器上同时执行。
  3. 线程也被称作轻量级进程lightweight process
  4. 线程基类Thread
  5. 线程状态转换
  6. 后台线程daemon Thread,在后台运行,为其他线程提供服务,又称为守护线程或者精灵线程。JVM的垃圾回收机制就是典型的后台线程。如果所有前台线程都死亡,后台线程会自动死亡。通过setDameon(true)可将线程设置为后台线程
  7. 改变线程优先级setPriority() MAX_PRIORITY=10,MIN_PRIORITY=1,NORM_PRIORITY=5
  8. 线程同步,通过同步监视器来解决,synchronized关键字;线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。目的是阻止两个线程对同一个共享资源进行并发访问,如银行账户
  9. Lock同步锁
  10. 死锁
  11. 线程通信:synchronized+wait(),notify(),notifyall(),这三个方法属于Object,而不是Thread类;
  12. Lock+Condition;阻塞队列BlockingQueue

十四。类加载机制与反射

  1. 系统会通过加载,连接,初始化三个步骤对类进行初始化。类加载:将类的class文件读入内存,创建java.lang.Class对象
  2. 类的加载
  3. 类的连接:
  4. 类的初始化
  5. 类加载器:负责将.class文件(可能在磁盘,也可能在网络上)加载到内存中,并自动生成对应的java.lang.Class对象。包括Bootstrap ClassLoader根类加载器,加载java核心类;Extension ClassLoader扩展类加载器,System ClassLoader系统类加载器
  6. UrlClassLoader
  7. 通过反射查看类信息java.lang.reflect,如常用的get,set方法

总结:

1.学习了基础,之前写自动化只是参考常用方法,有不会的随时百度,但是并没有系统的学习;学习这本书了解了基础知识,结合自身实际情况,感觉加深了写代码的印象;

2.其中主谓宾的概念更加强了我写代码时的了然于胸,不是胡写一通了,之前思路大概是想到哪儿写到哪儿,现在有点进步;

3.泛型,多线程,文件读写等更深层次的操作需要更多的学习以及练习

4.一定要多学习相关api,了解其中原理,才能更好的写出自己想要的东西

猜你喜欢

转载自blog.csdn.net/Trival_dreamy/article/details/82150443