2020-10-20 Java基础小记

【堆和栈】:
      例如:Test test = new Test("a");
      // Test("a");构造函数(实际的对象),存在于堆 ;“a”为构造方法的形参,
      // test:对象的引用变量,存在于栈
      堆:(对象)
         引用类型的变量,其内存分配在堆或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。堆内存主要作用是存放运行时创建(new)的对象。(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)
      栈:(基本数据类型变量、对象的引用变量)
         基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。
         栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)
      13.2.1 为什么有栈内存和堆内存之分?
         当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法定义的变量将会放到这块栈内存里,随着方法的结束,这个方法的内存栈也将自动销毁。(不需要GC回收)因此,所有在方法中定义的局部变量放在栈内存中;当我们在程序中创建一个对象时,这个对象会被保存到运行时数据区中,以便反复利用(复用,因为创建对象的成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随着方法的结束而销毁,即使方法结束后,这个对象还可能被另外一个引用变量所引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量去引用它时,系统的垃圾回收器(GC)才会在合适的时候回收它。
      13.2.2 为什么上面说创建对象的开销(成本)比较大?
         来看看如何创建对象、创建对象的过程:
         创建对象的根本途径是构造器,通过new关键字来调用某个类的构造器即可创建这个类的实例。但对象不是完全由构造器来负责创建的,实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了---这些是在构造器执行之前就完成的,也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这对象还不能被外部程序访问,只能在构造器中通过this来引用。当构造器的执行体执行结束后,这个对象作为构造器的返回值被返回,通常还会赋给另外一个引用类型的变量,从而让外部程序可以访问。
(当然可以通过设置构造器的访问权限private,阻止其他类创建该类的实例)
【实用类】 ----2-P33
【方法重载】:是对一般方法的升级,可以根据参数的不同,采用不同的实现方法,而且不需要编写多个名称,只记住一个方法名即可
      *同一个类中
      *方法名相同,参数的类型和个数不同  
【方法重写/覆盖】: 若从父类继承的方法不能满足子类的需求,在子类中可对父类的方法进行重写
      * 子类重写父类的方法
      *    1.发生在2个类之间
      *    2.子类的访问权限不能小于父类的(返回类型、方法名、参数列表与继承的方法相同)
      *      仅方法体内容不同;想保留父类的方法,可通过(super.方法名)来调用      
【重载与重写(覆盖)的区别】 :overload与override
      JAVA中多态的实现机制主要通过overload和override实现。
         1)方法的重载:简言之,就是指同一个类有多个同名的方法,这些方法拥有不同的参数(同名不同参)。可以认为是类中方法的多态性,也称为编译时多态。
         2)方法的重写(覆盖):子类可覆盖父类的方法,已达到“个性化“的目的。(同名同参同类型)使得JAVA可以在运行时动态绑定(将一个方法的调用与一个方法的主体连接在一起),也称为运行多态。


静态和动态:
【静态变量】:
      静态变量(全局变量):声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:
         · 它们仅能调用其他的static 方法。
         · 它们只能访问static数据。
         · 它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。
【静态方法/非静态态方法】:
      静态方法和非静态方法区别:
         1)静态方法可以用类名直接调用,如:类名.静态方法名 ,非静态方法要一定要获得类的实例才可以,比如:类名 实例名 = new 类名();    获得实例后用 实例名.方法名 这样的方式调用。
         2)静态方法和非静态方法。区分就看关键字“static”。
      在定义方法时候有这个关键字就是静态方法,没有就是非静态方法。
         例:public static void test1(){}   静态方法
             public void test2(){}          非静态方法
         3)用法区别,静态方法调用时候直接类名加方法。非静态方法只能由类的实例来调用。
         例:一个类A。它中有上面例子的2个方法。
          你在main方法中,可以直接写A.test1();不能写A.test2();
          想用test2方法,必须这样来。先A a = new A(); a.test2();

静态页面///
静态变量说白了就是一个全局的变量!-----不用创建对象就可以直接使用,而且只初始化一次!
非静态需要通过对象来调用的。
 
从本质上讲 静态变量属于类所有
非静态变量属于对象所有
从使用的效果上看 静态变量是属于类所有的 也就是定义了一个类
不需要申请对象就就可以使用改变量
而非静态变量是属于对象的..一定要申请对象才能使用该变量
 变量用完后 内存马上释放 这个说得不完整..
