疯狂java讲义学习笔记
第一章 概述
1. JDK版本包括
运行环境(jre):核心API、集成API、用户界面API、发布技术、Java虚拟机(JVM)
开发环境(jdk):编译器(javac命令、JIT编译器【1】)
2.编译型的语言指使用专门的编译器、针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式
解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的及其码并立即执行的语言,解释型语言通常不会进行整体性的编译连接处理,
3.编写javac程序不要使用写字板,更不可使用word等文档编辑工具,因为写字板。Word等工具是有格式的编辑器,当我们使用他么编辑一份文档时,这个文档中会半含一些隐藏的格式化字符,这些隐藏字符会导致程序无法正常编译、运行
4.
Path的作用不管在linux平台,还是windows平台,我们只需要把java和javac两个命令所在的路径那个添加到path环境变量中就可以编译和运行java程序了
classpath的作用:告诉jre需要在什么路径下搜索java类,除此之外编译和运行jdk还需要jdk的lib路径的dt.jar和tools.jar文件类,因此需要把这两个文件添加到classpath环境变量里
(如果我们想在运行java程序时临时指定jre搜索java类的路径,可以使用-classpath选项,即按如下格式来运行java命令:
Java –classpath dir1;dir2;dir3 java类
Java –classpath c:\;d:\;e:\ HelloWorld
)
5.如果类能被解释器直接执行,则这个类必须包含main方法,而且main方法必须使用
public static void修饰,且main方法的形参必须是一个字符串数组(String[] args是字符串数组的形式)
6.一个java源文件爱你可以包含多个类定义,但最多只能包含public类定义;如果java源文件里包含public类定义,则该源文件的文件名必须与这个public类的类名相同
7.java的堆内存是一个运行时数据区,用以保存类的实例(对象),java虚拟机的堆内存中存储着正在运行的应用程序所简历的所有对象,这些对象不需要程序通过代码来显示地释放。在java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾,JVM的一个超级线程会自动释放该内存区。
<当我们编写java程序时,一个基本的原则是:对于不再需要的对象,不要再引用他们。如果我们保持了对这些对象的引用,来济回收机制暂时不会回收该对象,则会导致系统可用内存越来越少>
第二章 理解面向对象
- Java完全支持面向对象的三种基本特征:
继承(Inheritance):集成是面向对象实现复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法
封装(Encapsulation):封装是指将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能
多态(Polymorphism):多态是指子类对象直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象字啊运行时可能表现出不同的行为特征
- 结构化程序设计方式的局限性有如下两个:
设计不够直观,与人类习惯思维不一致,
适应性差,课扩展性不强。由于结构化设计采用自定向下的设计方式,所以当用户的需求发生改变时,都需要自定向下地修改模块结构,这种方式的维护成本相当大
- 面向对象和基于对象的区别
“面向对象”和“基于对象”的都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而基于对象没有实现这些
4.UML:uml是一种定义良好、易于表达、功能强大且普遍适用的建模语言
第三章 数据类型和运算符
3.1注释
单行注释
多行注释
文档注释:API文档是什么?用以说明应用程序接口(API)的文档
2.在命令行下用javadoc工具生成api文档
-d <directory>:改选项指定一个路径,用于将生成的API文档放到指定目录下
-windowtitle <text> :改选项指定一个字符串,用于设置API文档的浏览器窗口标题
-doctitle <html-code>:改选项指定一个HTML格式的文本,用于指定概述页面的标题
例子(根据源文件):
javadoc -d apidoc -windowtitle 测试 -doctitle 学习javadoc工具的测试API文档 -header 自定义类 –version -author test*.java
(java默认不会提取@author和@version两个标记的信息,如果需要提取这两个标记的信息,应该在使用javadoc工具时指定-author 和 –version两个选项)
例子(根据包结构):
javadoc -d apidoc -windowtitle 测试 -doctitle 学习javadoc工具的测试API文档 -header 自定义类 –version -author lee yeeku
3.2标识符而后关键字
1、Java语言的标识符必须以字母、下划线、美元符开头,后面可以跟任意数目的字母、数字、下划线和美元符。(不能使用java的关键字和保留字,标识符的长度没有限制)
具体规则:
1)标识符可以由字母、数字、下划线和美元符组成,其中数字不能开头
2)标识符不能是java关键字和保留字,但可以包含关键字和保留字
3)标识符不能包含空格
4)标识符只能包含美元符($),不能包含@、#等其他特殊字符
2、java的所有关键字都是小写,TRUE,FALSE,NULL都不是java关键字
3、java语言的标识符也不能使用goto、const两个保留字(保留字:java现在还未使用这两个单词作为关键字,将来可能使用)和true、false、null三个特殊的直接量
3.3数据类型分类
1、Java语言支持的类型分为两类:基本类型(Primitive Type)和引用类型(Reference Type)
2、空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个null值赋给基本数据类型的变量
3.4基本数据类型
整类型:
1个字节:byte
2个字节:short
4个字节:int
8个字节:long
字符类型:
2个字节:char
浮点类型:
4个字节:float
8个字节:double
布尔类型:
1位:boolean
1)只有浮点浮点类型的数值才可以使用科学技术形式表示
2)在java语言中,boolean类型的数值只能是true或false,不能用0或或者非0代表
3)自动类型转换:
3.7运算符
包装类的实例实际上是引用类型,只有两个包装类指向同一个对象时才会返回true
第四章 流程控制和数据
1) 在使用if…else语句有一条基本规则:总是优先把包含范围小的条件放在前面处理。(如,age>60和age>2两个条件,明显age>60范围更小,所以应该先处理age>60的情况)
2) 使用switch语句时,有两个值得注意的地方:第一个地方时switch语句后的expression表达式的数据类型只能是byte,short,char,int类型;第二个地方时如果省略了case后代码块的break时所引起的陷阱
3) For循环和while、do while循环不一样:由于while、do while循环的循环迭代语句紧跟着循环体,因此如果循环体不能完全执行,如使用continue来结束本次循环,则循环迭代语句不会被执行。但for循环的循环迭代语句并没有与循环体放在一起,因此不管是否使用continue来结束本次循环,循环迭代语句一样会获得执行。
4) Break循环:break循环不仅可以结束其所在循环,还可以直接结束其外层循环。此时需要在break后紧跟一个标签,这个标签用于标识一个外层循环体
public class TestBreak {
public static void main(String[] args) {
outer:
for(int i=0;i<5;i++)
{
for(int j=0;j<3;j++)
{
System.out.println("i值:"+i+"j值:"+j);
if(j==1)
{
break outer;
}
}
}
}
}
输出:i值:0j值:0
i值:0j值:1
而如没有标识符outer则为
public class TestBreak {
public static void main(String[] args) {
for(int i=0;i<5;i++)
{
for(int j=0;j<3;j++)
{
System.out.println("i值:"+i+"j值:"+j);
if(j==1)
{
break;
}
}
}
}
}
输出:
i值:0j值:0
i值:0j值:1
i值:1j值:0
i值:1j值:1
i值:2j值:0
i值:2j值:1
i值:3j值:0
i值:3j值:1
i值:4j值:0
i值:4j值:1
4.5数组类型
1)Java的数组既可以存储基本数据类型的数据,也可以存储引用类型的数据。只要所有数组元素具有相同类型即可
2)值得注意的是:数组也是一种数据类型,他本身是一种引用类型。例如:int是一个基本类型,但int[](这是定义数组的一种方式)就是一种引用类型
3)java语言中数组必须先初始化,然后才可以使用。所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值
数组的初始化有两种方式:
(1) 初始化时由程序员显示指定每个数组的初始值,由系统决定需要的数组长度
(2) 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值
5) 使用foreach循环迭代数组时,并不能改变数组元素的值,因此不要对foreach的循环变量进行赋值
4.6深入数组
1)数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素
2)实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中
3)什么有栈内存和堆内存之分?
答:当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在合适的时候回收它。
第五章 面向对象(上)
1) static修饰的成员不能访问没有static修饰的成员
2) java语言提供了一个功能:如果程序员没有为一个类编写构造器。则系统会为该类提供默认的构造器。一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器
3)
第六章 面向对象(下)
1)
6.2处理对象
1)toString方法是一个非常特殊的方法 ,它是一个“自我描述”的方法,该方法通常用于:当程序员直接打印该对象时,系统将会输出对象的“自我描述”信息
2)==和equels比较
对于两个引用类型的变量,必须它们指向同一个对象时,==才会放回true
equels方法也是Object类提供的一个实例方法,因此所有引用变量都可以调用该方法来判断是否与其他变量相等。但这个方法判断两个对象相等的标准和==符号没有区别。如果希望采用自定义的相等标准,可采用重写equels方法来实现(例如:String已经重写了Object的equels方法,String的equels方法判断两个字符串相等的标准是:只要两个字符串所包含的字符序列相同)
4) 不能在普通方法中为final成员变量指定初始值(只能在定义该属性时,在普通初始化块中,或构造器中)
5) Final修饰基本类型和引用类型变量的区别:当使用final修饰变量基本变量时,不能对基本类型变量重新赋值因此基本类型变量不能被改变。但对于引用类型的变量而言,他包寻的仅仅是一个引用,final只保证这个引用所引用的地址不会改变,而引用所指向的对象可以改变
6) 不可变类:创建该类的实例后,该实例的属性是不可改变的;与可变类相比,不可变类对象在整个生命周期中永远处于初始化状态,它的属性不可改变。因此对不可变类的实例的控制将更加简单
7)
第七章 Java集合
第八章 泛型
第九章 与运行环境交换
第十章 异常处理
第十一章 AWT编程
第十二章 Swing编程
第十三章 JDBC编程
第十四章 Annotation(注释)
第十五章 输入/输出
第十六章 多线程
第十七章 网络编程
第十八章 类加载和反射
备注:
【1】什么是JIT?
JIT是just in time,即时编译技术。使用该技术,能够加速java程序的执行速度。下面,就对该技术做个简单的讲解。
首先,我们大家都知道,通常javac将程序源代码编译,转换成java字节码,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢。为了提高执行速度,引入了JIT技术。
在运行时JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,采用该JIT技术可以,可以接近以前纯编译技术。下面我看看,JIT的工作过程。
当JIT编译启用时(默认是启用的),JVM读入.class文件解释后,将其发给JIT编译器。JIT编译器将字节码编译成本机机器代码,下图展示了该过程。
通过上面的解释,我们了解了JIT的工作原理及过程,同样也发现了个问题,由于JIT对每条字节码都进行编译,造成了编译过程负担过重。为了避免这种情况,当前的JIT只对经常执行的字节码进行编译,如循环等。
需要说明的是,JIT并不总是奏效,不能期望JIT一定能够加速你代码执行的速度,更糟糕的是她有可能降低代码的执行速度。这取决于你的代码结构,当然很多情况下我们还是能够如愿以偿的。