重拾Java-2-Java基础

重拾Java-2-Java基础

  1. 打开IDEA,建立一个空项目Empty Project,命名为JavaSE

    (暂时不设置项目结构Project Structure)

  2. 在JavaSE项目中新建一个Module,命名“基础语法”

  3. 打开项目结构,对运行环境进行配置(若不配置,项目可能无法编译)

注释

  • 注释并不会被执行,是给开发人员所用

  • 书写注释是一个非常好的习惯

  • 平时写代码一定要注意规范

  • Java中的注释有三种:

    • 单行注释 只能注释一行文字
    //表示单行注释
    //可以在Settings-Editor-Color Scheme-Java-Comments(注释)-Line Comment/Block Comment/JavaDoc中设置对应的颜色及样式
    
    • 多行注释 可以注释一段文字
    /*
    	我
    	是
    	多行注释------------------------
    */
    
    • 文档注释 可以加参数
    /**
     * @author yxyang
     * @create 2025/3/17-23:46
     */
    

    注释在IDEA中的快捷键可以选择该行或多行,再用Ctrl + Shift + /

标识符和关键字

关键字

abstract assert boolean break byte
case catch char class const
continue default do double else
enum extends final finally float
for goto if implements improt
instanceof int interface long native
new package private protected public
return stricitfp short static super
switch synchronized this throw throws
transient try void volatile while

标识符

Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。

关键字是固定的,不能以关键字定义标识符。

标识符注意点:

  1. 所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始
  2. 首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或者数字的任何字符组合
  3. 不能使用关键字作为变量名或方法名
  4. 标识符是大小写敏感的
  5. 可以使用中文命名,但是一般不建议这样去使用,也不建议使用拼音,养成良好的规范
 	String Atest = "yuu";
    String test = "yuu";
    String $test = "yuu";
    String _test = "yuu";
    //String #test = "yuu";     报错-注意点1
    //String 1test = "yuu";     报错-注意点1
    
    String t1est = "yuu";
    //String t%est = "yuu";     报错-注意点2

    //String class = "yuu";     报错-注意点3

	String Man = "男";
	String men = "男";
	//Man与men不同,大小写敏感	-注意点4

数据类型

