常见编程语言入门:java

544 阅读5分钟

已知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,具体参考这里


完结