【Java】C++转Java基础知识

news2024/10/17 5:46:21

1. Java基础知识

1.1 JDK和JVM

在Java中,JDK称为Java开发工具包(Java Development Kit),包含了Java开发需要使用的工具包,前面的版本中JRE和JDK是分开的两个文件夹,从Java9开始,JDK中还包含了JRE(Java Runtime Environment),包含了Java运行的虚拟机JVM和其他,而,原因是Java9引入模块化运行,可能不是每一次的代码运行都需要完整的JRE,根据需要加载可以提高运行效率。

JVM是Java中的运行虚拟机,所有的Java代码程序都会在JVM上运行,从而达到了Java的跨平台性

1.2 Java基础代码演示

 // 此处class后面的名称和当前文件名保持一致
 public class Main {
     public static void main(String[] args) {
         // Java中的输出语句,包括换行
         System.out.println("Hello world!");// Java每条语句都要带分号
     }
 }
 ​
 输出结果:
 Hello world!

在上面的代码中public class中的public不可以去除,因为类名与文件名相同,但是如果类名与文件名不同,则不可以写public。所以,在Java中,一个.java文件中只有一个classpublic class

如果.java文件中有多个class,则编译后将会生成包括public class在内对应个数的.class文件,但是在实际开发中,一般一个.class文件中只有一个class

并且main函数必须在public class

可以使用下面的命令对当前的文件进行编译和运行

 编译:javac Main.java -> 将.java文件编译生成.class文件
 运行:java Main -> 运行.class文件
 // java后的class文件不需要带后缀名

1.3 Java中的注释

在Java中,有下面三种注释方式:

1.//:单行注释

2./*/*:多行注释

3./** */文档(API文档)注释,可以在当前.java文件位置打开控制台使用javadoc -d 文件夹名 -author -version 需要生成文档的Java文件

 // 这是一个单行注释
 ​
 /*
  *  这是一个多行注释
  */
 ​
 /**
  *  这是一个文档注释
  *  可以包含下面的内容
  *  @author 代码的作者
  *  @version 当前代码的版本
  *  
 **/

例如下面的Java程序生成文档注释:

 /**
  * ClassName: test
  * Package: PACKAGE_NAME
  * Description:
  * Hello World测试IDEA
  *
  * @author lza
  * @version v1.0
  */
 public class Main {
     /**
      * main函数
      */
     public static void main(String[] args) {
         System.out.println("Hello world!");
     }
 }

1.4 Java中的关键字

 48个关键字:
 abstract assert boolean break byte case catch char class continue default do double else enum extends final finally float for if implements import int interface instanceof long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while
 ​
 3个特殊直接量:
 true false null
 ​
 2个保留字:
 goto const

1.5 Java中的printlnprint的区别

相同点:都是输出语句

不同点:

println:输出之后自带换行

print:输出之后不带换行

 public class Main{
     public static void main(String[] args){
         // println
         System.out.println("床前明月光");
         System.out.println("疑是地上霜");
         System.out.println("举头望明月");
         System.out.println("低头思故乡");
         // print
         System.out.print("床前明月光");
         System.out.print("疑是地上霜");
         System.out.print("举头望明月");
         System.out.print("低头思故乡");
     }
 }
 ​
 输出结果:
 床前明月光
 疑是地上霜
 举头望明月
 低头思故乡
 床前明月光疑是地上霜举头望明月低头思故乡

2. Java中的数据类型

2.1.常量

在Java中,有以下常量(也称字面量):

  1. 整型常量

  2. 浮点型常量

  3. 字符型常量

  4. 字符串常量

  5. 布尔常量

  6. null

2.2 标识符

Java中的规定:

  1. 标识符可以包含英文字母,数字,$_

  2. 标识符不能以数字开头

  3. 标识符不能是关键字

建议命名风格:

  1. 给类取名字:遵循大驼峰式 -> 每个单词首字母大写

  2. 给方法和变量取名字:遵循小驼峰式 -> 从第二个单词开始往后首字母大写

2.3变量

在Java中,有下面的变量类型

Java中按照下面的语法定义变量

 变量类型 变量名 = 值;

在Java中,如果变量不初始化就无法使用

public class Main {
    public static void main(String[] args) {
        int num;
        System.out.println(num);// 无法使用未初始化的变量
    }
}

2.4类型转换

