Fork me on GitHub

Java开发前奏

注意:所有文章除特别说明外,转载请注明出处.

Java开发前奏

[TOC]

计算机基础

电子计算机,俗称电脑,是一种能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。由硬件和软件所组成,没有安装任何软件的计算机称为裸机。

硬件和软件

硬件

CPU是一台计算机的运算核心和控制核心。其功能主要是解释计算机指令以及处理计算机软件中的数据。

CPU由运算器、控制器、寄存器、高速缓存及实现它们之间联系的数据、控制及状态的总线构成。作为整个系统的核心,CPU 也是整个系统最高的执行单元,因此CPU已成为决定电脑性能的核心部件,很多用户都以它为标准来判断电脑的档次。

CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。该时钟速度越快,时间段内执行的指令就越多, 目前酷睿是2G-3G(1G是10000Mhz)例如,2MHz(200万次/秒),3GHz(三十亿次/秒)。

内存是数据与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。

存储设备:内存不能长久保存数据(非ROM),断电时信息就丢失,程序和数据都会被保存在存储设备中(例如硬盘),当程序和数据需要使用时,再加载进内存,注意:内存读取和写入的速度要比存储设备快的多。

提示:存储设备主要有:磁盘驱动器,光盘驱动器(cd dvd)USB闪存(U盘)。

软件

软件的概述:按照一定顺序组织的计算机数据与指令的集合。

软件 = 数据+指令+文档

1.系统软件
    例如:Widows xp  Linux Unix 

2.应用软件
    例如:QQ、WPS、Photoshop、、微软的Office
软件开发:制作软件。
软件的本质 :提高人与计算机交流效率,方便人与机器交互。

人机交互

1.图形化界面:简单直观,容易操作,用户的体验好。

2.dos命令交互方式:需要有一个控制台,输入特定的指令,让计算机完成一些操作。较为麻烦,需要记录住一些命令,而且只能完成一些比较单一的功能。
    控制台打开的步骤:开始-->所有程序--->附件-->命令行提示符
    或者开始->输入cmd即可。

常见的DOS命令

盘符:进入指定的盘符下。
dir: 列出当前目录下的文件以及文件夹
md : 创建目录 
rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹。
cd : 进入指定目录
cd.. : 退回到上一级目录
cd \ : 退回到根目录
echo "hello java">a.txt  写入文本到指定文件  
type a.txt 显示文件内容命令
del : 删除文件    注意:不能删除文件夹,只能删除文件。
exit : 退出dos命令行
cls  : 通知计算机将当前的命令清空
* :  是通配符
方向键上下是找回上次你写过的命令

Java虚拟机(JVM)

Java Virtual Machine 一个软件模拟的计算机。Java源程序想象成我们的C源程序,Java源程序编译后生成的字节码(.class)就相当于C源程序编译后的二进制可执行文件。JVM虚拟机相当于计算机系统(操作系统+硬件环境),Java解释器相当于CPU。

.exe文件直接在windows操作系统下运行,在CPU上运行的是机器码(.exe文件)

.class字节码文件是运行在JVM虚拟机下的,在Java解释器上运行的是Java字节码。
Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。

只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台 下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。


泛型

创建泛型数组

泛型创建数组推荐使用,Array.newInstance()方法。在方法中有两个参数,第一个参数表示新建数组类型,第二个参数表示数组的大小。

public class ArrayMaker<T> {
    //声明kind为Class<T>类型
    private Class<T> kind;
    public ArrayMaker(Class<T> kind){
        this.kind = kind;
    }

    T[] creat(int size){
        return (T[]) Array.newInstance(kind,size);
    }
    public static void main(String[] args) {
        ArrayMaker<String> stringMaker =
                new ArrayMaker<String>(String.class);
        String[] stringArray = stringMaker.create(9);
        System.out.println(Arrays.toString(stringArray));
    }
} 

泛型数组

public class GenericArray<T> {
    private T[] array;
    public GenericArray(int sz) {
        array = (T[]) new Object[sz];
    }

    public void put(int index,T item) {
        array[index] = item;
    }

    public T get(int index) {
        return array[index];
    }

    public T[] rep() {
        return array;
    }

    public static void main(String[] args) {
        GenericArray<Integer> gai = new GnericArray<Integer>(10);

        Object[] oa = gai.rep();
    }
}

提示:Arrays.asList()方法返回指定数组支持的固定大小的列表。


