最新进度2021/03/25 学完网络编程,正在学多线程
java学习笔记
1 在操作系统之上增加了一个抽象层JVM,来实现跨平台性,只要安装了这个JVM,就可以运行java程序
2 三高:高可用,高性能,高并发
3 /**开头的是文档注释
4 字符类型char占2个字节
5 布尔类型占1位。
6 初始化long类型的时候,需要在数字后面加个L,例如long num4 = 30L;
7 初始化float类型的时候,需要在小数最后加个F,以区分float和double类型
8 引用类型:类,接口,数组
9 整数赋值:0开头表示8进制,0b开头表示二进制,0x开头表示16进制
10 float类型是有限的,离散的,有舍入误差的,大约的意思,接近但不等于
11 基于第10点,最好完全避免使用浮点数进行比较。银行业务表示钱,不能用浮点数,要用BigDecimal
12 所有的字符本质上还是数字,java使用Unicode表示字符
13 由于java是强类型语言,所以进行有些运算的时候,需要用到类型转换。
14 把高容量转换为低容量时,用强制类型转换,可能存在内存溢出或者精度问题
15 低容量转成高时,会自动转换。
16 除了基本类型,其余类型的默认值都是null
17 整型默认值是0,浮点型双精度浮点型默认值是0.0,boolean默认值是false
18 常量定义用final,一般用大写字符
19 修饰符不存在先后顺序,比如static,final,哪个在前都可以
20 instanceof属于关系运算符
21 IDEA快捷键:command+d复制当前行到下一行
22 对多个类型的数执行算术运算符时,结果跟随容量最长的那个类型,也叫自动转型。
23 很多运算用工具类运算,比如Math
24 短路运算:
如果&&逻辑运算符与的第一个运算数是假,则不会执行后面的那个运算数。
如果||逻辑运算符或的第一个运算数是真,则不会执行后面的那个运算数
25 位移:左移1位相当于乘以2,右移1位相当于除以2,而且运算效率极高。因为是直接进行最底层的高电平低电平位运算
26 +号进行了重载,只要+操作符的两个操作数里面有一个是字符串类型,则会自动把每个运算数转换成字符串类型,再进行字符串的拼接操作。但是如果字符串出现在多个+号最后面,前面是数字类型的+运算,仍旧会先进行数字类型的+运算,直到遇到字符串类型,才会转换成字符串类型拼接。
int a = 3;
int b = 4;
System.out.println(""+a+b);
System.out.println(a+b+"");
27 包的本质就是文件夹
28 scanner的hasNext和next哪个阻塞等待输入?
29 case穿透,如果case后面没有break,则匹配case及其后的case都会被执行,假设后面的case也没有break
30 switch适合匹配一系列具体的值,if适合比较范围区间,一个连续区间的范围
31 把字节码文件.class文件,直接丢到IDEA里面,就会自动反编译显示出来
32 java5引入了用于数组的增强型for循环
33 for循环的本质
先看个while循环
int i = 0 ;//初始化条件
int sum = 0 ;//初始化条件
while (i<=100){//条件判断
sum+=i;//循环体
i++;//迭代
}
System.out.println(sum);
34 IDEA写for循环的快捷键,数字.for,比如100.for+enter键会生成如下代码
for (int i = 0; i < 100; i++) {
}
35 死循环
while(true){}
for(;;){}
36 增强型for循环用于遍历数组或者集合,有个冒号在for里
37 设计方法的原则: 方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,也就是一个方法只完成一个功能,一个方法只做一件事,利于后面的扩展
38 方法里的return会返回值并终止方法
39 定义可变参数的方法
在类型后面有3个点的省略号然后跟形参名
可变参数必须是参数列表的最后一个方法
40 代码混淆:
使用代码混淆技术,编译时通过给内部方法和变量混淆成随机字符串,在不影响正常使用的情况下,防止反编译之后看到业务逻辑。增加了对敏感信息和业务逻辑的保护,提高了破解的门槛
41 递归结构包含两个部分:
递归头:什么时候不调用自身方法,没有递归头,将陷入死循环。也就是退出递归的条件
递归体:什么时候需要调用递归自身的方法
42 引用传递就是传递对象,本质还是值传递。
43 一个java文件里面,只能有一个public类,并且这个类名要和文件名完全一致。java文件里面的非public类可以有多个,这些就是内部类。
44 一个项目只应该存在一个main方法
45 面向对象编程的本质是以类的形式组织代码,以对象来封装数据
46 一个类即便什么也没有,也会有个构造器
47 构造器名字和类必须相同,必须没有返回值即使是void也不行。
48 使用new关键字的时候,必须要有构造器。构造器就是用来初始化数据的。new的本质是调用构造器
49 如果定义了有参数构造器,必须显式地定义无参构造器
50 高内聚,低耦合。高内聚就是类的内部数据操作细节细节完成,不允许外部干涉。低耦合是指仅暴露少量的方法供外部使用。
51 封装在属性层面:属性私有,通过get /set来存取
52 通过get/set方法操作数据,更安全,也更灵活。比如get数据其实就是调用了方法,哪天get到的数据要经过处理,只需要改get方法的内部逻辑就行了。外部调用处不用改。这就是解耦,封装的灵活性
53 封装:
提高程序安全性,保护了数据
隐藏代码实现细节
统一接口
系统可维护性增加
54 IDEA的快捷键ctr+h可以查看继承树
55 super关键字可以访问父类的方法和属性
56 构造器的调用顺序,首先会调用父类的构造器,然后才调用子类的构造器。
57 子类构造器调用父类构造器的代码必须在第一行
58 一个对象的实际类型是确定的。但是指向这个对象的引用类型就不确定了。可以是接口类型,可以是实际类型的父类,或者实际类型的抽象类
59 代码执行顺序:静态代码块,匿名代码块,构造器
60 静态代码块只会执行一次,类加载的时候执行。匿名代码每次生成新对象的时候都会执行,可以放对象初始化代码
61 静态导入包,import static java.lang.math.random;
62 接口的本质是契约
63 类只能有具体的方法
抽象类可以有具体的方法,还有抽象的方法。抽象类可以没有抽象方法,只包含具体方法。语法可行,但是失去抽象类的意义了。
接口只有抽象的方法,完全没实现的方法
64 OO的精髓就是对对象的抽象,最能体现这一点的就是接口。设计模式所研究的实际上是如何去抽象。所以讨论设计模式的时候只能针对具备抽象能力的语言
65 实现接口的类一定要去重写接口里面的所有方法
66 匿名内部类,不用将实例保存到变量中。new Apple().eat();
67 IDEA选中代码块后,快捷键comman+alt+T,会弹出try-catch-finally智能补全选项
68 端口号代表计算机的一个应用或者程序的进程
69 端口号规定范围是0-65535,单个协议下端口号不能相同,不同协议下端口号可以相同。udp:0-65535 tcp:0-65535
公有端口:0-1023
http:80
https:443
ftp:21
程序注册端口:
tomcat:8080
MySQL:3306
70 netstat -an 查看所有端口
71 在IDEA里面直接new的File,路径是从工程根目录开始的。也就是在项目里面用的路径,默认是从工程的根目录开始的
72 65535=2的16次方-1也等于16的4次方减一
73 .bat文件是dos下的批处理文件,内容是一系列dos命令的集合。类似于linus下的.sh文件
74 网络上一切传输都是流
75 udp聊天的套路:
发送:
建立Socket:DatagramSocket
创建数据包:DatagramPacket(需要有目标地址,目标端口,数据)
发送包socket.send(packet);
关闭流 socket.close();
接收
建立Socket:DatagramSocet
创建数据包:DatagramPacket(需要有字节数组buff,offset,length)
接收包 socket.receive(packet)
关闭流 socket.close();
76 tcp聊天的套路:
发送:
建立Socket:Socket(有目标地址和端口号)
获取输出流OutPutStream
发送数据:OutPutStream.write(byte[])
关闭资源:关闭输出流,关闭Socket
接收:
建立ServerSocket:需要有端口号,IP即为本程序被部署的服务器的IP
接受数据:死循环接收 serverSocket.accept()
获取输入流对象,serverSocket.getInputStream()
新建字节数组buffer作为临时存数据的地方。byte[] buffer = new byte[1024];
新建接受buffer所有数据的对象 ByteArrayOutputStream()
循环从输入流读取数据
关闭资源
77 udp互聊demo,多线程互聊demo。加入jar包使用实操
78 用java命令执行java类时,如果报”找不到或者无法加载主类”。可能是因为类没有用完整包名,回到包名根目录,java com.xxx.xxx
79 下载网络资源套路
创建url
url.openConnection
获取inputStream
创建FileOutPutStream来接收输出流到文件
通过byte[]数组缓存,循环把数据读写完成
清理资源
try {
URL url = new URL("http://localhost:8080/URLDemo/test.txt");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
FileOutputStream os = new FileOutputStream(new File("te.txt"));
byte[] buff = new byte[1024];
int len;
while ((len = is.read(buff))!=-1){
os.write(buff,0,len);
}
os.close();
is.close();
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
80
网友评论