Java中遇到下面两个情况就会出现类型转换

  1. 赋值符号左右两边类型不一致

  2. 不同的类型做数据运算

Java中存在两种形式的类型转换

  1. 自动类型转换

  2. 强制类型转换

2.5自动类型转换

1.在对变量初始化时,当赋值符号左侧的类型比右侧的类型范围大时会出现自动类型转换

public class Main {
    public static void main(String[] args) {
        long num = 4; // 整型常量默认是int,所以赋值给long类型的num时就会出现自动类型转换,从int转换到long
        System.out.println(num);
    }
}
 
输出结果:
4

2.当范围小的类型与范围大的类型做运算时会出现类型转换

public class Main {
    public static void main(String[] args) {
        int num1 = 1;
        double num2 = 2.1;
        System.out.println(num1 + num2);// num1的类型为int,num2的类型为double,所以做运算时,int范围小,自动转换为double类型进行计算
    }
}
 
输出结果:
3.1

3.在Java中,自动转换按照下面的顺序:

bytecharshort -> int -> long -> float -> double

在C/C++中,boolean类型是整型,可以用0和1代替,但是在Java,boolean是个单独的类型,无法参与运算

2.6强制类型转换

当出现大范围类型向小范围类型转换时,无法进行自动类型转换,如果仍需要操作,则需要用到强制类型转换,语法同C/C++语言

public class Main {
    public static void main(String[] args) {
        float num = 1.2;// 因为浮点数默认类型为double,并且double的取值范围比float大,此时无法进行自动类型转换
        System.out.println(num);
    }
}

对于long类型的变量和float类型的变量来说,如果需要给常量值,需要在常量后面加上LF

public class Main {
    public static void main(String[] args) {
        float num = 1.2F;// 指定小数为float类型
        // 或者使用强制类型转换
        // float num = (float)1.2;
        System.out.println(num);
    }
}
 
输出结果:
1.2
public class Main {
	public static void main(String[] args) {
  		char num1 = 65;// 65在char类型的范围内,不需要强制类型转换
  		byte num2 = 2;// 2在byte类型的范围内,不需要强制类型转换
  		short num3 = 3;// 3在short类型的范围内,不需要强制类型转换
  		// byte num4 = 200;// 超出byte范围,需要强制类型转换
  		System.out.println((int)num1);
  		System.out.println(num2);
 		System.out.println(num3);
	}
}
输出结果:
65
2
3

强制类型转换一般会存在精度丢失问题,所以一般情况下不建议使用

3.运算符(与C++ 相同)

3.1赋值给自己后自增(C/C++也有同样的结果)

public class test_assignment {
    public static void main(String[] args) {
        int num = 10;
        num = num++;
        System.out.println("num = " + num);
    }
}
 
输出结果:
10

上面的代码直观反应是num将10先给num,再自增为11,所以输出为11,但是实际上是num得到的是10,查看Java反编译的代码如下

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
 
public class test_assignment {
    public test_assignment() {
    }
 
    public static void main(String[] args) {
        int num = 10;
        int num1 = num++;
        System.out.println("num = " + num1);
    }
}

实际上是创建了一个临时变量num1接受改变之前的num,再打印临时变量num1

3.2小范围整型自增和显式加1

public class test_assignment {
    public static void main(String[] args) {
        byte num = 10;
        num = num + 1; // 对于byte小范围整型来说,因为编译器无法确定执行运算后是否会超出byte的范围,所以本语句无法执行
        System.out.println("num = " + num);
    }
}

但是,如果写成num += 1则可以正常运行

public class test_assignment {
    public static void main(String[] args) {
        byte num = 10;
//        num = num + 1;
        num += 1;
        System.out.println("num = " + num);
    }
}
 
输出结果:
num = 11

对于其余两个运算符charshortfloatdouble来说也是如此(注意浮点数类型和整型相加不存在该问题)

public class test_assignment {
    public static void main(String[] args) {
        float num1 = 10.0f;
        num1 = num1 + 1;// 正常运行
        System.out.println("num1 = " + num1);
    }
}
 
输出结果:
11.0

3.3无符号右移

在Java中,除了提供了C/C++中存在的算术右移,还提供了无符号右移,使用>>>表示

public class Main {
    public static void main(String[] args) {
        System.out.println(8 >>> 2);
        System.out.println(-8 >>> 2);
        System.out.println(8 >>> 32); // 特殊地,在Java中有特殊处理,移动32位次的整数倍为原数,而不是0,类似于模32运算
    }
}
 
