我的前端坑
  • 关于本书
  • CSS JS 常用
    • 常用 CSS 样式
    • 坑爹的 CSS
    • sass 入门
    • canvas 总结
    • 常用 JS 函数
    • 表单和 FormData 对象
    • 水平滑动 tab 居中
    • js 中的 this
    • sse 和 fetch
    • js 原型链与 class 类
  • TypeScript
    • TS 概念
    • interface 与 type
    • interface 接口
    • Ts 配合 ESLint 和 prettier
  • 小程序
    • 常用小程序代码
  • VUE
    • VUE2 小技巧
    • VUE-CLI 中的 NODE_ENV
  • VUE3
    • VUE3 自行构建 sfc 遇到的坑
    • VUE3 v-model 的实现
    • VUE3 使用总结
    • VUE3 ref
  • vite
    • vite
  • http 请求
    • 前端实现下载
    • cors 跨域请求
    • windows hosts 文件
    • err_blocked_by_client 错误
  • 前端工具
    • npm 和 Node
      • 常见问题
      • npmTips
      • package.json 与 package-lock.json
      • npx
      • exports 与 module.exports
      • ESLint
    • VIM
      • vim 常用
    • Git
      • Git 常用命令
      • Git 小 tips
    • express
  • 后端工具
    • mysql 常见问题
    • docker 常见问题
    • docker
  • java
    • java 常用
    • lambda 表达式
    • java 字符串
    • java 泛型
    • java 反射
    • intellij IDEA
    • 多态
    • java 包管理
    • sql 查询语言
    • java 反射
    • java 异常
    • java 集合
    • spring
  • 命令行
    • 命令行 常用
  • 专利撰写 ppt
  • 后台简述
Powered by GitBook
On this page

Was this helpful?

  1. java

java 常用

强转注意事项

byte,short 定义的时候如果等号右边是整数常量,且整数常量的值不超出 byte、short 的范围, 不需要我们自己进行强制类型转换,jvm 会进行自动类型转换。

byte,short 定义的时候如果等号右边有变量参与,编译报错,需要手动强制转换类型。

char 类型参与运算,会自动转换为 int,char 转换为 int 会去 ASCII 码表查询对应的值,如果没找到,就去 unicode 码表找对应值

byte b = 10;
System.out.println(b);
/*
* 正常通过编译,运行正常
*/

byte b = 10000;
System.out.println(b);
/* 编译报错
Test.java:4: 错误: 不兼容的类型: 从int转换到byte可能会有损失
    byte b = 10000;
                ^
1 个错误
*/

int a = 1;
byte b = a+1;
System.out.println(b);
/* 编译报错
Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
        byte b = a+1;
                  ^
1 个错误
 */

char a = 'a';
System.out.println(a+1);
// 编译运行正常,输出98
byte b = (byte) 2000;
System.out.println(b);// -48
/** 解析
2000赋值给byte类型(8位),
所以取后8位,为【1101 0000】
第一位是1,是个负数,
负数是用补码表示的,
所以【1101 0000】是【某个数值】的补码,
求出数值的原码为【1011 0000】
换算为十进制为2^5+2^4【-48】
 */

i++和++i

int i = 10;
i = i++;
System.out.println(i)// 10

为什么结果是 10 呢,我们将以上代码反编译一下并打开:

int var1 = 10;
int var1000 = var1;
int var2 = var1 + 1;
var1 = var1000;
System.out.println(var1);

&、&&、|、||

& 没有短路效果,会同时将两侧结果都计算出来; && 有短路效果,如果符号前为 false,符号后的代码不会执行。

| 没有短路效果,会同时将两侧结果都计算出来; || 有短路效果,如果符号前为 true,符号后的代码不会执行。

int a = 10;
int b = 20;
boolean result01 = (++a>100)&(++b>10);
System.out.println(result01); // false
System.out.println(a); // 11
System.out.println(b); // 21


int c = 10;
int d = 20;
boolean result02 = (++c>100)&&(++d>10);
System.out.println(result02); // false
System.out.println(c); // 11
System.out.println(d); // 20

