java 你好
目录
导论
我们通常说的java,一般就是指java编程语言,包含了java编程语言中的语法知识和java中常用的API。
实际上,java技术分为 java编程语言和java平台。
java编程语言中:
.java 文件 是程序员开发的文件-- 由java语法组成,
.class文件 是jvm 执行的文件--由字节码组成,
.java文件 --> .class文件的过程,称为编译。
jvm执行.class文件之前有一个过程称为 类加载
jvm执行.class 是解释执行,即将字节码解释为本地机器码执行。
编程语言是一门特殊的语言,编程语言是 给计算机读的,由人编写的。因此,一个编程语言 首先要人来编写,再由计算机执行。这一过程:
人 通过 语法知识 编写出 需要执行的程序。
通过java技术平台提供的 编译器 javac工具将 人编写的程序 转换为 java虚拟机的语言 字节码。编译肯定也需要执行一些规范检查,看看是否符合语法要求等。如果编译不通过,说明程序编写的有问题或者程序依赖不满足。编译成功后会生成.class文件,该文件是字节码文件。不同的平台上的java虚拟机都可以执行该class字节码文件。通常将一个项目打包为war包,war包里面都是.class文件,java虚拟机拿到了这些class文件,就可以执行了。java技术中提供了启动java虚拟机的工具java。使用该工具启动虚拟机,虚拟机会启动一个主线程来执行man方法。
man方法为: public static void man(String[] args){}
man 方法是一个静态方法,返回值为空。
很多复杂的项目,也是通过一个man方法来启动的,man方法好比一个开关,打开man方法,就是打开了整个项目。
java平台是什么
在计算机中,平台一般指 硬件 和基于硬件的操作系统。
java平台 包括 java虚拟机和API
java虚拟机 完成了 程序的一次编译 处处运行。不同平台都有相对应的java虚拟机。
java语言相比c语言、c++,重要的一点就是内存管理功能。而此功能就是由java虚拟机来完成的。Hotspot虚拟机。
java虚拟机有多种,一般按照虚拟机规范实现的话就可以了。一般用的都是Hotspot。
了解java虚拟机规范,对编写程序和定位问题有很好的帮助。开发人员不需要关心机器码的执行方式,了解 虚拟机 执行 class文件,对程序的理解也有很大的帮助。知其然知其所以然。计算机的内存的使用完全是由程序来完成的,程序要求分配多少内存空间,计算机才会给程序分配,程序说这块内存不需要了,计算机才会回收。都知道,c语言和c++都是自己来管理内存的,java虚拟机其实也是使用c语言和c++来实现的吧。在虚拟机启动时,计算机会分配一定大小的内存空间,这些内存空间的使用权就交给java虚拟机了。对于特殊的服务器来说,可能会装一些必要的应用程序。假如说,这些应用程序都是由java语言开发的,那启动一个应用程序,就等于把计算机的一块内存分给了该程序。蛋糕就这么大,怎么分配内存,给这个虚拟机分配多少内存比较合适呢?这也是考虑的一点。当给虚拟机分配好了内存之后,那这块内存就是由虚拟机来分配了。java虚拟机将内存的管理划分了几个模块。
有方法区、堆区、栈区、程序计数器区。
现代计算机硬件和计算机操作系统都是支持多线程的。多线程可以提高程序的执行效率,充分利用系统资源。java编程语言也是支持多线程开发的。java语言提供了语法方便开发人员快速开发出多线程程序,java虚拟机完成将线程与计算机平台的映射。在java虚拟机内存划分中,也是按照线程来划分的。像堆区的内存中的数据可以是被线程共享的,也就是 线程共享程序的一些资源。栈区是每个线程独占的,栈区主要是指令执行所需要的空间。方法区可以看成是模板区,方法区中存放读取的class文件数据及相关数据。
java应用程序编程接口API,是java技术 提供的 丰富的 编程模块包。开发人员使用这些 API 可以更快速方便的 编写代码。这些api都是基本的常用的功能。可以说,给开发人员提供了丰富的 轮子,不用重复造轮子了。java虚拟机中也有很多方法,在api中通过一个 本地方法 接口 提供给开发人员来直接使用。非常方便。
一些基本知识
1. 类:
关于什么是类,类是什么这种概念性的东西,我就不写了;这里写一下类的常用概念。
声明一个类:需要有修饰符、类名称、继承父类、实现接口、类主体包括 变量、构造器、方法;
声明变量:变量的声明包括修饰符、类型、变量名、变量的赋值
提供构造器:实例化对象的方法
定义方法:类的行为代码,有修饰符、方法名、方法入参类型、方法返回值类型
2. 对象:
创建对象:
(1)声明 对象类型 对象名称
(2)使用new运算符
(3)new运算符紧跟的类提供的 构造器
对象的使用:
对象引用.
垃圾收集器
3.嵌套类
一个类存在 成员变量、成员方法、构造器; 那么 还可能存在一种 叫做嵌套类
比如:
class OutClass{
// field constructor method
class NestedClass{}
}
注意:
class OutClass{
// field constructor method
}
class NestedClass{
}
这种不是嵌套类,他们只是在一个文件中声明的两个类而已。
嵌套类NestedClass 有两种,由static修饰符修饰的 叫 静态嵌套类,没有static修饰符修饰的 叫非静态嵌套类,也称为内部类。
区别:
外部类和内部类的 访问修饰符是有区别的:外部类智能是 public、private修饰;内部类,可以看做是外部类的成员,4种都可以用。
局部内部类:在语句块声明的类,如方法体内;
匿名内部类:
匿名类一般可以在方法体内或者方法调用时的参数的位置来实现
匿名内部类是一个表达式,表达式包含:
(1)new 运算符
(2)要实现的接口名称、或者抽象类名称
(3)后面跟上括号(),括号中包含构造函数的参数,如果是接口,则只有一个括号()就行
(4){} 主体
(5); 因为是语句,所以要用分号结尾
4.Lambda表达式
对Lambda的评价:简洁;
包括:
(1)括号括起来的逗号分割的形式参数列表
可以看成是方法的 参数部分,但是参数不声明类型
如果只有一个参数,可以省略括号
(2)箭头 ->
(3) 主体:由 单个表达式 或者 语句块组成
如果不加箭头:
(a,b){
// 语句块
}
是不是特别像没有名称的方法, 所有 可以把Lambda表达式看成是 匿名方法
方法引用
如果在Lambda 的主体中引用了现在已有的方法,可以直接用两个冒号 :: 来引用现有的方法
Pipelines Stream
这个用官网的描述:
A pipeline is a sequence of aggregate operations.
A pipeline contains the following components:
A source: This could be a collection, an array, a generator function, or an I/O channel. In this example, the source is the collection
roster
.Zero or more intermediate operations. An intermediate operation, such as
filter
, produces a new stream.A stream is a sequence of elements. Unlike a collection, it is not a data structure that stores elements. Instead, a stream carries values from a source through a pipeline. This example creates a stream from the collection
roster
by invoking the methodstream
.The
filter
operation returns a new stream that contains elements that match its predicate (this operation's parameter). In this example, the predicate is the lambda expressione -> e.getGender() == Person.Sex.MALE
. It returns the boolean valuetrue
if thegender
field of objecte
has the valuePerson.Sex.MALE
. Consequently, thefilter
operation in this example returns a stream that contains all male members in the collectionroster
.A terminal operation. A terminal operation, such as
forEach
, produces a non-stream result, such as a primitive value (like a double value), a collection, or in the case offorEach
, no value at all. In this example, the parameter of theforEach
operation is the lambda expressione -> System.out.println(e.getName())
, which invokes the methodgetName
on the objecte
. (The Java runtime and compiler infer that the type of the objecte
isPerson
.)
5. comparator
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
//降序排列
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//o1 代表后面一个数 o2代表前面一个数
if (o1 > o2)return 1; //-1表示交换两个数的位置 所以这里实现的是降序排列
else return -1;
}
});
1 2 3