Java基础知识复习

news2024/11/28 23:39:55

文章目录

  • 复习
    • 1. Java编译和运行
    • 2. Java运行环境
    • 3. Java注释
    • 4. Java中的打印
    • 5. 数据类型
      • 整形
      • 浮点型
      • 字符类型
      • 字节类型
      • 布尔类型
      • 数据类型转换
        • 强制类型转换
        • 隐式类型转换
      • 小结
    • 6. 变量命名规范
    • 7. 运算符
      • 算数运算符
      • 逻辑运算符
      • 移位运算符
      • 关系运算符
    • 8. switch
    • 9. 方法
      • 方法的重载
      • 可变参数变程
      • 方法的调用
    • 10. 数组
      • 一维数组的创建方式
      • 一维数组在内存中的存储
      • 数组的拷贝
      • 一维数组的打印
      • 二维数组的创建
      • 二维数组在内存中的存储
      • 二维数组的打印


复习

1. Java编译和运行

public class Main{
    public static void main(String[] args) {
        System.out.println("hello world!");
    }
}

假设Java代码文件名为Main.java

  • 通过 javac 文件名(需要带后缀)编译Java代码文件,生成一个.class的字节码文件(一个class类生成一个.class文件)

    javac Main.java
    
    • 如果代码里包含中文,想解决乱码就需要在编译时指定编码格式,-encoding

      javac -encoding Main.java
      
  • 一个Java文件只能包含一个public类,一但这个类被public所修饰,那么这个类名要和文件名相同

  • 通过java 文件名运行Java文件(文件名不需要带后缀)

    java Main
    
  • String[] argsargs是一个数组,也是Java运行时参数

    下面的代码只要在java命令运行时文件名后面加上参数,就能存放导 args数组中并打印出来

    java Main 1 2 3
    
    public class Main{
        public static void main(String[] args) {
            for (int i = 0; i < args.length; i++) {
                System.out.println(args[i]);
            }
        }
    }
    

2. Java运行环境

一个Java代码,也就是一个.java文件通过编译生成一个.class

  • JDK(Java开发者工具)

    Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译
    器javac与自带的调试工具Jconsole、jstack等

  • JRE(Java运行时环境)

    • Java运行时环境,包含了JVM,Java基础类库。是使用Java语言编写程
      序运行的所需环境
  • JVM(Java虚拟机)

    • 编译完的.class文件是跑在Java虚拟机上的,JVM也是Java跨平台的关键。

在这里插入图片描述

3. Java注释

  • 单行注释

    public class Main{
        // 单行注释
        public static void main(String[] args) {
            System.out.println("hello");
        }
    }
    
  • 多行注释

    public class Main{
        /*
        多
        行
        注
        释
         */
        public static void main(String[] args) {
            System.out.println("hello");
        }
    }
    
  • 文档注释

    文档注释也时多行注释的一种

    public class Main{
        /**
         * 文档注释
         * @param args
         */
        public static void main(String[] args) {
            System.out.println("hello");
        }
    }
    

4. Java中的打印

  • 打印且换行

    System.out.println();
    
  • 打印不换行

    System.out.print();
    
  • 格式化打印

    Java中也提供了和C语言类似的格式化打印

    System.out.printf("%d\n",10);
    

5. 数据类型

在Java中一共有8种数据类型,8种数据类型都分别对应各自的包装类。且在Java中不存在无符号数,无论在什么平台上数据类型的大小都是一致的,这也是Java跨平台的体现。

数据类型所占内存空间对应包装类
int4个字节Integer
long8个字节Long
float4个字节Float
double8个字节Double
char2个字节Character
short2个字节Short
booleanJVM中没有规定大小Boolean
byte1个字节Byte

比如int能表示的数据范围为 − 2 31   2 31 − 1 -2^{31}~2^{31}-1 231 2311,那拿int的最大值加上1会发生什么?或者拿int的最小值减去1又会发生什么?

public class Main{
    public static void main(String[] args) {
        int max = Integer.MAX_VALUE;/
        int min = Integer.MIN_VALUE;
        System.out.println(max);
        System.out.println(min);
        System.out.println("========");
        System.out.println(max+1);
        System.out.println(min-1);
    }
}

运行结果

2147483647
-2147483648
========
-2147483648
2147483647

我们发现最大值+1变成了最小值,最小值-1变成了最大值,其它基本数据类型也时存在的(浮点数除外)。

在这里插入图片描述

