JAVA学习笔记
环境:JavaSE 11 + VSCode 书籍:《Head First Java 第二版 中文版》
Java的程序结构
一个源文件可以有多个类,一个类可以有多个方法。(但一个源文件中只能有一个public类)
含有main方法的类 必须和源文件名一致
--[ N.java ]
+++class 1
--------method1
--------method2
--------method_N
+++class 2
--------method90
+++class N
--------main
--------method23
+++class 98
+++class 87
--------method90
.........
还有更大范围的包,再次先略过
对象声明、创建与赋值的3个步骤
引用和对象都是同一类型
后面的注释只解释红色代码的意义
Dog myDog; 声明一个引用变量(reference variable) 【这个"引用变量"myDog只能引用到”Dog类型的对象“】 多态和这个道理有点类似
new Dog(); 临时创建对象 [ 分配堆空间用于新建 "Dog对象"]
myDog = new Dog(); 临时创建对象并马上连接到myDog 【这样有了归宿,就不会被无情的Java虚拟机顺手回收了】
这3个步骤可以合起来,也可以拆开,在对象数组中,我们经常拆开(先声明数组,再用循环给他们 创建对象并连接)
合起来的解释:
Dog myDog = new Dog();
三步合起来叫:把一个Dog对象实例化
红色: 声明一个引用变量
粉红色: 创建对象[分配内存]
绿色: 连接 "对象"和"引用" (类似于传递指针)
或理解为: 把对象连接到"引用变量"身上 Connect a pair of elephants to the "reference variable"
我这一句下去你可能会笑死.jpg
为什么要这样麻烦呢?因为: 对象衍生于类,但多个对象不能都用一个名字,所以需要对象引用
理解:
大家属于人类。
但有高有低,爱好还不同。
我总不能都叫你“人” 或 叫他“人”吧,
所以上苍发明了名字,这样我就能叫你“小明”,叫他“小芳”了。
Ps.小明和小芳都是人类的对象 为什么呢》因为这是Java世界
说件伤心的事情,假如小明永远地离开了,那么用Java表示就是小明就被指向了null,然后该对象被回收了。
假如后来有一个人来到世上(但还没有名字,也不知道活不活得到第二天),那就是new 人类();
如果后来又一个人来到世上还被起名叫做了小明,那么用Java表示就是 小明 = new 人类();
//但是他并不是之前去世的那个小明,而是另一个被叫做小明的人
假如李李靖和小康前后来到世上,他们长大后建功立业,但有一天他们所在的城却被外敌入侵了,敌人要求李李靖前去,不然屠城。李李靖为保家卫国已视死如归,但小康(被李救过)决定要让恩人好好活着,于是打晕了李,留下纸条要恩人好好活着,然后小康伪装成李的样子,赴死了。 那么就是:
报恩记Human 李李靖 = new Human(); // 人A 主角光环不会死 Human 小康 = new Human(); // 人B // ..... // 先理解一个赋值概念: 实体C = 名字3 把名字3剥离其他实体再连接到实体C上 // 括号里是还没执行'='(也就是还没赋值)时的对应的人物 tmp = 李李靖(A); // 人B打晕主角A ,把名字从A上剥离出来再贴在"tmp纸"上(但这名字还不是B的) // 此时叫李李靖就是在叫一张纸... 李李靖(A) = 小康[B]; // 把小康这名字剥离B,再连接到"主角A"身上。 // 此时叫小康就是在叫A // 别急,人B来拿恩人的名字了 小康[B] = tmp; //tmp纸连接着恩公名字,从纸上剥离再连接到B自身上 //此时 B获得了恩公原来的名字,伪装成功了。 // 赴死后 李李靖[B] = null; // 原来的小康死了 然后被无情的敌人(Java虚拟机)杀死了。
继承
概念:
二哈是狗,狗是动物 那么:二哈是动物 IS-A(是A)原则
子类继承自(extends)父类
多态
在多态下,引用与对象可以是不同的类型。例子:首先让Dog类继承自Animal类,然后再执行如下
Animal myDog = new Dog();
此处运用了多态,引用类型可以是"实际对象类型"的父类
假如Dog类有eat()的方法,但Animal没有eat
但多态是有代价的,此时的只能执行myDog的父类Animal的方法,不能执行Dog类的方法eat()。
如果要执行Dog类的方法,可以这样:
Dog nowDog = (Dog)myDog; 强制类型转换后赋值给nowDog,再执行其方法nowDog.eat();
原因,引用变量(myDog)被声明为Animal类,Animal类是没有eat()方法的。但myDog连接的仍然是Dog,所以只能把连接转给nowDog执行
Ps.不止是"引用变量"的初始化,参数和返回类型也可以多态!
接口
接口是100%抽象的,里面没有方法。所有接口的方法都要在需要用的类中去写,那么还有什么作用呢?
先看一张图
假如你是一个公司高手,负责A和B客户的对接,而他们不管你中间弄什么,只要AB交流顺畅
因为成本问题,两个公司不能统一设备。
反正A公司只能接收 1 类型的插头,并且A只发生/识别GBK信息;
B公司只能接收 2 类型的插头,并且B只发送/识别UTF-8信息。
如何让这两个公司信息交流顺畅呢?
那么你就在中间方格里做一个GBK UTF-8互转的功能,然后再按他们规范分别造出 1、2 类型的插头
然后,另一个公司C也来做你的生意了(他们只发送/识别GB2312,但他公司可以接收 1、2 类型的插头)
那么这时你新增一个类,然后给中间功能加了GB2312转其他编码的功能,同时看到接口文件中的声明,所以你不会忘记,按照声明写上了 1、2 插头。保证是3个针脚标准1、2接口,而不是缺了一个针脚的。
接口中的声明保证了 函数名、返回类型和参数,就如同声明了标准的1、2插头是3个针脚的,从而保证了输入输出可以被自己和ABC公司准确读取
所以,接口是一种规范,就像usb接口一样只能插usb而不能插三口的插座一样。但是usb并不理会你中间在干什么,它只要求输出输入符合usb规范,就像蓝牙键盘,插着USB口,中间可以用蓝牙通讯协议,但最后发到usb的一定要是usb的通讯协议。
相信如果没有usb规范,你会很讨厌借不到 适用于自己手机用的数据线
同样,你会很讨厌公司的小明不按规范写程序,最后导致输出输入类型不能被另一个程序读取。(这在软件工程中是要被祭天的)
调用操作系统命令
如打开一张图片(b.png)
Process process = Runtime.getRuntime().exec(cmd /c start /B b.png);
关于cmd内嵌的start命令执行: C:\WINDOWS\system32>start /?
注意
byte是二进制数据,char/String是和字符集相关的字符数据(其值与编码集相关)
byte[] 转 String/char 会涉及到字符编码集转换问题,在需要二进制处理的地方,请不要使用与字符集有关的方法。
Buffered* 带缓冲的
*Reader/Writer 基于字符的读写
*InputStream/OutStream 基于流的读写
Editing...