输出结果:
2
1073741822
8

3.4运算符优先级

4.Java中的包

在Java中,可以在模块中创建不同的包,即文件夹,一般一个包代表一种功能或者其他,该包中可以创建多个类

创建规则:

域名反写,例如www.baidu.com写为com.baidu(去掉www.)

例如www.epsda.com创建一个包为scanner,写为com.espda.scanner

对于第一个包来说,com.epsda没有二级目录,但是在文件夹下scanner包在com.epsda下

如果需要创建一个与scanner平级的包,则需要右键com.epsda上一级的文件夹,比如src,同样输入com.epsda后面再输入新的包名,例如创建包if_else,写为com.epsda.if_else,创建完成后com.epsda下就会存在两个平级包并且此时会有二级目录,下次再需要创建一个与前两个包平级时只需要右键com.epsda包即可

5.Java中的数据输入

在Java中,使用Scanner类创建Scanner对象控制输入,使用Scanner类前需要引包,使用import关键字进行引包操作,语法如下

// package下方
import 包名;
// 类的上方

Scanner类在java.Util包中

使用Scanner创建一个对象

Scanner 对象名 = new Scanner(System.in);

使用对象名调用方法,一般使用两种

  1. 数值型(整型nextInt()等)

  2. 字符串型(next()nextLine())

对于字符串型的输入来说,next()遇到空白字符就会结束读取输入,和scanf()效果类似,而nextLine()则是遇到换行才结束,所以next()和nextLine()一般不会一起使用

package com.epsda.scanner;
 
// 引包
import java.util.Scanner;
 
/**
 * ClassName: com.epsda.scanner.Test_scanner
 * Package: PACKAGE_NAME
 * Description:
 *
 * @author lza
 * @version v1.0
 */
public class Test_scanner {
    public static void main(String[] args) {
        // 创建scanner对象
        Scanner sc = new Scanner(System.in);
 
        // 输入整数
        int num = sc.nextInt();
        System.out.println("num = " + num);
        // 输入字符串,next()方法
        String name = sc.next();
        System.out.println("name = " + name);
        // 输入字符串,nextLine()方法
        name = sc.nextLine();
        System.out.println("name = " + name);
    }
}
 
输出结果:
// 2
num = 2
// 这是一个带空格 的字符串
name = 这是一个带空格
name =  的字符串

如果需要同时使用next()nextLine(),则next()nextLine()中间可以加一个nextLine()处理next未读取到的空格,再使用nextLine()读取新的输入

package com.epsda.scanner;
 
// 引包
import java.util.Scanner;
 
/**
 * ClassName: com.epsda.scanner.Test_scanner
 * Package: PACKAGE_NAME
 * Description:
 *
 * @author lza
 * @version v1.0
 */
public class Test_scanner {
    public static void main(String[] args) {
        // 创建scanner对象
        Scanner sc = new Scanner(System.in);
 
        // 输入整数
        int num = sc.nextInt();
        System.out.println("num = " + num);
        // 输入字符串,next()方法
        // 输入“这是一个带空格 的字符串”
        String name = sc.next();// 只取到“这是一个带空格”
        System.out.println("name = " + name);
        // 使用nextLine()处理next()剩余为读取的部分
        String rest = sc.nextLine();
        // 输入字符串,nextLine()方法
        name = sc.nextLine();// 直到遇到\n结束
        System.out.println("name = " + name);
    }
}
 
输入和输出结果:
// 2
num = 2
// 这是一个带空格 的字符串
name = 这是一个带空格
// 这是一个带空格的字符串
name = 这是一个带空格的字符串 

6.Random类

在Java中,如果想要使用系统生成的伪随机数,可以使用Java的伪随机类Random生成伪随机数,同Scanner类,Random类也再java.util包中,所以使用Random类也需要先引包

import java.util.Random;

引包后,通过Random类创建Random对象

Random r = new Random();

对于Random类来说,有下面的方法(其他类型的方法类似):

  1. nextInt():生成整型范围内的任意一个数值

  2. nextInt(int bound):生成0-bound-1中的任意一个数值

package com.epsda.random;
 
import java.util.Random;
 
/**
 * ClassName: Test_random
 * Package: com.epsda.random
 * Description:
 *
 * @author lza
 * @version v1.0
 */