又或者是

public static void main(String[] args) {
        int a = 128;
        byte b = (byte)a;
        System.out.println(b);
    }

打印结果

-128

整形

Java中短整形short有整形int和长整形long,如果要声明一个整形是长整形只需在数字后面加上L或者l(建议使用大写L)

short a = 10;
int b = 20;
long c = 30;
long d = 40L;
long f = 50l;

浮点型

Java中有单精度浮点型float和双精度浮点型double,注意在Java中浮点数默认是double类型。所以如果要使用float就得在变量后面加上F来声明这是一个float类型的数字,或者使用强制类型转换。

float a = 3.14f;
float b = 3.14F;
float c = (float)3.14;

字符类型

在Java中用char表示字符型,Java中字符采用Unicode编码,一个字符占两个字节。且可以保存一个汉字,一个汉字也是占两个字节。需要注意char类型在Java中是不能够给负数的

char ch = '好';
char c = 'a';
char n = 100;

字节类型

在Java中有一个字节类型byte,它占一个字节对标的是C语言中的char,取值范围为-128~127

byte a = 127;
byte b = -128;

来看一段代码

public class Main{

    public static void main(String[] args) {
        byte b1 = 10;
        byte b2 = 20;
        byte b3 = 10+20;
        byte b4 = b1+b2;//编译错误
        byte b5 = b1 + 1;//编译错误
    }
}

这段代码byte b4 = b1+b2;byte b5 = b1 + 1;都会编译错误,而前面的byte b3 = 10+20;并没有报错这是为什么呢?

  • b3不报错是因为在编译期间就被替换成byte b3 = 30;了,所以不会报错
  • b4报错是因为,编译器不确定b1和b2里的值是啥,因为它们两个是变量所以为了安全,编译器就会报错。
  • 而b5报错就牵扯到类型提升了,计算机在读取数据的时候都是4个字节来读取的,在计算的时候当一个数据不足4个字节时,为了提高计算速度,就会进行整形提升,将byte提升成int类型。

布尔类型

boolean的取值只能是true或者false

boolean flag = false;
boolean t = true;

数据类型转换

强制类型转换

public static void main(String[] args) {
        double a = 3.14;
        int b = (int)a;
 }
  1. 强制类型转换可能会导致精度丢失. 如刚才的例子中, 赋值之后,3.14 就变成 3 了, 小数点后面的部分被忽略.
  2. 强制类型转换不是一定能成功, 互不相干的类型之间无法强转,比如int和booean之间就不能进行强制类型转换。

隐式类型转换

java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验.

public static void main(String[] args) {
        double a = 3.14;
        long b = 10L;
        int c = 20;
        
        a = b;
        a = c;
        b = c;
        // 下面写法都是错误的
        b = a;
        c = b;
        c = a;
    }

结论: 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行.

从上往下,说明double可以接收它下面的所有类型。

注意:char比较特别,因为它不能接收负数,所以char不能接收byte的值。

double a = 3.14;
float b = (float)1.23;
long c = 10;
int d = 20;
short e = 30;
char f = 10;
byte g = 6;
  1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型.
  2. 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失.
  3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查.

小结

注意事项:

Java是一个强类型语言,在使用数据类型的时候需要注意。

  • 数字默认是整形
  • 小数默认是double类型
  • 不要把char类型和整形挂勾,char是不能够接受负数的
  • 在给变量赋值时不能超过它的数据范围
  • byte类型其实对应的是C语言的char类型
  • boolean的值,只能是True或者False
  • boolean类型的大小由于没有规定,有的书上书上说是1个位,或者说一个字节。
  • char采用Unicode编码占两个字节
  • 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算
  • 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型.
  • 局部变量在使用之前一定要初始化

