ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Java基础篇(2)——Java基础语法

Java基础篇(2)——Java基础语法 1. 语法结构1. 包声明必须在文件顶部2. 导入语句导入用到的其他类3. 类定义定义class类主类的类名要和文件名一致大驼峰命名4. main方法程序入口package com.example.demo; // 包声明 import java.util.Scanner; // 导入 public class HelloWorld { // 类名 // 程序入口 public static void main(String[] args) { System.out.println(Hello World!); } }2. 命名规范基本规范只能包含数字字母下划线_美元符$不能以数字开头不能使用Java中的关键字如 classvoidint...严格区分大小写需要做到在命名类、对象或变量时能够望文生义尽量采用英文命名大驼峰命名指每个单词的首字母都大写例如StudentInfoStudentMangager...通常用于类的命名小驼峰命名指第一个单词首字符小写后续单词首字符大写例如studentNamestudentId...通常用于给变量命名定义常量命名全部字母都大写多个单词之间用下划线_分隔例如MAX_VALUEMIN_VALUE...包名命名全部为小写字母一半是用公司域名倒写com.example.demo3. Java的八大基本类型基本类型是Java中最基础的数据类型它直接存储在栈内存中操作速度快整型byte占用字节1字节(Byte) 8位(bit)默认值0取值范围-128 ~ 127对应包装类Byteshort占用字节2字节默认值0取值范围-32768 ~ 32767对应包装类Shortint占用字节4字节默认值0取值范围-2^31 ~ 2^31-1对应包装类Integerlong占用字节8字节默认值0L数值后必须加 “ L ”取值范围-2^63 ~ 2^63-1对应包装类Long浮点型float单精度占用字节4字节默认值0.0f 数值后必须加 F 或 f 对应包装类Floatdouble双精度占用字节8字节默认值0.0d后缀d可省略对应包装类Double字符型char占用字节2字节默认值\u0000 Unicode转义空字符取值范围0 ~ 65535对应包装类Character布尔型boolean占用字节1字节默认值false取值范围true 和 false对应包装类Boolean1. 为什么在Java中char是2个字节在Java中采用UnicodeUTF-16编码char是一个无符号整数2字节也就是16位能够表示范围0~65535在当时这个范围足以所有字符后期Unicode扩展对超出这个范围的字符采用两个char组合来表示2. 为什么用char来表示字符而不是short?Unicode编码是从0开始的所有字符码点都是非负整数char 类型就是无符号整数所有都是正数表示范围是0~65535而short 类型最高位是符号位用来表示正负表示的范围就是-32767~32766有一半为负数用不上的浪费了且Unicode中的字符码点要大于32767所以设计出char来专门表示字符4. 包装类基本数据类型对应的引用类型就是把基本类型包装成对象而对象默认值都是null基本类型包装类示例byteByteByte b 10shortShortShort s 100intIntegerInteger i 5longLongLong l 100LfloatFloatFloat f 3.14fdoubleDoubleDouble d 3.14charCharacterCharacter c A booleanBooleanBoolean b true装箱拆箱方法自动装箱是 Java 编译器自动将基本类型转换为对应的包装类型本质是调用valueOf()方法例如 Integer a 100; 等价于 Integer a Integer.valueOf(100)而拆箱则是包装类型转换成对应基本类型本质是调用xxxValue()方法例如 int b a; 等价于 int b a.intValue()基本类型装箱方法拆箱方法intInteger.valueOf( int i )Integer.intValue()byteByte.valueOf( byte b )Byte.byteValue()shortShort.valueOf( short s )Short.shortValue()longLong.valueOf( long l )Long.longValue()floatFloat.valueOf( float f )Float.floatValue()doubleDouble.valueOf( double d )Double.doubleValue()charCharacter.valueOf( char c )Character.charValue()booleanBoolean,valueOf( boolean b )Boolean.booleanValue()注包装类都是由final来修饰的不能被继承且一旦创建值不能被修改为了线程安全、缓存机制有效、以及一致性。不可变对象可以被安全地在多个线程间共享且可以作 HashMap 的 key。包装类对象是在堆中存储而引用是在栈中Byte、Short、Integer、Long、Float、Double 继承自 Number 类Character 和 Boolean 直接继承 Object1. 为什么需要包装类在使用集合或泛型时参数类型必须是对象类型且包装类支持null内置了很多工具方法2. 缓存机制提高性能节省内存。频繁使用的数值被预先创建并复用。ByteShortIntegerLong缓存范围为-128~127Character为0~127Boolean的true和false都被缓存而FloatDouble浮点数是没有缓存的创建一个缓存范围内的对象实际上是从缓存中取的同一对象超出缓存范围的则是新建对象// Integer 缓存范围-128 ~ 127 Integer a 100; Integer b 100; System.out.println(a b); // true从缓存取同一个对象 Integer c 200; Integer d 200; System.out.println(c d); // false超出缓存新建对象 System.out.println(c.equals(d)); // true用 equals 比较内容 Integer a Integer.valueOf(100); // 从缓存取 Integer b new Integer(100); // 强制创建新对象 System.out.println(a b); // false3. 浮点数取值范围没有缓存因为浮点数取值范围太大缓存所有值不现实且浮点数使用频率不如整数高4.Integer a null; int b a;抛出NullPointerException。因为拆箱时调用 a.intValue()而 a 为 null。5.修饰符修饰符是 Java 中用于修饰类、方法、变量、构造方法等的关键字用来控制其访问范围、行为特性或继承关系。访问修饰符public公开访问任何地方都可访问protected受保护允许同一个类同一个包及不同包的子类访问default默认无修饰符只允许同一个类和同一个包下访问private私有的仅当前类可访问非访问修饰符static静态的被修饰的东西表示是属于类的而非实例final不可变表示不可被修改、继承、重写abstract抽象的不可被实例化synchronized修饰线程表示加锁保证线程安全volatile表示显示可见性保证代码程序按照顺序执行1. final、finally、finalize() 的区别final修饰符不可改变finally异常处理的最终执行块finalize()垃圾回收前调用2. synchronized 和 volatile 的区别volatile保证可见性不保证原子性不能修饰类和方法synchronized保证可见性和原子性性能较低3. static的作用修饰变量方法类代码块静态变量属于类的所有对象共用一份在类加载时进行初始化JDK8 之前在方法区JDK8 在堆中的 Class 对象里可通过 类名.变量名进行访问也可以通过对象引用访问静态方法不需要创建对象可直接通过 类名.方法名进行调用没有隐式对象不能使用 this 和 super只能访问静态成员静态变量或其他静态方法或通过对象引用来访问实例静态代码块在类加载时自动执行且只执行这一次多个静态代码块按照声明顺序进行执行是在构造方法之前执行常用于加载驱动或初始化变量静态内部类独立于外部类不能使用外部类引用不用依赖于外部类创建只能访问到外部类的静态成员不能直接去访问外部类的实例成员class Parent { static { System.out.println(Parent 静态代码块 1); } { System.out.println(Parent 构造代码块); } static { System.out.println(Parent 静态代码块 2); } public Parent() { System.out.println(Parent 构造方法); } } class Child extends Parent { static { System.out.println(Child 静态代码块 1); } { System.out.println(Child 构造代码块); } static { System.out.println(Child 静态代码块 2); } public Child() { System.out.println(Child 构造方法); } } public class Test { static { System.out.println(Test 静态代码块); } public static void main(String[] args) { System.out.println( main 开始 ); new Child(); System.out.println( 第一次 new 结束 ); new Child(); System.out.println( main 结束 ); } }Test 静态代码块 main 开始 Parent 静态代码块 1 Parent 静态代码块 2 Child 静态代码块 1 Child 静态代码块 2 Parent 构造代码块 Parent 构造方法 Child 构造代码块 Child 构造方法 第一次 new 结束 Parent 构造代码块 Parent 构造方法 Child 构造代码块 Child 构造方法 main 结束 4. static修饰的方法为什么不能使用 this 和 superstatic方法属于类不属于对象而this和super必须依附于具体的对象实例即 this 指向堆内存中当前对象实例super 指向父类实例的内存空间静态方法被调用时可能根本没有对象存在。5. final修饰符作用修饰变量方法类修饰变量该变量不可再进行赋值值不可改变即为常量修饰方法不能被子类重写方法可重载修饰类不能被继承ps:重载通常是同一个类中方法名相同参数列表不同参数个数类型...与返回值无关重写是指在子类中重写实现父类的同一方法方法名和参数列表必须相同返回值类型相同或者是父类返回值的子类抛出的异常不能比父类多6.运算符算术运算符用于数值运算运算符作用示例加法运算字符串拼接11 2ab ab-减法运算2-1 1*乘法运算9*9 81/除法运算整型会舍弃小数部分(int)5/2 2%取余/取模余数5%2 1自增1i i1--自减-1i-- i-1注1. 自增和自减有前后缀之分当使用 i 时表示先使用的是 i 原先的值后再继续 1 操作而i 则是先 1 再使用同样 -- 也是一样的2. 整型在除以0或对0去余时会直接抛出异常ArithmeticException而浮点数则不会抛出异常结果显示为 Infinity 无穷大 或 NaN非数字关系运算符比较值之间的关系结果为boolean型Ture/False运算符作用示例等于a b!不等于a ! b大于a b小于a b大于等于a b小于等于a b注在比较引用类型时例如String 号只比较他们的内存地址而不是具体的值比较具体的值应使用 .equals() 方法逻辑运算符用于条件判断返回boolean运算符作用示例逻辑并条件同时成立时Ture条件1 条件2|逻辑或有一个条件成立时Ture条件1 | 条件2短路并条件1不成立直接False不计算条件2条件1 条件2||短路或条件1成立直接Ture不计算条件2条件1 || 条件2!逻辑非取反条件成立则为False不成立Ture! 条件1^逻辑异或两边不同返回Ture相同返回Falseture^false注利用 || 短路特性可以提高效率并避免潜在的空指针异常赋值运算符运算符作用示例直接赋值a 1加后赋值a 1 等价于 a a 1-减后赋值a - 1 等价于 a a - 1*乘后赋值a * 1 等价于 a a * 1/除后赋值a / 1 等价于 a a / 1%取余赋值a % 1 等价于 a a % 1其它运算...同理....注在 Java 中所有小于 int 的整数类型byte、short、char在进行算术运算时都会自动提升为 int 类型然后才进行计算复合赋值运算符有隐式强转例如byte a 1在进行 a a2 的运算时数字2是 int 型的而运算中的 a 会从byte 升为 int最后 int 型的结果又赋值给byte a就可能出现精度丢失问题所以这里如果是 a a 2编译器就会报错需要进行强制类型转换也就是 a ( byte ) ( a 2 ) 才可以通过编译而使用 a 2时则会进行隐式强转不会编译报错拓展位运算符操作整数的二进制位操作数必须是整数类型运算符作用示例位与运算同1则1不同则00b0101 0b0011 0b0001|位或运算有1则1无1则00b0101 | 0b011 0b0111^异或运算不同为1相同为00b0101 ^ 0b0011 0b0110~取反运算补码~0b0101 0b1010左移低位补05 1 移位数n相当于乘以 2ⁿ右移高位补符号位正数1负数0-5 1保留符号地除以 2ⁿ无符号右移高位补0-5 1把负数当成大正数来移位三元运算符条件 ? 表达式1 : 表达式2如果条件为true取表达式1的值否则取表达式2的值。例如int max (a b) ? a : b;instanceof 类型比较String s Hello; boolean result s instanceof String;运算符优先级可采用来提高运算优先等级明确运算顺序最高--~*/%-instanceof!^|||?:赋值运算括号 单目 算术 位移 关系 相等 位运算 逻辑 三元 赋值补充1. 整数做除法运算时如果想保留小数可以将一个操作数转换成浮点型例如(double)a / b2. 号通常用于基本数据类型比较在比较引用类型时默认比较的是他们的地址3. 不借助第三个变量来实现两个数值交换int a 10; int b 20; //1.算术运算加减法 a a b; // a 30, b 20 b a - b; // b 30 - 20 10, a 30 a a - b; // a 30 - 10 20, b 10 //2.异或运算 a a ^ b; // a 10 ^ 20, b 20 b a ^ b; // b (10 ^ 20) ^ 20 10, a 10 ^ 20 a a ^ b; // a (10 ^ 20) ^ 10 20, b 10 //3.赋值表达式 //3.1 b a (a b) * 0; //3.2 a a b - (b a); //3.3 a (a ^ b) ^ (b a); //3.4 b (a ^ b) ^ (b a);前不久我的一个朋友发信息给我他说他最近很难过他的发小Q走了自s的把自己关在卫生间里燃了很多木炭一氧化碳中毒是Q的妹妹发现的...Q和他的爷爷奶奶一起生活那时候Q的爷爷联系我那个朋友说他们联系不上Q了很担心他不知道去哪里我那个朋友和Q的其他共同朋友也同样联系不上后来我朋友收到消息Q已经走了... 据我那个朋友所说Q患有抑郁症已经有好几年了Q比我们大几岁大学毕业后就一直在家没有出去工作他得抑郁症好像是由于高中时候的一段感情经历他们本来分手了后来大学又有了联系但具体什么样我那个朋友也不清楚因为那时候Q的精神状态就不太对劲了这些也没有和他或是其他朋友讲过大概就是那种断崖式的吧我也不太懂...只是觉得很可惜吧二十几岁啊这是多么美好的年纪啊从学校走向社会能自己挣钱养活自己过自己的生活又没有结婚房贷车贷的困扰这是人生中真正属于自己的几年时光...希望大家不管遇到什么困难都要努力克服他战胜他解决问题可比解决自己要强的多永远不要轻视生命永远不要想着放弃。非常推荐大家去读一本书《钢铁是怎么练成的》或者是看00年拍的电视剧版你也能成为自己的保尔柯察金
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进