public class Test_random {
    public static void main(String[] args) {
        Random r = new Random();
        System.out.println("r = " + r);
        Random rb = new Random();
        int data = rb.nextInt(100);// 生成0-99中的一个数值
        System.out.println("data = " + data);
        int i = rb.nextInt(900) + 100;//生成100-999中的一个数值
        System.out.println("i = " + i);
    }
}
 
输出结果:
data = 518372707
data1 = 76
data2 = 648

7.猜数字游戏

package com.epsda.guessGame;
 
import java.util.Random;
import java.util.Scanner;
 
/**
 * ClassName: guessGame
 * Package: com.epsda.guessGame
 * Description:
 *
 * @author lza
 * @version v1.0
 */
 
public class GuessGame {
    public static void main(String[] args) {
        // 生成伪随机数
        Random r = new Random();
        int ans = r.nextInt(100) + 1;// 猜1-100中间的数值
        // 读取用户的输入
        Scanner s = new Scanner(System.in);
        int input = s.nextInt();
        // 死循环读取直到用户猜对
        while (true) {
            if (input == ans) {
                System.out.println("猜对了");
                break;
            } else if (input < ans) {
                System.out.println("猜小了,重新猜");
            } else {
                System.out.println("猜大了,重新猜");
            }
            input = s.nextInt();
        }
    }
}

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

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

相关文章

STM32外设详解——ADC

来源&#xff1a;铁头山羊 基本概念 ①ADC是模数转换器的统称&#xff0c;stm32f103c8t6内部集成了2个12位主次逼近型ADC&#xff0c;外设名称为ADC1、ADC2。 ② 采样深度为12位意味着ADC可以将0~3.3V的模拟电压等比转换为0~4095的数字值&#xff08;分割为2的12次方份&…

猫头虎分享:Python库 Selenium 的简介、安装、用法详解入门教程

&#x1f42f; 猫头虎分享&#xff1a;Python库 Selenium 的简介、安装、用法详解入门教程 &#x1f680; 今天&#xff0c;猫头虎带大家深入了解 Selenium&#xff0c;这是一个非常流行的自动化测试工具&#xff0c;用于浏览器自动化。无论你是进行网页数据抓取&#xff0c;还…

Starrocks表的数据库字段类型及与MySQL 的差异

最近有用到Starrocks&#xff0c;实际使用中基本可以当作mysql来使用&#xff0c;但是数据库字段还是有所不同的。 与MySQL相同或相似的基础类型 数值类型 TINYINT、SMALLINT、INT/INTEGER、BIGINT&#xff1a;在Starrocks和MySQL中的定义和用途基本相似。都是用于存储整数&…

YOLO11改进|注意力机制篇|引入Mamba注意力机制MLLAttention

目录 一、【MLLAttention】注意力机制1.1【MLLAttention】注意力介绍1.2【MLLAttention】核心代码 二、添加【MLLAttention】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP42.5STEP5 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【MLLAttention】注意力机制 1.1【MLLAtte…

