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)父类

注意:private不被显式继承

 

 

多态

在多态下,引用与对象可以是不同的类型。例子:首先让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公司只能接收 类型的插头,并且A只发生/识别GBK信息;

  B公司只能接收 类型的插头,并且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...

posted @ 2019-01-16 19:34  蓝天上的云℡  阅读(287)  评论(1编辑  收藏  举报