6. 变量命名规范

  • Java的变量名可以有数字母下划线和$符组成,但不能以数字开头。
  • 关键字不能作为变量名
  • 变量名一般以小驼峰形式(多个单词除第一个外,其他单首字母大小

7. 运算符

算数运算符

+、-、*、/、%,没啥好说的。

注意点:在Java中是可以对浮点数使用%的,且0不能作为除数不然会抛出异常。

public static void main(String[] args) {
    double num = 1.25;
    System.out.println(num%1);
}
//输出0.25

还有+=、-=、/=、*=、%=、>>=、<<=、>>>=

代码示例:

下面这段代码b = b+a;编译错误,b += a;正常运行,是因为+=自动进行了强制类型转换,

public static void main(String[] args) {
    long a = 10;
    int b = 20;
    b = b+a;//编译错误
    b += a;// 正常运行
}

逻辑运算符

逻辑运算符有:

  • 逻辑与&&(短路与)

  • 逻辑或||(短路或)

  • 逻辑非!(只能对布尔类型使用)

  • 对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式

  • 对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式

  • &| 如果操作数为 boolean 的时候, 也表示逻辑运算. 但是和 && 以及 || 相比, 它们不支持短路求值

移位运算符

  • 左移<<:最高位不要,末尾补0
  • 右移>>:最低位不要,最高位补符号位
  • 无符号右移:>>>:最低位不要,最高位补0

关系运算符

== != < > <= >= 都是关系运算符,它们的返回值都是boolean类型

8. switch

long float double boolean 都不可以作为switch的参数

除了这些基本数据类型,后续说道的枚举enumString也可以作为Switch的参数

9. 方法

方法的重载

重载的要求

  • 方法名相同
  • 方法的参数类型和个数不相同
  • 返回值是不做要求的

可变参数变程

在Java中存在一种非常特殊的语法,可变参数编程,就是一个方法的参数我们不知道有几个的时候,可以使用int...这种类型来接收1个或者多个整形变量。

public class Main {
    public static int sum(int... array) {
        int sum = 0;
        for (int num : array) {
            sum += num;
        }

        return sum;
    }
    public static void main(String[] args) {
        System.out.println(sum(1));
        System.out.println(sum(1,2));
        System.out.println(sum(1,2,3));
        System.out.println(sum(1,2,3,4));
        System.out.println(sum(1,2,3,4,5,6,7,8,9,10));
    }

}

方法的调用

方法的调用实在栈的也就是JVM中的Java虚拟机栈,局部变量也是在栈栈开辟空间。

  • 在Java中是拿不到栈上的地址的,但能拿到堆区的地址
  • 每一次函数的调用,操作系统都会在内存的栈区上开辟一块空间,称为栈帧
  • 栈区的空间是有限的,如果一个方法递归程度过深就会出现栈溢出异常。

假设有这么一段代码

public class Main {
    public static int Add(int x, int y)
    {
        int z = 0;
        z = x + y;
        return z;
    }

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = Add(a, b);
    }

}

在这里插入图片描述

10. 数组

一维数组的创建方式

注意等号左边的[]里是不能写数字的

public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = new int[]{1,2,3,4,5};
        int[] arr3 = new int[5];//定义未使用,里面的元素默认是0
        int[] arr4;//未初始化不能使用
        //这种写法也是可以的
        int arr[] = {1,2,3,4,5};
    }

一维数组在内存中的存储

假设有这么几个数组,它们是在哪存储的?

int[] arr1 = {1,2,3,4,5};
int[] arr2 = new int[]{1,2,3,4,5};
int[] arr3 = new int[5];

我们知道局部变量是在栈上开辟空间的,而只要new了的就会在堆上开辟内存。

堆上的对象是由JVM自动回收的,回收的原则是如果当前对象没有人引用的时候,JVM的垃圾回收器就会自动回收该对象

其实向arr1这些数组名,其实就是一个变量,它是一个引用存放的是数组的地址,简单来说就是arr1是一个引用它指向了一个数组对象。

我们可以直接打印数组名就得到一个地址,但这个地址不是真实的地址,而是通过hash得到的一个唯一的地址。

在这里插入图片描述

数组的拷贝

以下几种方式其实都是浅拷贝,但如果单纯的拷贝基本数据类型那也算是深拷贝。

数组的拷贝一共有三种方式

  • Arrays.copyOf(原数组, 新数组长度)
public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
  • System.arraycopy(原数组,原数组起始下标,目标数组,目标数组其实下标,要拷贝的长度)

    public static native void arraycopy(Object src,  int  srcPos,
                                            Object dest, int destPos,
                                            int length);
    

    这种native方法是本地方法,运行在本地方法栈上的,底层是由C/C++实现,速度快。而上面的copyOf函数的实现也是调用这个方法

  • 数组名.clone

    这种方法是直接产生一个新的副本

一维数组的打印

一维数组的三种打印方式

public class Main {

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};

        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
        for (int tmp : array) {
            System.out.print(tmp+" ");
        }
        System.out.println();
        System.out.println(Arrays.toString(array));
    }

}

二维数组的创建