对象占的空间什么时候释放 看的JAVA垃圾回收系统 一般是
你这个变量最后一次使用完了之后 在下一次有新变量申请的时候系统检测一次是否有垃圾需要回收
【static关键字】:
      原网址:https://blog.****.net/emira_j/article/details/51198518
写JAVA程序时,经常会对类的内部成员进行static修饰,那到底static有什么作用呢?为什么要有它?
static是指静态的意思。它的作用主要为两个方面和4种使用情况:
两大作用:
1)为某特定的数据类型或者对象分配单一的存储空间。(静态也就是独立)
2)实现某个方法、属性或类,而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或者使用类的属性。
四大使用情况:
1)成员变量。
java没有全局的概念 ,而static可以达到全局的效果。静态变量(static修饰)属于类,在内存中只有一个复制(所有实例都指向一个内存地址),只要静态变量所在类被加载,就被分配空间,可以直接使用。(类.静态变量和对象.静态变量)
如:public  static int sum=0;
2)成员方法。
静态方法(static修饰)是类的方法,不需要创建对象就可以别调用,而非静态变量(无static修饰)是对象的方法,需要对象创建后才可以被使用。static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法。因为当static 方法被调用时,这个类的对象可能还没被创建即使已经创建了,也无法确定地调用对象的哪个方法。static 方法不能访问非static类型的变量。(静静结合)PS:不能再成员函数内定义静态变量
如:public static String method(){  return new String(data);}
static的一个重要用途:实现单例模式。即该类只能有一个实例,必须隐藏类的构造方法(private修饰),并提供一个创建对象的方法。把创建对象的方法声明为static。
如:
class SingleMode{
private static SingleMode instance=null;
private SingleMode(){}//构造方法
public static SingleMode getInstance(){ //创建对象的方法
if(instance ==null){
instance=new SingleMode();
}
return instance;
}
}
3)代码块。
静态代码块(static修饰)在类中是独立于成员变量和成员函数的代码块。JVM加载类时会直接执行static代码块,常用于初始化静态变量,只执行一次。
如:static{  Test.sum=1;}
4)内部类。
静态内部类(static修饰)不依赖于外部类的实例对象而被实例化,通常内部类需要外部类实例化后才能实例化。它不能与外部类同名(不同名),不能访问外部类的普通成员(非static修饰的变量和方法)PS:只有内部类才能用static修饰
如:
static class Inner{ 
void print(){
 System.out.print("我是内部类");


public static void main(String[] args){
  Test.Inner mytest=new Test.Inner();
  myTest.print();
}


【协议】:
6.1 TCP/IP协议:
https://jingyan.baidu.com/article/359911f5492b5c57ff03065f.html
用信件打个比方,IP就像写的地址,让邮递员知道可以在哪里找到收信的人,TCP就像是写的收件人,邮件到了该到的地方后,知道该交给谁。而在这里邮件就好象是在网络中传输的数据,帮助找到接收到主机和相关应用程序。
TCP/IP也称"国际协议簇", 即不仅指 TCP/IP协议本身,而且包括与其有关的协议。 TCP为传输控制协议,IP为网际协议,是网络层最重要的协议。采用TCP/IP协议通过互联网传送信息可减少网络中的传输阻塞,方便大批量的数据在网上传输,从而提高网络的传输效率。  TCP/IP协议族中包括上百个互为关联的协议
6.2 SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
(1) 所有信息都是加密传播,第三方无法窃听。
(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。
(3) 配备身份证书,防止身份被冒充
6.3 SOAP:简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

【标记语言】:
7.1 SGML(标准通用标记语言):SGML是最早的标注语言,HTML和XML都是在此基础上派生出来的。SGML是一种丰富的元语言, 几乎可以用来定义无数种标注语言。
7.2 HTML(超文本标记语言):HTML特别适用于页面的显示。HTML是一种文档生成语言,它包括一套定义文档结构和类型的标 记,用来描述文档内文本元素之间的关系。
7.3 XML(可扩展标记语言):标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。XML是目前最新的语言,用来定义数据结构,这种数据结构对包括电子商务在内的大规模数据传输是非常重要的,而HTML只确定页面如何显示。 XML使设计者很容易地以标准化的、连续的方式来描述并传输来自任意应用程序的结构化数据。
标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。
7.4 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
1.1 XML 指扩展标记语言 
XML 被设计用来传输和存储数据。
XML 是独立于软件和硬件的信息传输工具
XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享
1.2 css:
1.3 HTML:
HTML 被设计用来显示数据


http和webservice:
webservice :soap调用
http:servlet调用----servlet容器响应http请求
1. HTTP协议:
超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。
2. http工作方式:
HTTP 的工作方式是客户机与服务器之间的请求-应答协议。
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.asp?name1=value1&name2=value2
查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
3. http接口:
http接口有什么用,个人体会是,http接口最主要的作用是能够较好地解决不同系统(可能是功能不同、开发语言不同、服务商不同,等等,但都是基于http服务的)之间的交互的需求,比如像微信公众号的各种接口,不管是使用Java开发还是PHP进行开发,不管是A公司在开发还是B公司在开发,也不管是要做商城系统还是做企业宣传网站,都一样可以很好地调用。
双方通过HTTP方式交互数据,第三方可以简单的“name=value”方式发送提交内容或响应请求内容。即通过HTTP的GET/POST方式交换。 另外双方需要保证数据传输的完整性和 安全性,每次发送请求都有响应(响应返回格式为纯文本),安全验证目前采用用户名和密码的方式。
服务器接收数据可以是GBK或UTF-8编码字符,默认接收数据是GBK编码,如提交的是UTF-8编码字符,需要添加参数encode=utf8。 请求响应返回内容是GBK编码。
4. http和https区别:
https://www.zhihu.com/question/19577317中提到:
http是普通超文本协议,而https就是安全超文本传输协议,需要证书和提供安全链接。
http新新是明文传送,https是嵌套了SSL加密的http连接,其内容会有SSL先加密,然后再传送。
http+ssl=https
端口80,443
http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器都无法验证对方的身份。
https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对加密的**用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
https://zhidao.baidu.com/question/57526226.html SSL 和 TLS 协议

4.4 http请求:

4.4.1 报文分析:

Request:

 

2020-10-20 Java基础小记2020-10-20 Java基础小记

Response:

2020-10-20 Java基础小记2020-10-20 Java基础小记

 

4.4.2 简单介绍

http协议可以说是现在Internet上面最重要,使用最多的协议之一,越来越多的java应用需要使用http协议来访问网络资源

HttpClient不是浏览器,它是一个HTTP通信库,它只提供一个通用浏览器应用程序所期望的功能子集,HttpClient只能以编程的方式通过其 API用于传输和接受HTTP消息。

4.4.3 方法:

调用CloseableHttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;

调用CloseableHttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

通过CloseableHttpEntity的getEntity取得实体之后,有两种处理结果的方法:

方法一:使用EntityUtils来处理。

       该类是官方提供的一个处理实体的工具类,toSting方法将返回的实体转换为字符串,但是官网不建议使用这个,除非响应实体从一个可信HTTP服务器发起和已知是有限长度的。

方法二:使用InputStream来读取

       因为httpEntity.getContent方法返回的就是InputStream类型。这种方法是官网推荐的方式,需要记得的是要自己释放底层资源。

5. webService:
WebService是一种跨编程语言和跨操作系统平台的远程调用技术
SOAP:简单对象访问协议,很轻量,同时作为应用协议可以基于多种传输协议来传递消息(Http,SMTP等)。
webService底层SOAP协议,主要核心是面向活动。
传递参数可以为数组,对象等... 由于要进行xml解析,速度可能会有所降低。
使用HTTP协议来通信
webservice走HTTP协议和80端口
而你说的api,用的协议和端口,是根据开发人员定义的
这么说吧,api类似于cs架构,需要同时开发客户端API和服务器端程序
而WebService则类似于bs架构,只需要开发服务器端,不需要开发客户端,客户端只要遵循soap协议,就可以调用
webService三要素:soap用来描述传递信息的格式, WSDL 用来描述如何访问具体的接口, uddi用来管理,分发,查询webService

6. 链接详解:
webservice详解
https://zhidao.baidu.com/question/589480276.html?qbl=relate_question_4&word=http%BA%CDwebservice
webservice概念详解
https://www.cnblogs.com/fnng/p/5524801.html
WebService之调用soap服务(wsdl文件)
https://blog.****.net/lovecarpenter/article/details/53946108
java调用webservice接口 几种方法(webservice的 发布一般都是使用WSDL文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使用的接口。)
https://blog.****.net/qq_35124535/article/details/62226585


Json和Xml:
XML定义扩展标记语言,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XMLDocument),是当前编程中最为流行的数据交换格式,拥有跨平台、跨语言的优势。
JSON定义JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。      
 
用JSON对象来操作格式化数据:在服务器端采用JSON字符串来传递数据并在WEB前端使用JSON来解析接收到的数据。
数据解析主要为:JOSN数据解析、XML数据解析
数据交换格式是json或xml
1. 百度百科定义:
Xml是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2. 其它解释:
在网络通信过程中需要传输数据,常用的数据格式有两种:JSON、XML
xml: 用XML在应用程序和公司之间作数据,被列为第一位。 那么为什么XML在这个领域里的地位这重要呢?原因就是XML使用元素和属性来描述数据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构。几个应用程序 可以共享和解析同一个XML文件,不必使用传统的字符串解析或拆解过程。 相反,普通文件不对每个数据段做描述(除了在头文件中),也不保留数据关系结构。使 用XML做数据交换可以使应用程序更具有弹性,因为可以用位置(与普通文件一样)或用元 素名(从数据库)来存取XML数据。
JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负
JSON 是轻量级的文本数据交换格式
JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
3. 链接详解:
XML和JSON详解
https://www.jianshu.com/p/b0fa6eae87a4 
JAVA中使用JSON进行数据传递示例
https://www.jb51.net/article/103371.htm
百度百科:数据解析(xml/json数据解析过程)
https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E8%A7%A3%E6%9E%90
静态语言:先编译后运行
动态语言:不需要编译直接运行,如js


 base64编码/解码 file格式的图片上传 base64流和文件流
1. base64编码/解码(base64串):
8Bit字节代码的编码方式之一,在HTTP环境下传递较长的标识信息,用于传输8Bit字节代码
如果数据格式是json或xml,发现涉及到文件传输时就不太好处理了。网上找到解决方法,就是将文件进行base64编码后再进行传输
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一
1)、速度非常快。2)、能够将字符串A转换成字符串B,而且如果你光看字符串B,是绝对猜不出字符串A的内容来的。
首先要明确的是,Base64是一种可逆的编码方式,提到编码方式,我们首先想到的肯定是Ascii、GBK、Unicode这些常用的编码方法,那么Base64与这些编码方式有什么不同呢?
简单来将,Base64就是一种用64个Ascii字符来表示任意二进制数据的方法。主要用于将不可打印的字符转换成可打印字符,或者简单的说将二进制数据编码成Ascii字符。Base64是网络上最常用的传输8bit字节数据的编码方式之一。
2 base64应用:
很多比较老的协议还是支持纯文本的,比如SMTP协议。
有时在一些特殊应用的场合,大多数消息是纯文本的,偶尔需要用这条纯文本通道传一张图片之类的情况发生的时候,就会用到base64
http虽然也是纯文本协议,但是http有针对二进制数据做特殊的规定,所以用http直接传输二进制数据是可行的。但是有些特殊情况,比如返回需要在json内部之类的。
3. file格式的图片上传:
file格式的图片上传: import java.io.File;
File file = new File("E:\\Photo samples\\samples\\2.jpg");
........String resultback = doPost(url, file, key, secret, typeId, format);
(我们只要能获取到图片的file或者base64就行,如果传的不是file格式的图片,我们后台无法解析,所以您那边最好做一下处理转成file或者base64串。)
4. 流概念:
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出 。
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
java流分为两种流:
1)、字节流:可以用于读写二进制文件及任何文件 byte
2)、字符流:可以用于读写文本文件,不能操作二进制文件
5. base64流和文件流:
base64流:base编码后传输的流???就是base码、base64串???
文件流:文件在程序中是以流的形式来操作的。FileInputStream和FileOutputStream
6. 链接详解:
base64详解:
https://blog.****.net/alex8046/article/details/51910364
图片转换成base64流:
https://blog.****.net/M_Jing/article/details/79040564
FileInputStream和FileOutputStream应用:
https://zhidao.baidu.com/question/123015316.html
文件上传和下载:
https://www.cnblogs.com/xdp-gacl/p/4200090.html