[Linux#66][TCP->IP] 面向字节流 | TCP异常 | filesocket | 网络层IP

目录 1. 面向字节流 思考&#xff1a;对于UDP协议来说&#xff0c;是否也存在“粘包问题”呢&#xff1f; 2.TCP 异常情况 3.知识 1.UDP实现可靠传输(经典面试题) 2. 网络抓包 | 爬虫 3.打通文件和 socket 的关系 4.网络层&#xff1a;IP 前置知识 1. 面向字节流 udp…

Java+vue部署版本反编译

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

C++STL(2)

queue(队列) queue是一种先进先出的数据结构。 queue提供了一组函数来操作和访问元素&#xff0c;但它的功能相对较简单。 push(x):在队尾插入元素 x pop():弹出队首元素 front():返回队首元素 back():返回队尾元素 empty():检查队列是否为空 size0:返回队列中元素的个数 pri…

Android ViewModel

一问&#xff1a;ViewModel如何保证应用配置变化后能够自动继续存在&#xff0c;其原理是什么&#xff0c;ViewModel的生命周期和谁绑定的? ViewModel 的确能够在应用配置发生变化&#xff08;例如屏幕旋转&#xff09;后继续存在&#xff0c;这得益于 Android 系统的 ViewMod…

模拟电子电路基础(常见半导体+multisim学习1)

目录 1.半导体的基础 1.1.半导体基础知识 1.1.1本征半导体 1.1.2杂质半导体 1.1.3PN结 1.2半导体二极管 1.2.1半导体二极管的几种常见结构 1.2.2二极管的伏安特性曲线 1.2.3二极管的主要参数 1.2.4二级管的等效电路 1.2.5稳压二极管 1.2.其他类型二极管 2.multisim的…

双目视觉搭配YOLO实现3D测量

一、简介 双目&#xff08;Stereo Vision&#xff09;技术是一种利用两个相机来模拟人眼视觉的技术。通过对两个相机获取到的图像进行分析和匹配&#xff0c;可以计算出物体的深度信息。双目技术可以实现物体的三维重建、距离测量、运动分析等应用。 双目技术的原理是通过两…

Docker-nginx数据卷挂载

数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 以Nginx为例&#xff0c;我们知道Nginx中有两个关键的目录&#xff1a; html&#xff1a;放置一些静态资源conf&#xff1a;放置配置文件 如果我们要让Nginx代理我们…

java项目之厨艺交流平台设计与实现(源码+文档)

项目简介 厨艺交流平台设计与实现实现了以下功能&#xff1a; 厨艺交流平台设计与实现的主要使用者管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。 &#x1f495;&#x1f495;作者&#xff1a;落落 &#x1f495;&#x1f495;个人…

分享一个从图片中提取色卡的实现

概述 最近在做“在线地图样式配置”的功能的时候&#xff0c;发现百度地图有个功能时上传一张图片&#xff0c;从图片中提取颜色并进行配图。本文就简单实现一下如何从图片中提取色卡。 效果 实现 实现思路 通过canvasdrawImage绘制图片&#xff0c;并通过getImageData获取…

主数据系统管理、运维的实践经验与建议

公司在预研一个新的主数据系统&#xff0c;领导问笔者给些建议。结合近两年的主数据系统管理、维护经验&#xff0c;给大致写了一些。 里面少数问题属于目前在运行的主数据系统的系统痛点所致&#xff0c;不过大多数笔者认为是通病&#xff0c;一口气写来已两千字&#xff0c;…

【验证码识别】Python+卷积神经网络算法+人工智能+深度学习+Django网页界面+计算机课设项目+TensorFlow+算法模型

一、介绍 验证码识别&#xff0c;使用Python作为开发语言&#xff0c;通过TensorFlow搭建CNN卷积神经网络算法模型&#xff0c;并通过对收集的几千张验证码图片作为数据集&#xff0c;然后进行迭代训练&#xff0c;最终得到一个识别精度较高的模型文件&#xff0c;然后使用Dja…

Cesium 区域高程图

Cesium 区域高程图 const terrainAnalyse new HeightMapMaterial({viewer,style: {stops: [0, 0.05, 0.5, 1],//颜色梯度设置colors: [green, yellow, blue , red],}});

JS 分支语句

目录 1. 表达式与语句 1.1 表达式 1.2 语句 1.3 区别 2. 程序三大流控制语句 3. 分支语句 3.1 if 分支语句 3.2 双分支 if 语句 3.3 双分支语句案例 3.3.1 案例一 3.3.2 案例二 3.4 多分支语句 1. 表达式与语句 1.1 表达式 1.2 语句 1.3 区别 2. 程序三大流控制语…

66 消息队列

66 消息队列 基础概念 参考资料&#xff1a;消息队列MQ快速入门&#xff08;概念、RPC、MQ实质思路、队列介绍、队列对比、应用场景&#xff09; 消息队列就是一个使用队列来通信的组件&#xff1b;为什么需要消息队列&#xff1f; 在实际的商业项目中&#xff0c;它这么做肯…

shell原理

shell 是个进程 &#xff0c; exe在user/bin/bash [用户名主机名 pwd] snprintf fflush&#xff08;stdout&#xff09;&#xff0c;在没有\n情况下立马输出 strtok 第一个参数null表示传入上个有效参数 命令行中&#xff0c;有些命令必须由子进程执行&#xff0c; 如ls 有些…

【进阶OpenCV】 (11)--DNN板块--实现风格迁移

文章目录 DNN板块一、DNN特点二、DNN函数流程三、实现风格迁移1. 图像预处理2. 加载星空模型3. 输出处理 总结 DNN板块 DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能&#xff0c;其作用是载入别的深度学习框架(如 TensorFlow、Caf…