IO

在Java.io包中最重要的就是5个类和一个接口,5个类包括(File、OutputStream、InputStream、Writer、Reader),接口(Serializable)。

File 类:用于文件或目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等

InputStream 类:抽象类,基于字节的输入操作,是所输入流的父类。定义了所有的输入流都具有共同的特征

OutputStream 类:抽象类,基于字节的输出操作,是所有输出流的父类。定义了所有的输出流都具有共同的特征

Reader 类:抽象类,基于字符的输入操作

Writer 类:抽象类,基于字符的输出操作

RandomAccessFile 类:随机文件操作类,独立的类,直接继承Object类,可以从文件的任意位置进行存取操作。

流:表示任何有能力产出数据的数据源对象或者有能力接收数据的接收端对象。

本质:数据的传输,根据数据传输特性将流抽象为各种类,方便直观的进行数据操作。那么其作用就是为数据源与目的地建立一个输送通道。

提示:Java的IO模型是使用Decorator(装饰者)模式,使用者可以动态装配这些Stream。

IO流分类:

    File(文件):FileInputStream, FileOutputStream, FileReader, FileWriter 

    byte[]:ByteArrayInputStream, ByteArrayOutputStream 

    Char[]: CharArrayReader,CharArrayWriter 

    String:StringBufferInputStream, StringReader, StringWriter 

    网络数据流:InputStream,OutputStream, Reader, Writer 

提示:ByteArrayInputStream、StringBufferInputStream、FileInputStream是三种基本的介质流,它们分别从Byte数组、StringBuffer和本地文件中读取数据。

提示:PipedInputStream是从与其它线程共用的管道中读取数据。ObjectInputStream和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。

InputStream 中有三个基本的读方法:

1.abstract int read() : 读取一个字节数据,返回读到的数据。

2.int read(byte[] b) : 将数据读入到一个字节数组,同时返回实际读取的字节数。

3.int read(byte[] b,int off,int len) : 将数据读入到一个字节数组,同时返回实际读取的字节数。

OutputStream 中的三个基本的写方法:

1.abstract void write(int b) : 向输出流中写入一个字节。

2.void write(byte[] b) : 向输出流中写入数组b[]中的所有字节。

3.void write(byte[] b,int off,int len) : 向输出流中写入数组b[]中从偏移量off开始的len个字节的数据。

Reader 中的三个基本读方法:

1.public int read() throws IOException;//读取一个字符,返回值为读取的字符。

2.public int read(char buf[]) throws IOException;//读取系列字符到数组buf[]中,返回值是实际读取的字符的数量。

3.public abstract int read(char buf[],int off,int len) throws IOException;//读取len个字符,从数组buf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现。

Writer 和上面的outputstream的方法类似,不再赘述。


迭代器 - Iterator

迭代器,不知道序列底层是如何实现的,但是可以利用迭代器来访问一个序列。迭代器也是一种设计模式,能够将遍历序列的操作与底层相分离。

注意:迭代器是一个对象,它的工作是遍历并选择序列中的对象,我们不需要知道该序列底层究竟是如何实现的。此外,我们知道迭代器被称为轻量级对象,因为创建它的代价小。

一般地

1.使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
2.使用next()获取序列中下一个元素。
3.使用hasNext()检查序列中是否有元素。
4.使用remove()将迭代器新返回的元素删除。

所以能够将遍历序列的操作与序列底层相分离,所以我们会说迭代器统一了对容器的访问方式。

public class CrossContainerIteration {
    //这段程序在不知道pet的类型,但是可以利用迭代器实现对pet序列的遍历
    public static void display(Iterator<Pet> it) { 
        while(it.hasNext()) { 
            Pet p = it.next();
            System.out.print(p.id() + ":" + P + " ");
        }
    System.out.println();
    }
}

Java 变量与关键字

文档注释:
    1.需要使用sum给我们提供的javadoc工具生成一个html的说明文档。
    2.只能抽取public的属性或者方法内容。
    格式:javadoc –d 指定存储文档的路径 -version –author(可选) 目标文件

    @author 作者
    @version 版本
    @param 方法的参数
    @return 返回值

流程控制语句


函数与数组

1.数组

注意:给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小,我们可以使用length属性获取数组的大小。

数组常见的异常:1.数组角标越界异常。2.空指针异常。

