Java基础语法学习笔记

编程 · 2023-10-09 · 247 人浏览

准备工作

JRE = JVM + 核心类库。JRE(Java运行环境),JVM(Java虚拟机,真正运行Java程序的地方),核心类库(Java已经写好的程序,供程序员调用)。

JDK = JRE + 开发工具。JDK(Java开发工具包),开发工具(java、javac等)。

安装JDK

官网下载:https://www.oracle.com/cn/java/technologies/downloads/,为了便于管理,建议采用Compressed Archive版本。

配置环境变量

配置Path环境变量:右键「此电脑」→「属性」→「高级系统设置」→「环境变量」→「系统变量」→「新建」,变量名:JAVA_HOME,变量值:填写JDK安装路径,如:C:\dev\java\jdk-21.0.4。

双击系统变量下的Path环境变量,新建%JAVA_HOME%\bin并上移到第一位,最后点击确定即可。

测试JDK

打开CMD窗口,输入:java -version,测试JDK是否安装成功。

业内大多数程序员都在遵守阿里巴巴的命名规则:《阿里巴巴Java开发手册(终极版)》。

IDEA

IDEA全称IntelliJ IDEA,是用于Java语言开发的集成环境,是业界公认的目前用于Java程序开发最好的工具。

IntelliJ IDEA官网:https://www.jetbrains.com/idea/download/

IntelliJ IDEA正版专属激活码领取(永久更新):

项目结构

  • project(项目、工程)
  • module(模块)
  • package(包)
  • class(类)

project中可以创建多个module,module中可以创建多个package,package中可以创建多个class。

IDEA常用快捷键

  • main:快速输入相关代码
  • Ctrl + D:复制当前行到下一行
  • Ctrl + X:删除所在行
  • Ctrl + Alt + L:格式化代码
  • Shift + Alt + ↑,↓:上下移动当前代码
  • Ctrl + /,Ctrl + Shift + /:代码注释
  • Alt + Enter:强制类型转换

基础语法

标识符

就是给类,方法,变量等起的名字。

标识符命名规则--硬性要求:

  • 必须由数字、字母、下划线_、美元符号$组成
  • 数字不能开头
  • 不能是关键字
  • 区分大小写

软性建议:

  • 小驼峰命名法:适用于变量名和方法名
  • 大驼峰命名法:适用于类名

数据类型

基本数据类型,4大类8种:

  • 整型:byte 1 字节,short 2 字节,int默认 4 字节,long 8 字节
  • 浮点型:float,4字节;double默认,8字节
  • 字符型:char,2字节
  • 布尔型:boolean,1字节
// 默认是int类型,字面量后面加 L/l 变成long类型
long lg = 100L;
// 默认是double类型,字面量后面加 F/f 变成float类型
float f = 3.14F;

引用数据类型,String、数组。

获取键盘输入

public class HelloWorld {
    public static void main(String[] args) {
        // 得到一个键盘扫描器对象
        Scanner sc = new Scanner(System.in);
        // 调用sc,接收键盘输入数据
        System.out.println("姓名:");
        String name = sc.next();
        System.out.println("年龄:");
        int age = sc.nextInt();
        System.out.println(name + age + "岁");
    }
}

分支结构

switch 注意事项:

  • 表达式类型只能是byte、short、int、char。JDK 5开始支持枚举,JDK 7开始支持String,不支持long、float、double
  • case值不允许重复,且只能是字面量,不能是变量
  • 不要忘记写break,否则会出现穿透现象

循环结构

for循环中控制循环的变量只能在循环中使用,while循环中控制循环的变量在循环后还可以继续使用。

生成随机数

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(createCode(4));
    }

    public static String createCode(int n) {
        // 创建Random对象,用于生成随机数
        Random r = new Random();
        // 每位随机字符
        String code = "";
        for (int i = 1; i <= n; i++) {
            int type = r.nextInt(3);
            switch (type) {
                case 0:
                    // 随机一个数字字符 0-9
                    code += r.nextInt(10);
                    break;
                case 1:
                    // 随机一个大写字符 A 65 Z 65+25 (0-25)+65
                    char ch1 = (char) (r.nextInt(26) + 65);
                    code += ch1;
                    break;
                case 2:
                    // 随机一个小写字符 a 97 z 97+25 (0-25)+97
                    char ch2 = (char) (r.nextInt(26) + 97);
                    code += ch2;
                    break;
            }
        }

        return code;
    }
}

内存分配

