0x05.HelloJAVA
基础知识
java的类目和文件名必须相同(区分大小写)
java文件,先编译成字节码(.class文件),然后在JAVA的虚拟机JVM上以解释方式执行字节码
java的项目里面包含了源代码、依赖、配置文件,会直接打包,生成编译后的项目
java的包,com.aaa.bbb相当于三个文件夹"."可以理解成/
属于某一个包的JAVA文件,必须声明包的名字(自动生成)
变量
- 字符串变量只能用双引号,字符型变量只能用单引号
String str1 = "apple";
char str2 = 'a';
- 变量在创建的时候,必须声明它的类型,后续使用不需要声明
String str = "hello";
System.out.println(str);
函数
- 函数需要声明返回值的类型,函数的形参也需要声明,构造方法不需要声明
- 作用域:代码块/函数的内部可以访问外部,外部不能访问内部
- 调用顺序:父类的代码块,父类的构造函数,当前类的代码块,当前类的构造函数
访问控制修饰符 返回值类型 函数名(形参){
函数体
}
//函数
public String get_str(){
return "hello";
}
//代码块
{
执行内容
}
- 调用函数的时候,先实例化
构造方法
//构造方法
public Test(){
System.out.println("构造方法");
}
//含参构造方法
public Test(String a){
System.out.println(a);
}
Test test = new Test("apple");//调用要传入对应的类型
静态方法和非静态的方法
非静态方法里面可以直接调用静态方法
静态方法不能直接调用非静态方法
函数的形参和成员变量
当函数的形参与成员变量名相同的时候,函数内会引用形参。但如果想要引用成员变量,使用this。this就是指调用该函数下的变量
访问控制修饰符
不声明的话,默认是default
son继承了test类,但是并没有在同一个包里面,而且变量a的修饰符是default,所以无法访问到。如果想要访问到,在变量a前面加上public
抽象类
抽象类不能被实例化,用于被其他类继承。抽象类可以包含抽象方法和具体方法
抽象方法:
在抽象类中声明但没有提供实现的方法。子类必须提供抽象方法的实现
抽象方法不能有主体,不可以加大括号
Animal作为抽象类
Dog类继承Animal类,并且Dog类会提供抽象方法的实现
由于抽象函数不能直接实例化,通过创建抽象类的非抽象子类的实例来间接实例化。这种隐式转换,无法直接调用子类的属性和方法,可以用反射的方法调用
接口
接口是一种抽象类型,类可以实现一个或多个接口,从而扩展其功能。接口是实现多继承的一种方式,并且通过接口,可以定义类之间的契约。
- 定义接口:和抽象类不同的是,接口里面不能有具体的方法。接口里的方法默认是抽象的
- 实现接口:类使用implements关键字实现继承,并且实现接口的类需要提供接口的所有抽象方法的实现
- 接口调用,和抽象类一样,接口不能直接实例化。只能通过实现接口的类进行间接实例化
数组
只能保存同一种数据类型
在Java中,有多种方法可以创建数组。以下是其中的一些方式:
- 静态初始化:
// 初始化整数数组
int[] numbers = {1, 2, 3, 4, 5};
// 初始化字符串数组
String[] names = {"Alice", "Bob", "Charlie"};
- 动态初始化:
// 初始化整数数组,指定长度
int[] numbers = new int[5];
// 初始化字符串数组,指定长度
String[] names = new String[3];
- 使用
new
关键字:
// 初始化整数数组
int[] numbers = new int[]{1, 2, 3, 4, 5};
// 初始化字符串数组
String[] names = new String[]{"Alice", "Bob", "Charlie"};
- 多维数组:
// 初始化二维数组
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
- 使用
Arrays
类:
// 使用 Arrays 类创建并初始化数组
int[] numbers = Arrays.copyOfRange(originalArray, from, to);
//originalArray 是要复制的原始数组,from 和 to 分别是复制的起始索引和结束索引。
IO流
- Stream
数据的输入和输出都是以“流”操作进行
流是用来运输数据的工具,所以每次要先实例化对象
InputStream,Reader,OutputStream,Writer都是抽象类,只能通过实例化子类对象,才能创建
输入流和输出流
输入流:数据从硬盘(外存,包括磁盘光盘等存储设备的数据)中读取到内存中
输出流:数据从内存输出,有可能是文件,数据库,网站等。写入文件
字节流和字符流
- 字节流:以字节为单位进行读写,适合处理二进制数据
- 字符流:以字符为单位进行读写,适合处理文本数据
- 字节流不需要编码,字符流需要编码
文件:保存数据的地方
字节流
- 输入流
FileInputStream fileInputStream = new FileInputStream("1.txt");
byte[] bytes = new byte[fileInputStream.available()];//装入数组,创建数组,里面代表当前数据的总大小
fileInputStream.read(bytes);//返回值是一个正常读取的字节数,如果读取完毕,访问最后一个字节,就返回-1
String str = new String(bytes);//将字节型数组转为字符串
System.out.println(str);
fileInputStream.close();
- 输出流
FileOutputStream fileOutputStream = new FileOutputStream("3.txt");
String str = "abcdhello";
fileOutputStream.write(str.getBytes());//要获取字节
fileOutputStream.close();
字符流
- 输入流
FileReader fileReader = new FileReader("1.txt");
char[] chars = new char[20];//多余的位置是很多的小方框
fileReader.read(chars);
System.out.println(chars);
fileReader.close();
- 输出流
FileWriter fileWriter = new FileWriter("3.txt");
String str = "apple";
fileWriter.write(str);
fileWriter.flush();
fileWriter.close();
转换流(字节流转化为字符流)
解决乱码问题,比如一个文件采用国标ANSI,中国一般实GBK,用字符流读取文件会乱码。但是如果是字节流的话,可以修改编码方式,可以改成utf-8(默认就是utf-8),为了看清楚效果,可以这样写
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"gbk");
- 输入
FileInputStream fileInputStream = new FileInputStream("1.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);//输入 字节流转换成字符流
char[] chars = new char[20];
inputStreamReader.read(chars);//变成字符流,FileReader
fileInputStream.close();
inputStreamReader.close();
- 输出
FileOutputStream fileOutputStream = new FileOutputStream("2.txt");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);//输出
String str = "halo";
outputStreamWriter.write(str);//FileWrite
outputStreamWriter.write("星期日",0,2);//追加内容
outputStreamWriter.flush();
outputStreamWriter.close();
fileOutputStream.close();
缓冲流
缓冲流意思是从内存中开辟一段空间, 先将普通的输入流传入其中, 等到读写操作的时候, 直接从内存中进行读取, 从而提高读写的速度
//字节流输入
FileInputStream fileInputStream = new FileInputStream("1.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
byte[] bytes = new byte[bufferedInputStream.available()];
bufferedInputStream.read(bytes);
String str = new String(bytes);
System.out.println(str);
//其他的都类同
//bufferedReader可以使用readLine一次性读取一行数据
BufferedReader bufferedReader = new BufferedReader(new FileReader("1.txt"));
String res = bufferedReader.readLine();
System.out.println(res);
//其他几种
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("1.txt"));//字节输入流
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("1.txt"));//字节输出流
BufferedReader bufferedReader = new BufferedReader(new FileReader("2.txt"));//字符输入流
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("1.txt"));//字符输出流
命令执行
- Runtime类
Runtime runtime = Runtime.getRuntime();//单例模式实例化 使用Runtime.getRuntime() 访问静态方法进行实例化
Process process = runtime.exec("whoami");//命令执行 传入需要执行的命令, 执行后返回process对象
InputStream inputStream = process.getInputStream();//获取执行结果的输入流
//获取执行结果的输入流
int a = -1;
byte[] bytes = new byte[100];
while((a = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes));
};
Runtime类不能直接实例化,只能采用单例模式实例化
- processbuilder类
ProcessBuilder processBuilder = new ProcessBuilder("whoami");//打开一个进程 向构造方法传入执行的命令
Process pb = processBuilder.start();//执行命令, 返回process对象
InputStream inputStream = pb.getInputStream();//获取执行命令程序的输入流
//循环装箱读取
int a = -1;
byte[] bytes = new byte[100];
while((a = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes));
};
JAVA反射
未完待续
序列化
反序列化漏洞:程序在反序列化期间,通过特殊的调用链引发的一系列安全问题。当目标程序对攻击者可控的数据进行反序列化处理时产生的安全问题。
1.序列化就是在保存数据时,保存数据的值和数据类型。对象----->字节流
2.反序列化就是在恢复数据时,恢复数据的值和数据类型。字节流----->对象
3.需要让某个对象支持序列化机制,必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
- Serializable //这是一个标记接口,没有方法(被序列化的对象的类,要有这个接口的意思)
- Externalizable //该接口有方法需要实现,因此我们一般实现上面的
4.读取(反序列化)的顺序需要和你保存的数据(序列化)的顺序一致
5.序列化对象时,默认将里面所有属性都进行序列化,除了static和transient,transient表示在对象序列化过程中应该被忽略。
6.序列化对象时,要求里面属性的类型也需要实现序列化接口(上面这些,是因为父类有Serializable接口,如果没有,直接f4给它加上)
7.序列化具备可继承性,也就是如果某类已经实现了序列化, 则它的所有子类也已经默认实现了序列化
OutputStream outputStream = new FileOutputStream("1.ser");//硬盘数据需要通过文件流读取,文件流读取之后,再放到外面,也就是到了OutputStream,再走到对象流里
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeInt(100);
objectOutputStream.writeBoolean(true);
objectOutputStream.writeChar('a');
objectOutputStream.writeDouble(9.5);
objectOutputStream.writeUTF("星期日");//str类型
objectOutputStream.writeObject(new Test());
//这些类型都是可以序列化的,就比如integer,他的父类是number,这个父类有serializable接口
//这些是序列化的过程,反序列化需要和序列化的顺序一致
// 创建一个 FileInputStream 来读取序列化文件
FileInputStream fileInputStream = new FileInputStream("1.ser");
// 创建一个 ObjectInputStream 来从文件输入流中读取对象
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
// 使用不同的方法读取序列化文件中的数据
int intValue = objectInputStream.readInt();
boolean booleanValue = objectInputStream.readBoolean();
byte byteValue = objectInputStream.readByte();
byte[] byteArrayValue = new byte[5];
objectInputStream.readFully(byteArrayValue);
double doubleValue = objectInputStream.readDouble();
String stringValue = objectInputStream.readUTF();
// 打印读取的数据
System.out.println("int: " + intValue);
System.out.println("boolean: " + booleanValue);
System.out.println("byte: " + byteValue);
System.out.println("byte array: " + new String(byteArrayValue));
System.out.println("double: " + doubleValue);
System.out.println("String: " + stringValue);
// 关闭输入流
objectInputStream.close();
代码
helloJAVA
- Main.java
import com.ccc.*;
public class Main {
public static void main(String[] args) {
// System.out.println("hello world");
//
// String str = "hello";
// System.out.println(str);
//
// String str1 = "apple";
// char str2 = 'a';
// Test test = new Test("apple");
// System.out.println(test.get_int());
// System.out.println(test.get_str());
// test.get_void();
// 调用静态方法
// test.no_sta();
// 作用域
// Son son = new Son("bana");
// 抽象类
// Animal dog = new Dog();
// dog.makeSound();
// dog.sleep();
// 接口
// interf bob = new bobInter();
// bob.eat();
// bob.getup();
// for循环
int[] ints = {1,2,3,4,5,6,7,8,9,10};
// 方法一
// for(int i=0;i<10;i++){
// System.out.println(ints[i]);
// }
// 方法二foreach
for (int j:ints){
System.out.println(j);
}
}
}
- Test.java
package com.ccc;
public class Test {
String a = "外部变量";
//代码块
{
System.out.println("代码块");
}
//无参的构造函数
public Test(){
System.out.println("构造方法");
}
//含参的构造方法
public Test(String a){
System.out.println(a);
System.out.println(this.a);
}
//字符串
public String get_str(){
return "hello";
}
//整型
public int get_int(){
return 12345;
}
//无返回值
public void get_void(){
System.out.println("没有返回值的函数");
}
//静态方法和非静态方法
public void no_sta() {
System.out.println("非静态的方法");
sta();
}
public static void sta() {
System.out.println("这是静态方法");
// no_sta();
}
}
- Son.java
import com.ccc.Test;
public class Son extends Test{
public Son(String a){
super(a);
}
}
- Animal.java 抽象类
package com.ccc;
public abstract class Animal {
//抽象方法,没有实现
public abstract void makeSound();
public void sleep(){
System.out.println("Zzz");
}
}
- Dog.java 继承抽象类
package com.ccc;
public class Dog extends Animal{
public void makeSound(){
System.out.println("Bark");
}
}
- interf.java 接口
package com.ccc;
public interface interf {
public void eat();
public void getup();
}
- bobInter.java 调用接口
package com.ccc;
public class bobInter implements interf{
public void eat(){
System.out.println("happy");
}
public void getup(){
System.out.println("fuck");
}
}
helloIO
Main.java
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
//字节流 输入流
// FileInputStream fileInputStream = new FileInputStream("2.txt");
// byte[] bytes = new byte[fileInputStream.available()];
// fileInputStream.read(bytes);
// String str =new String(bytes);
// System.out.println(str);
// fileInputStream.close();
//字节流 输出流
// FileOutputStream fileOutputStream = new FileOutputStream("3.txt");
// String str = "哈哈哈haha";
// fileOutputStream.write(str.getBytes());
// fileOutputStream.close();
//字符流 输入流
// FileReader fileReader = new FileReader("3.txt");
// char[] chars = new char[100];
// fileReader.read(chars);
// System.out.println(chars);
// fileReader.close();
//字符流 输出流
// FileWriter fileWriter = new FileWriter("4.txt");
// String str = "你好hello你好";
// fileWriter.write(str);
// fileWriter.close();
//缓冲流 字节输入流
// FileInputStream fileInputStream = new FileInputStream("3.txt");
// BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
// byte[] bytes = new byte[bufferedInputStream.available()];
// bufferedInputStream.read(bytes);
// String str = new String(bytes);
// System.out.println(str);
// bufferedInputStream.close();
//缓冲流 字节输出流
// FileOutputStream fileOutputStream = new FileOutputStream("5.txt");
// BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
// String str = "ininin";
// bufferedOutputStream.write(str.getBytes());
// bufferedOutputStream.close();
//缓冲流 字符输入流
// FileReader fileReader = new FileReader("3.txt");
// BufferedReader bufferedReader = new BufferedReader(fileReader);
// char[] chars = new char[100];
// bufferedReader.read(chars);
// System.out.println(chars);
// bufferedReader.close();
//缓冲流 字符输出流
// FileWriter fileWriter = new FileWriter("6.txt");
// BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
// String str = "kkkkkklllllllll";
// bufferedWriter.write(str);
// bufferedWriter.close();
//字符转换成字节 输入流
// FileInputStream fileInputStream = new FileInputStream("3.txt");
// InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
// char[] chars = new char[100];
// inputStreamReader.read(chars);
// System.out.println(chars);
// inputStreamReader.close();
//字符转换成字节 输出流
// FileOutputStream fileOutputStream = new FileOutputStream("7.txt");
// OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
// String str = "pppppppppppppppppppiiiii";
// outputStreamWriter.write(str);
// outputStreamWriter.close();
//命令执行
//Runtime类
// Runtime runtime = Runtime.getRuntime();
// Process process = runtime.exec("ipconfig");
//
// InputStream inputStream = process.getInputStream();
// byte[] bytes = new byte[20];
// int a = -1;
// while ((a=inputStream.read(bytes))!=-1){
// System.out.println(new String(bytes));
// }
//ProcessBuilder类
// ProcessBuilder processBuilder = new ProcessBuilder("ipconfig");
// Process process = processBuilder.start();
//
// InputStream inputStream = process.getInputStream();
// int a=-1;
// byte[] bytes = new byte[20];
// while ((a=inputStream.read(bytes))!=-1){
// System.out.println(new String(bytes));
// }
}
}
helloSerialization
0x05.HelloJAVA的更多相关文章
- 0x05: post 守护进程(deamon) json 任务调度
python 签名 post #coding:utf-8 import urllib,urllib2 url='http://wtf.thinkphp.com/index.php?m=&c=t ...
- 0x05 MySQL 数据操作
一 插入数据INSERT 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); 语法二: INSERT I ...
- 0x05 排序
说是排序结果就是各种奇技淫巧 中位数被坑多了久病成医,例题一题搞笑一题糖果传递(昨晚精神那么好效率还那么差) #include<cstdio> #include<iostream&g ...
- Docker 0x05: Dockerfile制作镜像
目录 Dockerfile制作镜像 一句话什么是dockerfile dockerfile脚本指令 小结 Dockerfile制作镜像 dockerfile 可以是制作自己镜像的脚本文件,按照这个脚本 ...
- 推荐系统实践 0x05 推荐数据集MovieLens及评测
推荐数据集MovieLens及评测 数据集简介 MoiveLens是GroupLens Research收集并发布的关于电影评分的数据集,规模也比较大,为了让我们的实验快速有效的进行,我们选取了发布于 ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- 【AR实验室】ARToolKit之概述篇
0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- ArcGIS 10.0紧凑型切片读写方法
首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
随机推荐
- AVR汇编(三):寻址方式
AVR汇编(三):寻址方式 AVR具有多种寻址方式,在介绍具体的汇编指令之前,有必要对它们做一定了解. 前面介绍过,AVR将内存空间分为多个部分:寄存器堆.I/O空间.数据空间.程序空间.这些空间支持 ...
- 小版本更新kubernetes
小版本更新kubernetes 背景 最近一段时间躺平了没有更新我的博客文档.感谢各位小伙伴一直以来的支持. 此脚本基于 https://github.com/cby-chen/Kubernetes/ ...
- 将实体类对象数据存入和读取进csv文件(可追加)
前言 最近公司一个新的项目,因为需要存储的数据很少,单独去部署一个数据库去存储该数据显然是不划算的,所以想的是通过存入csv文件中来代替存入数据库中.说干就干. 什么是csv文件 CSV代表逗号分隔值 ...
- 3.你所不知道的go语言控制语句——Leetcode习题69
目录 本篇前瞻 Leetcode习题9 题目描述 代码编写 控制结构 顺序结构(Sequence) 声明和赋值 多返回值赋值 运算符 算术运算符 位运算符 逻辑运算 分支结构 if 语句 switch ...
- [ABC128E] Roadwork
2023-01-14 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 区间覆盖,线段树,双堆 解题思路 可以将问题转化为区间覆盖问题和单点查询问 ...
- 《SQL与数据库基础》16. 锁
目录 锁 全局锁 表级锁 表锁 元数据锁 意向锁 行级锁 行锁 间隙锁 临键锁 本文以 MySQL 为例 锁 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU. ...
- influxdb 函数 non_negative_derivative 使用
转载请注明出处: 在InfluxDB中,non_negative_derivative()函数用于计算指定字段的非负导数.它可以用来计算时间序列数据的速率或增长率. 该函数的语法如下: non_neg ...
- 云上的甜蜜早安:腾讯云云函数助力PHP打造女友专属每日推送
用腾讯云的云函数做一个微信公众号早安,每天定时发送早安给你的女朋友! 1.首先我们登录腾讯云,在搜索栏搜索云函数,或直接用这个链接进入curl.qcloud.com/Td0IkpmD 2.进入云函数, ...
- Elasticsearch整合SpringBoot案例
1.elasticsearch官方文档的使用与介绍 1.1.Rest客户端初始化官方文档链接: https://www.elastic.co/guide/en/elasticsearch/client ...
- springBoot使用注解Aop实现日志模块
我们在日常业务操作中需要记录很多日志,可以在我们需要的方法中对日志进行保存操作,但是对业务代码入侵性大.使用切面针对控制类进行处理灵活度不高,因此我们可以使用自定义注解来针对方法进行日志记录 1.注解 ...