Java是一种强类型语言 (要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用

  • 强类型语言 eg: Java, C, C++
  • 弱类型语言 eg: Javascript

Java的数据类型

  • 基本类型(primitive type)

    • 数值类型

      • 整数类型

        • byte占1个字节范围:-128~127
        • short占2个字节范围:-32768-32767
        • int占4个字节范围:-2147483648-21477/697
        • long占8个字节范围:-9223372036854775808-9223372036854775807
      • 浮点类型

        • float占4个字节
        • double占8个字节
      • 字符类型char 占2个字节

        字符代表一个字,使用''表示;多个字用字符串,使用""表示

        注意:String不是关键字

        在底层,char 实际上是一个整数类型,它存储的是字符对应的 ASCII 码(或系统使用的字符集编码,如 Unicode 的子集)。例如,字符 'A' 的 ASCII 值是 65。

    • boolean类型 占1位其值true和false两个

    		//八大基本数据类型
            
            //整数
            byte num1 = 10;
            int num2 = 20;       //最常用的整数类型
            short num3 = 30;
            long num4 = 40L;     //Long类型要在数字后面加个L
    
            //小数:浮点数
            float num5 = 50.1F;  //float类型后面要在数字后面加个f
            double num6 = 3.1415926589793238462643;
    
            //字符
            char name = '嗨';
            //字符串String不是关键字,String是个类
            //String string = "哈喽";
            
            //布尔值:是非
            boolean flag = true;
            //boolean flag = false;
    
    1. long和float类型都需要在数字后面加个L或F,否则浮点数会默认认为double类型,报错;

    2. char为字符类型,为一个字,可以存储-128~127之间的整数或对应的ASCII码;

      多个字用String类,但String不是基本数据类型;

      字符使用''表示,而字符串使用''表示。

    3. 整数与浮点数类型均有包装类,其数值大小已在包装类(类名为其首字母大写)中定义;

  • 引用类型(reference type) (除上述八种基本类型之外的均为引用类型)

    • 接口
    • 数组

拓展:什么是字节?

  • 位(bit):是计算机内部数据储存的最小单位。

    ​ eg: 11001100是一个八位二进制数

  • 字节(byte):是计算机中的数据处理的基本单位,习惯上用B来表示。

  • 1B = 8bit 因此byte的字节范围为-27~27-1

    1024B= 1KB 1024KB = 1M 1024M = 1G 1024G= 1TB

    思考:电脑32位和64位的区别

答:在CPU中的寻址能力与其挂钩。32位最多支持4GB内存(内存条无法扩充),64位支持128GB内存

32位指的就是内存寻址空间,也就是说总共有2的32次方个内在地址,一个地址存储一个字节,所以换成GB有232B=2(32-30)GB=22GB=4GB

那么64位即为264B=2(64-30)GB=234GB ????

解答:32位即2^32=4GB
64位即264,但实际因为其它因素,最大容量不可能到达264B,因此最多支持128GB

  • 字符:是指计算机中使用的字母、数字、字和符号

拓展:数据类型面试题

  		//整数拓展:进制前缀表示 二进制0b 八进制0 十进制 十六进制0x
        int i1 = 10;
        int i2 = 010; //八进制0
        int i3 = 0x11; //十六进制0x     0~9 A~F

        System.out.println(i1);     //10
        System.out.println(i2);     //8
        System.out.println(i3);     //17

        //浮点数拓展:银行业务怎么表示?
        //float能表示的字长是有限的,但也是离散的,存在舍入误差,无法精确表示结果,即接近但不等于
        float f = 0.1f;             //0.1
        double d = 1.0/10;          //01

        System.out.println(f==d);   //false

        float f1 = 23131f;
        float f2 = f1 + 1;

        float f3 = 23131312312312313f;  //f3=2.3131313E16
        float f4 = f3 + 1;              //f4=2.3131313E16

        System.out.println(f1 == f2);   //false
        System.out.println(f3 == f4);   //true

        //最好完全避免使用浮点数进行比较
        //银行业务用类表示,BigDecimal 数学工具类

        //字符拓展
        char c1 = 'a';
        char c2 = '中';

        System.out.println(c1);
        System.out.println((int)c1);    //强制转换

        System.out.println(c2);
        System.out.println((int)c2);    //强制转换

        //所有的字符本质还是数字
        //char涉及编码问题 Unicode编码对应一张编码表,一般通过转义表示 U0000-UFFFF
        // 0-可以处理任何语言的文字,占2个字节 可以表示0-65536(2^16)个字符
        //Unicode的编码表使数字对应一个字符 eg: 97 = a, 65 = A

        char c3 = '\u0061';
        System.out.println(c3);     //a     \\u转义 0061为十六进制对应97,即a

        //转义字符
        //\t    制表符     \n  换行 及等等

        System.out.println("Hello\tWorld");     //Hello	World
        System.out.println("Hello\nWorld");     //Hello(换行)World

        //从内存分析对象,后期讲解
        String str_a = new String("hello world");
        String str_b = new String("hello world");
        System.out.println(str_a == str_b);     //false

        String str_c = "hello world";
        String str_d = "hello world";
        System.out.println(str_c == str_d);     //true

        //布尔值拓展
        boolean flag1 = true;

        //if(flag == true){}    新手程序员写法
        if(flag1){
            //Less is More! 代码要精简易读
        }
  1. int类型中,不同进制其前缀表示不同;

  2. 尽量完全避免用浮点数进行计算和比较,会存在精度缺失,若有需要,可用数学工具类BigDecimal

    (要小心float由于字长不足存在的比较陷阱);

  3. 每个字符对应一个Unicode编码数字,因此char可用int进行转换(char要输出Unicode编码时需要转换成int型);

  4. 转义字符可以char或String中使用,转义成相应的格式或Unicode字符(注意:在字符中,包括注释使用转义符号会报错!括号中内容错误,下述已修改

    例如:

    	char c = '\u0061'; 	//\u为转义字符 (!!!无法编译)
    

    错误!!!

    :为了输出\字符,因为常见的转义字符都以''开头,所以当你输入\时,Java会自动认为你要输入转义字符,因此想要单独的输出\字符需要用\字符进行转义

    上述代码修改:

    	char c = '\u0061'; 	//\\u为转义字符 
    

    ​ 即不会报错

  5. Java书写讲究Less is More!


类型转换

由于Java是强类型语言,所以要进行有些运算的时候 ,需要用到类型转换。

低----------------------------------------------------->高(容量)
   byte, short, char -> int -> long -> float -> double
  • 运算中,不同类型的数据先转化为同一类型,然后进行去运算。

  • 转换时,由低到高自动转换(小数的优先级一定大于整数)

	public static void main(String[] args) {
        int i = 128;
        byte b = (byte)i;   //要进行强制类型转换,但byte范围为-128~127,会导致内存溢出
        double d = i;       //低->高,自动转换

        //强制转换格式: (类型)变量名   高->低
        //自动转换: 低->高

        System.out.println(i);  //128
        System.out.println(b);  //-128,内存溢出
        System.out.println(d);  //128.0,自动转换
        System.out.println((int)23.7);      //23,精度缺失
        System.out.println((int)-45.89f);   //-45,精度缺失

        char c1 = 'a';
        int c2 = c1+1;
        System.out.println(c2);         //98
        System.out.println((char)c2);   //b
    }

注意点:

  1. 不能对布尔值进行转换;
  2. 不能把对象类型转换为不相干的类型;
  3. 在把高容量转换到低容量的时候,强制转换;反之,自动转换;
  4. 转换的时候可能存在溢出,或者精度问题;
  • 操作比较大的数时,注意溢出问题 ——运算前先转换其中一个数的类型
	public static void main(String[] args) {
        //JDK7新特性:数字之间可以用下划线分割
        int money = 10_0000_0000;	//用下划线分割,money值仍为1000000000
        int years = 20;
        int total1 = money*years;      //-1474836480,计算时溢出了
        long total2 = money*years;     //-1474836480,先相乘,再进行转换,即转换前已经存在溢出问题
        long total3 = money*((long)years);  //20000000000,先把一个数转换为Long,使表达式全部用Long运算

        System.out.println(total1);
        System.out.println(total2);
        System.out.println(total3);
    }

变量和常量

变量

  • 变量:可以变化的量。(可以通过变量操作一些内存中的数据-变量被指定一个内存的空间,空间固定,但其中的数据可变)
  • Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
type varName [=value] [{,varName[=value]}];
//数据类型 变量名 = 值
//可以使用逗号隔开来声明多个同类型变量,但不建议!!
//int a=1, b=2, c=3      不建议,不便于程序的可读性
int a=1;
int b=2;
int c=3;

注意事项

  1. 每个变量都有类型,类型可以是基本类型,也可以是引用类型;
  2. 变量名必须是合法的标识符;
  3. 变量声明是一条完整的语句,因此每一个声明进行必须以分号结束。
public class Demo04 {
    //类中,可以定义属性和方法

    //类变量:从属于类;用static修饰
    static double salary = 12000;

    //实例变量:从属于对象;如果不自行初始化,则默认为这个类型的默认值
    //所有数值类型为0 0.0(字符串为u0000,默认也为0)布尔值默认为false
    //除了基本类型,其余的默认值都为null
    String name;
    int age;

    //主程序方法,即main方法
    public static void main(String[] args) {
        //局部变量:定义在方法中,必须声明和初始化值
        int i = 10;
        System.out.println(i);      //10

        //实例变量 需new 类名()
        Demo04 demo04 = new Demo04();
        System.out.println(demo04.name);    //null
        System.out.println(demo04.age);     //0

        //类变量 static,可直接使用
        System.out.println(salary);         //12000.0
    }
}

变量分为:

  • 类变量:从属于类,需要用static修饰,在方法中可以直接使用

  • 实例变量:从属于对象,在方法中使用时,需要通过对象调用,即new 类名()

  • 局部变量:只在定义的方法中起作用,必须声明和初始化值

    注:类变量和实例变量若没有初始化,则其值为该数据类型的默认值(所有数值类型均为0或0.0,布尔值默认为false,除基本类型外,其余均为null)

常量

  • 常量:初始化(initialize)后不能再改变值,即不会变动的值。
  • 常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。
  • 常量用关键字final修饰
public class Demo05 {
    //修饰符先后顺序不影响
    static final double PI = 3.14;
    final static double PI1 = 3.14;

    public static void main(String[] args) {
        System.out.println(PI);		//3.14
        System.out.println(PI1);	//3.14
    }
}

注意

  1. 常量通过final定义,一般使用大写字母定义常量
  2. 修饰符不存在先后顺序
  3. 使用常量可以增强代码的可读性,如可以把一些固定值定义为静态的常量,可以直接调用

变量的命名规范

  • 所有变量、方法、类名要见名知意

  • 类名:首字母大写和驼峰原则

    eg: Demo, Evaluate

  • 方法名:首字母小写和驼峰原则

    eg: add(), mainRun()

  • 类成员变量:首字母小写和驼峰原则

    eg: monthSalary 即除了第一个单词以外,后面的单词首字母大写

  • 局部变量:首字母小写和驼峰原则

  • 常量:大写字母和下划线

    eg: MAX_VALUE

运算符

  • Java语言支持如下运算符:

    • 算术运算符:+, -, *, /, %(模运算,即取余), ++, --
    • 赋值运算符:=
    • 关系运算符:>, <, >=, <=, ==, !=, instance of
    • 逻辑运算符:&&(与), ||(或), !(非)

    (除上述四种掌握,下列了解即可)

    • 位运算符:&, |, ^, ~, >>, <<, >>> (用于二进制)
    • 条件运算符:? :
    • 扩展赋值运算符:+=, -=, *=, /=

二元运算符

	public static void main(String[] args) {
        //二元运算符
        int a = 10;
        int b = 20;
        int c = 21;

        System.out.println(a+b);    //30
        System.out.println(a-b);    //-10
        System.out.println(a*b);    //200
        System.out.println(a/b);    //0,int型的0.5即为0
        System.out.println(a/(double)b);    //0.5,将其中一个数转为double型
        
        //模运算(取余)
        System.out.println(c%a);        //1
    }

加法运算

	/*
        整数运算:
       如果两个操作数有一个为long,则结果也为long;
       没有long时,结果为int.  即使操作数全为short, byte,结果也是int
       浮点数运算:
       如果两个操作数有一个为double,则结果为double;
       只有两个操作数都是float,则结果才为float。
       注意:int与float运算,结果为float。
         */ 	
	public static void main(String[] args) {
        long a = 123123123123123L;
        int b = 123;
        short c = 10;
        byte d = 8;

        System.out.println(a+b+c+d);    //123123123123264, long
        System.out.println(b+c+d);      //141, int
        System.out.println(c+d);        //18, int
    }

除法运算

​ 要注意数据类型是否合适,避免造成精度缺失(如int类型相除,需要先将一个数的数据类型转换为double型)

一元运算符

	public static void main(String[] args) {
        //++自增    --自减      一元运算符
        int a = 3;
        int b = a++;            //执行完这行代码后,先给b赋值,再自增
        						//即b=a; a=a+1;
        
        int c = ++a;            //执行完这行代码后,先自增,再给c赋值
        						//即a=a+1; c=a;

        System.out.println(a);  //5
        System.out.println(b);  //3
        System.out.println(c);  //5

        //很多运算,我们会使用一些工具类来操作
        //如:幂运算 Math.pow(a,b)
        //IDEA快捷键:使用方法时,Alt Enter可以跳出定义提示,再Enter即可
        double pow = Math.pow(3, 2);
        System.out.println(pow);        //9.0
    }
  • b = a++; //等价于b=a; a=a+1;
  • b = ++a; //等价于a=a+1; b=a;

因此,自增自减符号的位置与赋值有前后关系,要注意自增或自减的时机

逻辑运算符

 	public static void main(String[] args) {
        //与(and)    或(or)   非(取反)
        boolean a = true;
        boolean b = false;

        System.out.println("a && b: "+(a&&b));          //false 
        System.out.println("a || b: "+(a||b));          //true  
        System.out.println("!(a && b): "+!(a&&b));      //true  

        //短路运算
        int c = 5;
        boolean d = (c<4)&&(c++<4);     //逻辑与运算中,c<4-false,则短路,后而不再处理
        System.out.println(d);          //false
        System.out.println(c);          //c仍为5
    }
  • 逻辑与运算&&:两个变量都为真 (注意短路运算!!)
  • 逻辑或运算||:两个变量有一个为真,则结果才为真
  • 逻辑非运算!:如果是真,则为假;如果是假,则为真

&&中存在短路运算,因为只有两真才为真,若第一个表达式为假,后面的表达式将不再处理

位运算

位运算效率高,因为其与底层(二进制)打交道

面试题:2*8=16 怎么运算最快

位运算中有<<(左移,即*2)、>>(右移,即/2)

2*8即左移3位

0000 0000       0
0000 0001       1
0000 0010       2
0000 0011       3
0000 0100       4
0000 1000       8
0001 0000       16

扩展赋值运算符

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

        //扩展赋值运算符 (偷懒运算符,不建议)
        a+=b;   //建议书写为 a = a+b
        System.out.println(a);  //30

        //字符串连接符 +
        System.out.println(a+b);        //50
        System.out.println(""+a+b);     //3020
        System.out.println(a+b+"");     //50    字符串在后面,a+b仍进行运算
        System.out.println(a+b+""+a+b); //503020
    }

注意:字符串连接符的位置若位于数值类型运算之前,则将数值类型转换为字符串进行拼接;

​ 若位于数值类型运算之后,则先运算,再转换为字符串

三元运算符

三元运算符便于精简代码,并利于理解

表达式:x ? y : z 如果x==true,则结果为y,否则结果为z

	public static void main(String[] args) {
        int score = 80;
        String grade = score < 60 ? "不及格" : "及格";
        System.out.println(grade);
    }

运算符优先级

口诀:单算移关与,异或逻条赋

  • 括号级别最高,逗号级别最低

  • 单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值

包机制

为了更好的组织类,Java提供了包机制,用于区别类名的命名空间。(防止命名空间重复)

包的语句语法格式为:package pkg1[.pkg2[.pkg3...]];

  • 一般利用公司域名倒置作为包名 package

如:百度www.baidu.com

​ 包名为com.baidu.www (再例如baidu下面有baike、wenku等等)

  • 为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包。

    import package1 [.package2...].(classname|*);

    【IDEA中导入包,可以在成员处使用快捷键Alt Enter】

注意:

  1. import要在package后使用
  2. *为通配符,表示导入该包下所有类

JavaDoc

百度: Jdk帮助文档 - JavaSE帮助文档-Jdk8 https://docs.oracle.com/javase/8/docs/api/

JavaDoc命令是用来生成自己的API文档

  • 加在类上,为类的注释

  • 加在方法上,即为方法的注释。(写完方法后,在方法上方使用/*回车,即可自动生成)

参数信息

  • @author 作者名
  • @version 版本号
  • @since 指明需要最早使用的jdk版本
  • @param 参数名
  • @return 返回值情况
  • @throws 异常抛出情况

用命令行操作JavaDoc:

javadoc [参数,例如:-encoding UTF-8 -charset UTF-8] 文件.java

  1. 在IDEA中选择.java文件,右键-show in Explorer-在文件夹中cmd进入命令行
  2. 生成很多html,打开index.html(首页)

  1. 即可看见生成的文档

思考:学会查找使用IDEA生成JavaDoc文档

posted on 2025-03-22 00:55  学习code想长头发U  阅读(32)  评论(0)    收藏  举报