数组的内存分析:
    栈内存特点:存储的局部变量。处理方式:变量使用完离开自己的空间就马上释放。
    堆内存特点:存储的数组和对象,凡是new关键字创建的实体都是保存在堆内存里面的。1.每一个对象都有一个内存首地址。2.对象都有默认的初始值。

2.二维数组

    前提:
        toString()方法:将数组的元素以字符串的形式返回
        sort()方法:将数组按照升序排序
        binarySearch():在指定数组中查找指定元素,返回元素的索引。如果没有找到,返回(-插入点-1) 注意:使用查找功能的时候,数组一定要先排序。

面向对象

1.匿名对象:表示没有名字的实体,即该实体没有对应的变量名进行引用。

用途:对象对方法进行一次调用的时候,可以使用匿名对象对代码进行简化。同时匿名对象可以对实际参数进行传递。

使用:当只使用一次的时候可以使用匿名对象,执行完毕之后,对象就变成了垃圾。执行方法时,可以将匿名对象作为实际参数传递进去。

总结:

1.匿名对象设置的属性永远无法获取,因为没有引用变量指向那个对象。
2.任何两个匿名对象使用==比较,永远返回false。
3.匿名对象主要用于实参。

2.构造方法

作用:对对象进行初始化。

3.this关键字

this关键字表示对对象的引用,表示this在指向一个对象时,所指向的对象就是调用该函数的对象引用。
this关键字表示所在函数所属对象的引用。

提示:实际工作中,存在着构造函数之间的相互调用,但是构造函数不是普通的成员函数,不能通过函数名自己接调用,所以sun公司提供this关键字。

this关键字的定义:
    1.在构造函数中打印this
    2.创建对象,打印对象名p
    3.this和p是一样的都是内存地址值。
    4.this代表所在函数所属对象的引用。

this关键字的作用域,this关键字只能在非静态(没有static修饰)的函数中使用。

提示:1.构造函数间相互调用必须放在构造函数的第一个语句中,否则编译出错。2.this关键字可以解决构造函数中对象属性和函数形参的同名问题。


static关键字
特点:

1.随着类的加载而加载,静态会随着类的加载而加载,随着类的消失而消失,说明其生命周期很长。
2.优先于对象存在,即静态是先存在,对象是后存在的。
3.被所有实例(对象)所共享。
4.可以直接被类名调用。

静态变量和实例变量的区别:

1.存放位置:类变量随着类的加载而加载,存在与方法区中。实例变量随着对象的建立而存在与堆内存中。
2.生命周期:类变量生命周期最长,随着类的消失而消失。实例变量生命周期随着对象的消失而消失。

静态优缺点:

1.优点:对对象的共享数据进行单独空间的存储,节省空间 缺点:生命周期过长,访问局限性(静态只能访问静态)

2.缺点:

定义静态变量时间:

1.静态变量(类变量)当对象中出现共享数据

定义静态函数时间:

1.如果功能内部没有访问到非静态数据(对象的特有数据,那么该功能就可以定义为静态)

多维数组

注意:使用语法 new int[5][]创建数组时,必须指定第一个下标。语法:new int[][]是错误的。

Java8 增强的包装类

自动装箱:将一个基本类型变量直接赋给对应的包装类变量,或者赋给Object变量。
自动拆箱:允许直接将包装类对象赋给一个与之对应的基本类型变量。

Java 8 Lambda表达式

Lambda表达式相当于一个匿名方法,其主要作用是代替匿名内部类的繁琐语法。

1.形参列表:形参列表允许省略形参类型
2.-> 
3.代码块:

枚举类

对象与垃圾回收机制

程序创建对象,数组等引用类型实体时,系统会在堆内存分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制的回收。

1.垃圾回收机制的特点

1.垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源。
2.程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行。当对象永久性的失去引用后,系统就会在何时的时候回收它所占用的内存。
3.在垃圾回收任何对象之前,总会先调用它的finalize()方法,该方法可能使对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。

2.强制垃圾回收

这种强制机制就是通知系统进行垃圾回收。强制系统垃圾回收有如下两种方式:

1.调用System类的gc()静态方法:System.gc()。
2.调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc()。

3.finalize()方法

在没有明确的指定清理资源的情况下,Java提供默认的机制清理对象的资源,该机制是finalize()方法。当finalize()方法返回之后,对象消失,垃圾回收机制开始执行。

本文标题:Java开发前奏

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:11:24

原始链接:http://bangjinhu.github.io/undefined/Java 基础/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.