java 访问控制修饰符

  1. 仅对本类可见----private

  2. 对外部完全可见----public

  3. 对本包和所有子类可见----protected

  4. 对本包可见----默认,不需要任何修饰符

java 检测字符串是否相等

一定使用 equals 方法,不要使用 ==

String s = "Hello";
String sb = "Hello";
"hello".equals(s); // false
"hello".equalsIgnoreCase(s); // true
s == sb; // 不确定

你可以简单地认为在 java 中,字符串存放在公共的存储池中,字符串变量指向存储池中相应的位置 例如复制一个字符串变量,原始字符串与负值字符串共享相同的字符

== 运算符只能够确定两个字符串是否存放在同一个位置,也就是说 s == sb 比较的是两个字符串的内存地址是否一样,但是完全有可 能内容相同的多个字符串副本放置在不同位置,导致s == sb为 false。

不使用 double 表示价格

原因:double 是不精确的;

  • 方法一:把所有 元*100 变成 分 来表示,单位用 int

  • 方法二:使用 BigDecimal 类(大的十进制数字)

java 重写(override)和重载(overload)

  1. 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。

  2. 重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

内部类与一个.java 文件定义多个类

什么是内部类

定义:定义在另一个类的内部的类称为内部类(Nested Class)

一个.java 文件定义多个类

一个.java 文件可以定义多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。一个文件中可以不含 public 类,如果只有一个非 public 类,此时可以跟文件名不同 此 java 文件被编译时会按定义类的个数产生同样多个.class 文件

一个.java 文件定义多个类

使用命令行编译运行 java 程序

环境变量和系统属性(jvm 中独有的属性)

  1. java 中使用System.getenv("AAA")获取当前环境的环境变量 AAA

  2. java 中使用System.getProperty("AAA")获取 JVM 中的系统属性

public class Main{
    public static void main(String []args){
        System.out.println("args:"+java.util.Arrays.toString(args));
        System.out.println("env:"+System.getenv("AAA"));
        System.out.println("system property:"+System.getProperty("AAA"));
        System.out.println("java version:"+System.getProperty("java.version"));
        System.out.println("user.dir:"+System.getProperty("user.dir"));
    }
}

在命令行中运行如上 java 程序:

# 编译.java文件
javac Main.java
# 设置一个当前环境变量AAA
export AAA=999
# 使用-D设置一个系统属性AAA=789并向java程序传递参数444 555 666 运行 .class文件
java -DAAA=789 Main 444 555 666
# 输出:
args:[444, 555, 666]
env:999
system property:123
java version:1.8.0_311
user.dir:C:\Users\Elite Fan\cli-test

系统属性的传递使用-D 开头,而且系统属性的传递必须放在 java 后

在命令行中运行引用有第三方 jar 包的 java 程序:

// 假设所在工作包含 commons-lang-3-3.9.jar 包
import org.apache.commons.lang3.StringUtils;

public class StringIsBlank {
  public static void main(String[] args) {
    System.out.println("Args size: " + args.length);
    System.out.println("First argument is blank: " + StringUtils.isBlank(args[0]));
    System.out.println("Second argument is blank: " + StringUtils.isBlank(args[1]));
    System.out.println("Third argument is blank: " + StringUtils.isBlank(args[2]));
  }
}
# 告诉 javac 所引用的三方类库的位置
javac -classpath commons-lang-3-3.9.jar StringIsBlank.java
# StringIsBlank运行所需要的类在 commons-lang-3-3.9.jar 和当前文件夹内进行寻找 -classpath 可简写为 -cp
# 在windows系统上使用;代替:符号
java -classpath commons-lang-3-3.9.jar:. StringIsBlank 1 2 3

java 传参问题

public class TestParams {
    public static int a;

    public static void setInt(int a) {
        a = 888;
    }

    public static void main(String[] args) {
        setInt(a);
//        此处打印的a的值为什么不是888?
        System.out.println(a);
    }
}
PreviousjavaNextlambda 表达式

Last updated 11 months ago

Was this helpful?