int[][] array1 = {{1,2,3},{4,5,6}};
int[][] array2 = new int[2][3];
int[][] array3 = new int[][]{{1,2,3},{4,5,6}};

二维数组在内存中的存储

在Java中二维数组的每一行都是一个一维数组,每一行存的都是对应一维数组的地址。

假设有那么一个数组

int[][] array1 = {{1,2,3},{4,5,6}};

在这里插入图片描述

二维数组的打印

三种打印二维数组的方式

public class Main {

    public static void main(String[] args) {
        int[][] array = {{1,2,3},{4,5,6}};
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j]+" ");
            }
            System.out.println();
        }
        for (int[] arr: array) {
            for (int tmp : arr) {
                System.out.print(tmp+" ");
            }
            System.out.println();
        }
        System.out.println(Arrays.deepToString(array));
    }

}

`

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

http请求走私详解

前言 HTTP请求走私是一种干扰网站正常处理从一个或多个用户收到的HTTP请求的方法&#xff0c;请求走私漏洞在本质上通常很关键&#xff0c;允许攻击者绕过安全控制&#xff0c;获得对敏感数据的未授权访问&#xff0c;并直接危害其他应用程序的用户。 随便提一句&#xff1a;…

关系抽取概念及相关论文解读

1.信息抽取概述 信息抽取是构建知识图谱的必要条件。知识图谱中以&#xff08;subject&#xff0c;relation&#xff0c;object&#xff09;三元组的形式表示数据。信息抽取分为两大部分&#xff0c;一部分是命名实体识别&#xff0c;识别出文本中的实体&#xff0c;另外就是关…

【dp】排列问题——零钱兑换和组合总和IV

文章目录零钱兑换组合总和IV零钱兑换 很明显&#xff0c;本题使用完全背包算法&#xff0c;求解的是组合数&#xff0c;直接使用完全背包算法即可&#xff0c;为什么是组合数呢&#xff1f; 如果题目说 amount5&#xff0c;coins[1,2,5] 有9种方法&#xff0c;那就是排列数&am…

探秘SSD磨损均衡和闪存管理

一块2TB的SSD要进行3000PE耐久度测试&#xff0c;需要在顺序写入方式下&#xff08;写入放大比接近1&#xff09;写入2TB x 30006000TB的数据&#xff0c;这需要相当长的时间才能完成。有朋友可能会问&#xff1a;在SSD里划分一个1GB容量的小分区&#xff0c;往里面覆盖写入300…

2022年总结:责任驱动开源

文章目录概览阅读2022阅读清单2023 阅读目标文章2022文章列表2023 目标社区WeDataSpherecube-studio &#xff08;aiops平台&#xff09;社区展望小结概览 2022年一年过去&#xff0c;在此总结过往&#xff0c;展望未来&#xff0c;每年都写总结&#xff0c;我希望继往开来&am…

STC单片机基于Keil平台在线调试仿真

STC单片机基于Keil平台在线调试仿真⚡目前STC32G12K128型号的单片机仅支持需要通过SWD接口&#xff08;STC-USB LINK 1D&#xff09;进行调试&#xff0c;STC8H系列可以通过HID接口或者串口进行调试&#xff0c;其他不带HID功能型号的只能通过串口进行调试。 ✨初次调试&#x…

RHCE——编写playbook ansible

1.按照要求定义以下变量。&#xff08;可以在多个位置下定义实现相应操作即可&#xff09; | 变量名 | 值 | | --------- | ------- | | file_name | newfile | | user_name | devops | | pk_name | httpd | 2.编写任务模块在node1和node2主机中根据以上变量值创建对应文本文件…

IPC进程间通信-管道

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、了解进行间通信①进程间通信的必要性②进程间通信的技术背景二、管道①管道原理管道原理&#xff0c;三步走管道pipe②匿名管道进程间通…

CANoe-System And Communication Setup介绍

如同经典通信模式中,在Simulation Setup界面创建网络、添加节点、导入dbc数据库一样,新型通信模式使用System And Communication Setup完成这些配置 System And Communication Setup是通信配置的中心起点,在这里你可以配置: 应用层(application models)通信层(communic…

【自学Python】Python bytes类型

Python bytes类型 Python bytes类型教程 Python3 新增了 bytes 类型&#xff0c;用于代表字节序列。 字符串(string) 是一串字符组成的序列&#xff0c;字符串处理的基本单位是字符&#xff0c;bytes 类型是一串字节组成的序列&#xff0c;bytes 类型处理的基本单位是字节。…

三维重建基础: 坐标系 (更新中)

文章目录概述计算机视觉&#xff1a;投影矩阵M&#xff1a; 世界坐标系 -> 像平面坐标系相机坐标系 -> 像平面坐标系&#xff1a;世界坐标系 -> 相机坐标系计算机图形&#xff1a;MVP变换view/camera 变换常见坐标系定义colmap中的坐标系线性代数相关基础待办附录概述…

微信小程序安装 Vant 组件库与API Promise组件库

在项目内右键空白处选择在外部终端打开2、在终端窗口输入 npm init -y,创建package-lock.jsonnpm init -y3、在终端输入npm i vant/weapp1.3.3 -S --production&#xff0c;创建node_modules文件夹npm i vant/weapp1.3.3 -S --production4、详情&#xff0d;本地设置&#xff0…

安信证券资管清算重要业务在原生分布式数据库的创新实践

作者&#xff1a;安信证券信息技术委员会运维部系统平台室 刘盛彩、肖昭、张杰 来源:《金融电子化》 近日&#xff0c;《国务院关于数字经济发展情况的报告》&#xff08;以下简称报告&#xff09;提请十三届全国人大常委会第三十七次会议审议&#xff0c; 报告提出&#xff1a…

【Vue + Koa 前后端分离项目实战8】使用开源框架==>快速搭建后台管理系统 -- part8 【权限控制联调】

不要为了不值得的事和人感伤悲秋 本章主要关联章节&#xff1a;【Vue Koa 前后端分离项目实战3】使用开源框架&#xff1e;快速搭建后台管理系统 -- part3 权限控制行为日志_小白Rachel的博客-CSDN博客_koa权限管理 本章主要实现综合的系统权限管理 目录 一、权限控制说明 二…

【Linux】Linux常用指令(28个,以及热键,关机重启)

文章目录1、ls 指令2、pwd 命令3、cd 指令4、touch 指令5、mkdir 指令6、rmdir和rm 指令7、man 指令8、cp 指令9、mv 指令10、cat11、echo(输出&#xff0c;输入&#xff0c;追加重定向)12、wc13、more14、less15、head16、tail(以及管道 | )17、date18、cal19、find(which、wh…

KubeSphere使用外部ES进行日志收集(多行日志)

环境kubesphere &#xff1a; v3.3.1Docker&#xff1a;20.10.8Fluent-Bit&#xff1a;2.0.6-2.0.8ESKibana&#xff1a;7.9.3Docker日志示例{"log":"2023-01-10 11:32:50.021 - INFO --- [scheduling-1] traceId: p6spy : 1|conn-0|statement|SELECT fd_id A…

Java 泛型的介绍和使用

什么是泛型? 1.数据类型变得广泛,或者是数据类型变量化,这就是泛型.(广泛的类型). 2.有一个变量是用来存放一个数据类型,这就叫做泛型. 比如泛型T存放的是一个int 就表示为:Tint 当然T也可以是其他的数据类型,就取决我们给它数据类型. 3.泛型允许程序员在强类型程序设计语…

kafka zookeeper单机版安装部署全教程 含安装包

kafka zookeeper安装部署全教程 含安装包 大家好&#xff0c;我是酷酷的韩~ 一.基础软件安装 1.JDK安装部署 linux安装jdk1.8全教程(包含安装包) 二.安装包准备 1.kafka (kafka_2.12-2.8.0.tgz) https://kafka.apache.org/downloads 2.zookeeper (apache-zookeeper-3.7.…

最近爆火的电子血氧仪的基本原理

继口罩、抗原、药品之后,最近电子血氧仪的价格也开始水涨船高。从一个多月前的100多元,暴涨到了300多元。 那么,这类家用的电子血氧仪是如何工作的呢?测量数据到底准不准?今天就带大家来分析一下。 一、血氧仪工作原理 血氧仪是一种监测脉搏、血氧饱和度等指标的医疗器械…

人工智能-EM算法

目录1、EM算法2、EM算法介绍3、EM算法实例1、EM算法 EM算法&#xff1a;期望最大化算法。解决数据缺失情况下的参数估计问题 它是一个基础算法&#xff0c;是HMM等的基础 期望步:E步,最大步M步 步骤&#xff1a; 1&#xff0c;根据已经给出的观测数据&#xff0c;估计出模型参…