已知c++是java plus,js是java mini,本文是在有c++和js基础上展开的,因此根据夹逼准则,大家已经有了一定的java基础。
概述
java是从c++发展而来,c++由于指针和内存管理等问题不易使用,java在c++的基础上做了减法,比如
- 自动的内存管理替代了手动
- 引用类型替代了指针,注意c++中的引用只是个初始化就不能改的别名
- 不支持操作符重载、不支持预处理器、不支持goto、不支持多继承
- 通过编译成字节码然后在跨平台的运行时上运行,不同于c++的需要针对平台编译
- 类型系统简单,取消了结构和联合等数据结构
java本身还不够简练,因此出现了go。
而js的设计之初就是要有一个语法和java类似的脚本语言,因此语法两者很像,比如都分为基本类型和引用类型,而引用类型基于Obejct
编译和执行
java源代码为.java文件,需要先编译成.class为后缀的字节码,然后在jvm运行时上运行,jvm类似于v8。
基本单位
java程序的class不仅是用来实例化对象的模板,还是代码组织的基本单位,其他逻辑和数据类型都是在class中组织的。一个.java源文件可以包含多个class,但只能有一个public,经过编译后,每个class生成一个.class文件,在每个class中。
public class HelloWorld {
/* 第一个Java程序
* 它将输出字符串 Hello World
*/
public static void main(String[] args) {
System.out.println("Hello World"); // 输出 Hello World
}
}
main函数在java中同样是启动函数,但依然要在一个class中,其他修饰符和参数等概念和c++中类似。
数据类型
数据类型分为基本类型和引用类型,另外void可以表示没有返回值,不能直接操作
基本类型
整数类型
- byte 一位
- short
- int
- long
浮点数类型
- float
- double
字符类型,用单引号
- char
布尔类型
- boolean
以下为不同类型所占用字节数,boolean值没规定具体字节数
引用类型
和js一样,java中的引用类型都是对象,比如数组,和字符串数组或实例化的class,默认为null
变量和常量
变量类型
java中的变量分三种
- 类变量,即静态变量
- 实例变量
- 局部变量,类方法中的变量
public class Variable{
static int allClicks=0; // 类变量
String str="hello world"; // 实例变量
public void method(){
int i =0; // 局部变量
}
}
变量声明
表达式和语句
java中的运算符和流程控制语句与c++基本一致,这里不多讲。
class
程序的各部分逻辑都分布在各个class中,class本身又包含各种字段用来保存数据和方法等,对应的又有很多修饰符来指定各子段的使用情况。基本使用和c++类似,相当于只能在文件作用域使用class的c++(还有interface),泛型等和c++类似的功能暂时不提。 多个class文件还可以打包成一个jar包。
类中还可以嵌套内部类。
包
为了更进一步组织代码,还有package的概念,类似于go中的package,使用package定义,用来避免全局命名空间的命名冲突,如果不声明包,则使用的是默认包。
比如有个helllo.world包,其中包和包之间是独立的,不存在从属关系
package hello.world;
public class Person {
void hello() {
System.out.println("Hello!");
}
}
当使用包时有三种方式,比如我们要访问Person类
- 写全,
hello.world.Person
- 使用import引入
import hello.world.Person
,然后直接使用Person类,也可以讲具体的类名(这里是Person)记为*,就可以把该包下所有类引入 - 使用
import static
导入一个类得静态方法
修饰符
修饰符用来修饰类本身或者其中的字段,分为访问修饰符和非访问修饰符两种。
其中访问修饰符包括四种
- default 默认,可在类、接口、变量、方法时使用
- private 可在变量、方法时使用
- public 可在类、接口、变量、方法时使用
- protected 可在变量、方法时使用,对于不在同一个包的子类,只可以访问从子类继承来的protected方法,如果在一个包,则父类的protected变量方法子类都可以访问
非访问修饰符包括
- static 修饰方法和变量
- final 修饰类、方法和变量。被修饰的类不能被继承,方法不能被重新定义,变量为常量
- abstract 修饰类和方法
- synchronized 和 volatile 用于线程
方法
除了一般的方法,一个类中还可以有一个同名的构造方法,不同构造方法可以根据签名进行重载。
接口
接口interface可以和class在同一级,即直接在文件顶层,接口中用来定义抽象方法,然后被class实现(implements)
继承
继承时使用extends,并用super访问父类的字段,如果没有extends,则默认extends Object
。
如果子类定义和父类相同的方法,则称为覆写,可选添加@Override
,此时签名和被覆写的不一致就会报错。
抽象类是用abstract修饰,只能用于继承的类,抽象类可以有具体的代码实现,接口只能提供存在抽象方法。
java也支持多态。
包管理
js中有npm,java中有Maven,实际上maven不仅仅是包管理工具,更是项目管理工具,这里主要看包管理相关。
maven中的pom.xml相当于npm的package.json,其中定义的依赖包可以去远程仓库拉取,当然远程仓库可以是国内镜像。
maven的其他项目管理功能,类似于npm script,具体参考这里
完结