Java为了便于虚拟机执行Java程序,将虚拟机内存划分为:

  • 方法区:字节码文件先加载到这里
  • 栈:方法运行时所进入的内存,变量也在这一块区域中
  • 堆:new出来的东西,会在这块内存中开辟空间并分配地址
  • 本地方法栈
  • 程序计数器

面向对象

this关键字,就是一个变量,用在方法中,可以拿到当前类的对象,即方法调用者的地址值。

构造器其实是一种特殊的方法,但这个方法没有返回值类型,方法名必须和类名相同。在创建对象时,会调用构造器。也就是说new Student()就是在执行构造器,当构造器执行完了,也就意味着对象创建成功。

在设计一个类时,如果不写构造器,Java会自动生成一个无参数构造器。一旦定义了有参数构造器,Java就不再提供空参数构造器,此时建议加一个无参数构造器。

权限修饰符

封装设计规范用8个字总结,就是:合理隐藏、合理暴露,这就需要用到修饰符。

修饰符本类同一包下其他类任意包下子类任意包下任意类
private
缺省
protected
public

private < 缺省 < protected < public

实体JavaBean

一般称之为实体类,可以使用PTG插件1秒生成标准JavaBean。

实体类是一种特殊形式的类,只负责数据存取(除了给对象存、取值的方法就没有提供其他方法了),而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离(应用场景)。

super

super:代表继承的父类。

final

final修饰方法:表明该方法是最终方法,不能被重写;修饰类:表明该类是最终类,不能被继承;修饰变量:叫做常量,只能被赋值一次。

继承

成员变量:在子类的对象中,会把父类的成员变量也继承下的。

成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。

方法重写小技巧:使用@Override注解,可以指定iava编译器,检查方法重写的格式是否正确,代码可读性也会更好。

多态

同类型的对象,表现出的不同形态,即为多态。

多态的表现形式:父类类型 对象名称 = 子类对象;

多态的前提:

  • 有继承关系
  • 有父类引用指向子类对象
  • 有方法重写

抽象类

如果一个类中存在抽象方法,那么该类就必须声明为抽象类。抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

使用abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。定义格式:修饰符 abstract 返回值类型 方法名(参数列表);

接口

接口是一种规则,是对行为的抽象。

接口和类的关系:

  • 类和类:继承关系,只能单继承,不能多继承,但是可以多层继承
  • 类和接口:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口:继承关系,可以单继承,也可以多继承

字符串

String类常用方法

public class HelloWorld {
    public static void main(String[] args) {
        String s = "好abc";
        // 字符串遍历
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            System.out.println(ch);
        }

        System.out.println("-------------------");

        // 字符串转字符数组,再遍历
        char[] chars = s.toCharArray();
        for (char aChar : chars) {
            System.out.println(aChar);
        }

        System.out.println("-------------------");

        System.out.println(createCode(4));
    }

    public static String createCode(int n) {
        String code = "";
        String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        Random r = new Random();
        for (int i = 0; i < n; i++) {
            int index = r.nextInt(data.length());
            code += data.charAt(index);
        }

        return code;
    }
}

StringBuilder

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的,作用是提高字符串的操作效率。

StringJoiner

跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的,作用是提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用,因为JDK8才出现这个类。

集合

集合和数组的优势对比:

  • 长度可变
  • 添加数据的时候不需要考虑索引,默认将数据添加到末尾
public class HelloWorld {
    public static void main(String[] args) {
        // 创建ArrayList集合对象
        ArrayList<String> list = new ArrayList<>();

        list.add("Python");
        list.add("Java");
        list.add("Python");
        System.out.println(list); // [Python, Java, Python]

        // 往集合某个索引位置处添加数据
        list.add(1, "MySQL");
        System.out.println(list); // [Python, MySQL, Java, Python]

        // 根据索引获取集合中某个索引位置处值
        String rs = list.get(1);
        System.out.println(rs); // MySQL

        // 获取集合大小,即存储的元素个数
        System.out.println(list.size()); // 4

        // 根据索引删除集合中的某个元素,返回被删除的元素
        System.out.println(list.remove(1)); // MySQL

        // 直接删除某个元素,默认删除第一次出现的数据,删除成功返回true
        System.out.println(list.remove("Python"));  // true
        System.out.println(list); // [Java, Python]

        // 修改某个索引位置处的数据,修改后会返回原来的值
        System.out.println(list.set(1, "JS")); // Python
        System.out.println(list); // [Java, JS]
    }
}

Collection单列集合

  • List系列集合:添加元素是有序、可重复、有索引
  • Set系列集合:添加元素是无序、不重复、无索引

List

Set

Map双列集合

Lambda表达式

JDK 8开始后的一种新语法形式。

Java
Theme Jasmine by Kent Liao