JAVA学习
类型转换
public class Dem3 {
public static void main(String[] args) {
int i = 128;
byte b = (byte)i;//内存溢出,Byte最大127
//强制转换 (类型)变量名 高———低
//自动转换 低到高
int j = 128;
double d = j;
//byte,short,char->int->long->float->double
System.out.println(i);
System.out.println(b);
System.out.println("========================");
System.out.println(j);
System.out.println(d);
}
}
- 注意
- 不能对布尔值进行转换
- 不能把对象类型转换为不相干的类型
- 在把高容量转换到低容量的时候,强制转换
- 转换的时候可能存在内存溢出,或者精度丢失问题
一些小技巧
public class Dem4 {
public static void main(String[] args) {
//操作数比较大的时候,注意溢出问题
//数字之间可以用下划线分割,输出时不会输出下划线
int money = 10_0000_0000;
int years = 20;
System.out.println("钱:" + money);
int total = money*years;
System.out.println(total);//-1474836480,计算时溢出了
long total2 = money*years;
System.out.println(total2);//-1474836480,由int转为long前已经存在溢出了
//可以这样
long total3 = money * (long)years;//先把一个整数转换为long
System.out.println(total3);
//L l 建议写大写的L小写已看成是1
}
}
变量
public class Dem5 {
//类变量 static
static double salary = 2500;//salary工资
//属性:变量
//实例变量:从属于对象;不初始化会返回默认值 0 0.0
//布尔值:默认是false
//除了基本类型,其余默认值都是null
String name;
int age;
//main方法
public static void main(String[] args) {
//局部变量:必须声明和初始化
int i = 10;
System.out.println(i);
//变量类型 变量名字 = new Dem5()
Dem5 dem5 = new Dem5();
System.out.println(dem5.age);
System.out.println(dem5.name);
//类变量 static
System.out.println(salary);
}
//其他方法
public void add(){
}
}
命名规范
- 所有变量、方法、类名:见名知意
- 类成员变量:首字母小写和驼峰原则:monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写和驼峰原则:People,GoodMan
- 方法名:首字母小写和驼峰原则:run(),runRun()
常量
public class Dem6 {
//final常量修饰符
//修饰符不存在先后顺序
static final double PI = 3.14;
//final static double PI = 3.14;也正确
public static void main(String[] args) {
System.out.println(PI);
}
}
运算符
二元运算
package operator;
public class Dem01 {
public static void main(String[] args) {
// 二元运算
//Ctrl + D:复制当前行到下一行
int a = 10;
int b = 20;
int c = 25;
int d = 25;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/(double)b);
}
}
package operator;
public class Dem02 {
public static void main(String[] args) {
long a = 123123123123123123L;
int b = 123;
short c = 10;
byte d = 9;
//当运算时有一个long结果就为long
//用short,byte,char运算时结果一般为int或者short
System.out.println(a+b+c+d);//Long
System.out.println(b+c+d);//Int
System.out.println(c+d);//Short
}
}
关系运算符
package operator;
public class Dem03 {
public static void main(String[] args) {
//关系运算符返回的结果:正确,错误 布尔值
int a = 1;
int b = 2;
int c = 3;
System.out.println(c%b);//c/a 3/2 =1...1
System.out.println(a>b);
System.out.println(a<b);
System.out.println(a==b);
System.out.println(a!=b);
}
}
自增运算符
package operator;
public class Dem04 {
public static void main(String[] args) {
//++ -- 自增,自减 一元运算符
int a = 2;
int b = a++;//先赋值后自增
System.out.println(b);
System.out.println(a);
int c = ++a;//先自增后赋值
System.out.println(c);
System.out.println(a);
//幂运算 2^3 = 2*2*2 = 8 用一些工具类来操作
//自动补全返回值类型 Ctrl + Alt + V
double pow = Math.pow(3, 2);
System.out.println(pow);
}
}
逻辑运算符
package operator;
//逻辑运算符
public class Dem05 {
public static void main(String[] args) {
//与 或 非
//and or 取反
boolean a = true;
boolean b = false;
System.out.println("a && b:"+(a&&b));//逻辑与运算:两个变量都为真,结果才为true
System.out.println("a || b:"+(a||b));//逻辑或运算:两个变量有一个为真,则结果才为true
System.out.println("!(a && b):"+!(a&&b));//逻辑非运算:如果是真,则变为假,否则,相反
//短路运算
int c = 2;
boolean d = (c<1)&&(c++<1);//c<1为false,不执行&&后面的
System.out.println(d);
System.out.println(c);
}
}
位运算符
package operator;
public class Dem06 {
public static void main(String[] args) {
/*位运算
A = 0011 1100
B = 0000 1101
A&B = 0000 1100 一位一位来,00得0,01得0,11得1
A|B = 0011 1101 一位一位来,00得0,01得1,11得1
A^B = 0011 0001 异或,相同为0,相异为1
~B = 1111 0010 取反,0变1,1变0
2*8 = 16 2*2*2*2
2<<3 = 16 常用在计算底层得一些运算
0000 0000 0
0000 0010 2
↑ 从这开始
0000 0100 4
↑ 移一位
0000 1000 8
↑ 再移一位
0001 0000 16
↑ 再移一位
共移了三位,所以 2<<3 = 16
*/
System.out.println(2<<3);
}
}
扩展赋值运算符
package operator;
public class Dem07 {
public static void main(String[] args) {
int a = 10;
int b = 20;
a += b;//a = a + b
System.out.println(a);
//字符串连接符
System.out.println(a+b);
System.out.println(""+a+b);//String + ...,会转成字符串
System.out.println(a+b+"");
}
}
条件运算符
package operator;
public class Dem08 {
public static void main(String[] args) {
//x ? y : z
//如果x==true,则结果为y,否则结果为z
int score = 80;
String type = score<60?"不及格":"及格";
//if也可以
System.out.println(type);
}
}
运算符优先级
优先级(高到低) | 运算符 | 结合性 |
---|---|---|
1 | ()、[]、{} | 从左向右 |
2 | !、+、-、~、++、– | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | «、»、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= | 从右向左 |
- 为了避免运算符优先级造成得错误,可以多打(),方便自己理解
包机制
- 格式
package pkg1.pkg2.pkg3...;
- 一般用公司域名倒置作为包名
package com.baidu.www;
- 导包
import pkg1.pkg2.(classname|*);
*.导入包内所有类
JavaDoc
参数信息
/** */
- @author 作者名
- @version 版本号
- @ since 指明需要最早使用得jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
加在哪,就是哪里得注释
- 打开index.html
Scanner对象
- 导包
import java.util.Scanner;
- 基本语法
Scanner scanner = new Scanner(System.in);
next()与hasNext()
package com.yjj.base.scanner;
import java.util.Scanner;
public class Dem01 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNext()){
//使用next方式接收
String string = scanner.next();
System.out.println("用户输入了:"+string);
}
//凡是属于IO流得类如果不关闭会一直占用资源,用完就关
scanner.close();
}
}
nextLine()与hasNextLine()
package com.yjj.base.scanner;
import java.util.Scanner;
public class Dem02 {
public static void main(String[] args) {
//从键盘接收数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
//判断是否还有输入
if(scanner.hasNextLine()){
String str = scanner.nextLine();
System.out.println("用户输入了:"+str);
}
scanner.close();
}
}
next()与nextLine()得区别
-
next()
- 一定要读取到有效字符后才可以结束输入。
- 对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next()不能得到带有空格的字符串。
-
nextLine()
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
- 可以获得空白。
两个小案例
判断用户输入的是整数还是小数
package com.yjj.base.scanner;
import java.util.Scanner;
public class Dem03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//从键盘接收数据
int i = 0;
float f = 0.0f;
System.out.println("请输入整数");
if(scanner.hasNextInt()){
i = scanner.nextInt();
System.out.println("整数数据:"+i);
}else{
System.out.println("输入得不是整数!");
}
System.out.println("请输入小数");
if(scanner.hasNextFloat()){
f = scanner.nextFloat();
System.out.println("小数:"+f);
}else{
System.out.println("输入得不是小数!");
}
}
}
根据用户输入的数字求平均数和总和
package com.yjj.base.scanner;
import java.util.Scanner;
public class Dem05 {
public static void main(String[] args) {
//输入多个数字,并求其总和与平均数,每输入一个数字用回车确认,通过非数字来结束输出并输出结果
Scanner scanner = new Scanner(System.in);
//和
double sum = 0;
//计算输入了多少个数字
int m = 0;
System.out.println("请输入数字,回车确认,非数字结束");
//通过循环判断是否还有输入,并在里面对每一次求和统计
while (scanner.hasNextDouble()){
double x = scanner.nextDouble();
m++;
sum += x;
System.out.println("你输入了第"+m+"个数据,当前结果为:"+sum);
}
System.out.println(m + "个数的和为" + sum);
System.out.println(m + "个数的平均值为" + (sum/m));
scanner.close();
}
}
反编译
- 点击项目结构
- 复制路径
- 打开路径下的文件找到当前项目的.class
- 找到项目的.java
- 将.class复制到.java文件夹下
- 回到IDEA,多了个01图标的文件,双击即可
- 每一个字符串都有一个由特定算法得出的hashCode