当前位置 博文首页 > 程序员漫话编程的博客:教学弟学Java :Java开发起源!

    程序员漫话编程的博客:教学弟学Java :Java开发起源!

    作者:[db:作者] 时间:2021-09-18 18:59

    原创不易,有用就关注一下。要是帮到了你 就给个三连吧,多谢支持。

    发展历程


    20世纪90年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。

    由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。

    1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为一种独立的开发工具。9月,约8.3万个网页应用了Java技术来制作。10月,Sun公司发布了Java平台的第一个即时(JIT)编译器。

    1997年2月,JDK 1.1面世,在随后的3周时间里,达到了22万次的下载量。4月2日,Java One会议召开,参会者逾一万人,创当时全球同类会议规模之纪录。9月,Java Developer Connection社区成员超过10万。

    1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及。

    1999年4月27日,HotSpot虚拟机发布。HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机?[11]??。

    Java创始人之一:詹姆斯·高斯林


    Java创始人之一:詹姆斯·高斯林

    2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发布,几周后其获得了Apple公司Mac OS X的工业标准的支持。2001年9月24日,J2EE1.3发布。2002年2月26日,J2SE1.4发布。自此Java的计算能力有了大幅提升,与J2SE1.3相比,其多了近62%的类和接口。在这些新特性当中,还提供了广泛的XML支持、安全套接字(Socket)支持(通过SSL与TLS协议)、全新的I/OAPI、正则表达式、日志与断言。2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0(内部版本号1.5.0),代号为“Tiger”,Tiger包含了从1996年发布1.0版本以来的最重大的更新,其中包括泛型支持、基本类型的自动装箱、改进的循环、枚举类型、格式化I/O及可变参数。

    2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME。?[12]?

    2006年11月13日,Java技术的发明者Sun公司宣布,将Java技术作为免费软件对外发布。Sun公司正式发布的有关Java平台标准版的第一批源代码,以及Java迷你版的可执行源代码。从2007年3月起,全世界所有的开发人员均可对Java源代码进行修改?[13]??。

    2009年,甲骨文公司宣布收购Sun?[14]??。2010年,Java编程语言的共同创始人之一詹姆斯·高斯林从Oracle公司辞职。2011年,甲骨文公司举行了全球性的活动,以庆祝Java7的推出,随后Java7正式发布。2014年,甲骨文公司发布了Java8正式版?[15]??。

    编程开发

    编程环境

    Java概念图Java概念图?[16]

    JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境。JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一些Java工具和Java的核心类库(Java API)。不论什么Java应用服务器实质都是内置了某个版本的JDK。主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如,IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK?[17]??。

    另外,可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE(JAVA Runtime Environment),JRE是支持Java程序运行的标准环境?[18]??。

    JRE是个运行环境,JDK是个开发环境。因此写Java程序的时候需要JDK,而运行Java程序的时候就需要JRE。而JDK里面已经包含了JRE,因此只要安装了JDK,就可以编辑Java程序,也可以正常运行Java程序。但由于JDK包含了许多与运行无关的内容,占用的空间较大,因此运行普通的Java程序无须安装JDK,而只需要安装JRE即可?[19]??。

    编程工具

    Eclipse:一个开放源代码的、基于Java的可扩展开发平台?[20]??。

    NetBeans:开放源码的Java集成开发环境,适用于各种客户机和Web应用。

    IntelliJ IDEA:在代码自动提示、代码分析等方面的具有很好的功能。?[21]?

    MyEclipse:由Genuitec公司开发的一款商业化软件,是应用比较广泛的Java应用程序集成开发环境?[22]??。

    EditPlus:如果正确配置Java的编译器“Javac”以及解释器“Java”后,可直接使用EditPlus编译执行Java程序?[23]??。

    语言特点

    1.简单性

    Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载overload和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。

    2.面向对象

    Java是一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类class是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。

    Java还包括一个类的扩展集合,分别组成各种程序包Package,用户可以在自己的程序中使用。例如,Java提供产生图形用户接口部件的类java.awt包),这里awt是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类java.io包)和支持网络功能的类java.net包)

    3.分布性

    Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流stream网络连接,所以用户可以产生分布式的客户机和服务器。

    网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。

    4.编译和解释性

    Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。

    在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。

    5.稳健性

    JavaJava

    Java原来是用作编写消费类家用电子产品软件的语言,所以它是被设计成写高可靠和稳健软件的。Java消除了某些编程错误,使得用它写可靠软件相当容易。

    Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java要求显式的方法声明,它不支持C风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。

    可靠性方面最重要的增强之一是Java的存储模型。Java不支持指针,它消除重写存储和讹误数据的可能性。类似地,Java自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。Java解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。

    异常处理是Java中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信号。使用try/catch/finally语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。

    6.安全性

    Java的存储分配模型是它防御恶意代码的主要方法之一。Java没有指针,所以程序员不能得到隐蔽起来的内幕和伪造指针去指向存储器。更重要的是,Java编译程序不处理存储安排决策,所以程序员不能通过查看声明去猜测类的实际存储安排。编译的Java代码中的存储引用在运行时由Java解释程序决定实际存储地址。

    Java运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何Java语言限制。这个安全机制部分包括类如何从网上装载。例如,装载的类是放在分开的名字空间而不是局部类,预防恶意的小应用程序用它自己的版本来代替标准Java类。

    7.可移植性

    Java使得语言声明不依赖于实现的方面。例如,Java显式说明每个基本数据类型的大小和它的运算行为(这些数据类型由Java语法描述)

    Java环境本身对新的硬件平台和操作系统是可移植的。Java编译程序也用Java编写,而Java运行系统用ANSIC语言编写。

    8.高性能

    Java是一种先编译后解释的语言,所以它不如全编译性语言快。但是有些情况下性能是很要紧的,为了支持这些情况,Java设计者制作了“及时”编译程序,它能在运行时把Java字节码翻译成特定CPU(中央处理器)的机器代码,也就是实现全编译了。

    Java字节码格式设计时考虑到这些“及时”编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。

    9.多线程性

    Java是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线索的程序设计很容易。Java的lang包提供一个Thread类,它支持开始线索、运行线索、停止线索和检查线索状态的方法。

    Java的线索支持也包括一组同步原语。这些原语是基于监督程序和条件变量风范,由C.A.R.Haore开发的广泛使用的同步化方案。用关键词synchronized,程序员可以说明某些方法在一个类中不能并发地运行。这些方法在监督程序控制之下,确保变量维持在一个一致的状态。

    10.动态性

    Java语言设计成适应于变化的环境,它是一个动态的语言。例如,Java中的类是根据需要载入的,甚至有些是通过网络获取的。?[24]?

    工作原理

    工作原理工作原理

    由四方面组成:

    (1)Java编程语言
    (2)Java类文件格式
    (3)Java虚拟机
    (4)Java应用程序接口?[25]?

    当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件(例如记事本写字板UltraEdit等)或集成开发环境EclipseMyEclipse等)在Java源文件中定义不同的类?[26]??,通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用?[10]??。

    # Java入门掌握信息
    ?

    1.continue和break(掌握)
    (1)作用:用于控制循环语句跳转的。
    (2)在哪里使用呢? 不能单独使用。
    continue必须在循环中。break可以在循环和switch语句中。
    (3)区别:
    continue:结束本次循环,进入下一次循环。
    break:结束当前循环。

    2:类与对象的关系(掌握)
    (1)现实世界的事物:
    属性:事物的特征
    行为:事物的功能
    (2)java中最基本的单位是类。所以,我们要把事物转换为对应的类。
    (3)如何转换呢:
    类 事物
    成员变量 属性
    成员方法 行为
    (4)类与对象的概念
    类:是一组相关的属性和行为的抽象的集合体。
    对象:是该类事物的具体存在的个体。

    3:成员变量和局部变量的区别?
    (1)在类中的位置不同:
    成员变量:类中方法外。
    局部变量:方法中或者方法声明上。
    (2)在内存中的位置不同:
    成员变量:堆中。
    局部变量:栈中。
    (3)生命周期不同:
    成员变量:随着对象的存在而存在,随着对象的消失而消失。
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失。
    (4)初始化值不同;
    成员变量:有默认初始化值。
    局部变量:没有默认初始化值。

    4.封装(理解)
    (1)隐藏实现细节,提供公共的访问方式。
    (2)体现有哪些呢?
    A:类 B:方法体
    C:private修饰成员变量
    (3)private关键字:
    是私有的意思。可以修饰类中的成员变量和成员方法。
    注意:被它修饰的成员只能在本类中被访问。

    5:this关键字。(掌握)
    (1)代表当前类的一个对象。谁调用代表谁。
    (2)应用场景:
    A:使用本类的成员变量(掌握)
    this.变量名;
    B:使用本类其他构造方法
    this(...)
    C:使用本类的其他成员方法
    this.方法名();

    6.static关键字(理解)
    (1)是静态的意思,可以修饰类中成员变量和成员方法。
    (2)静态的特点:
    A:随着类的加载而加载。
    B:优先于对象存在。
    C:被所有对象共享的数据。
    D:让我们的调用多了一种方式:
    a:非静态的数据,必须创建对象访问。
    b:静态的数据,可以通过对象访问,也可以通过类名访问。
    (3)静态的访问问题:
    总之:静态只能访问静态。
    称呼: 静态的成员被成为类成员。跟类相关。
    非静态的成员被称为实例成员。跟对象相关。

    7.代码块(理解)
    (1)用{}括起来的代码。
    (2)分类:
    A:局部代码块。
    方法内。
    作用:限定变量的生命周期,提高效率。
    B:构造代码块。
    类中,方法外。
    作用:把所有构造方法中相同的代码定义到一处。
    C:静态代码块。
    类中,方法外,加static。
    作用:在整个系统运行过程中只执行一次的内容。
    (3)面试题:
    构造方法,构造代码块,静态代码块的执行流程?
    静态代码块 -- 构造代码块 -- 构造方法。
    特点:
    静态代码块只执行一次。
    构造代码块每次调用构造方法都执行。

    8:方法重写和方法重载的区别?重载可以改变返回值类型吗?(面试题。)
    方法重写:
    子类中出现和父类中一模一样的方法声明的方法。
    方法重载:
    同一个类中,出现方法名相同,参数列表不同的方法。跟返回值无关。重载可以改变返回值类型,因为他跟返回值无关。

    9: this和super的区别,以及应用场景?(面试题。)
    this:当前类的引用对象。谁调用代表谁。
    super:父类的存储空间标识。可以理解为父类对象,谁调用代表谁父亲。
    应用场景:
    A:成员变量
    this.成员变量 本类的成员变量
    super.成员变量 父类的成员变量
    B:构造方法
    this(...) 本类的构造方法
    super(...) 父类的构造方法
    C:成员方法
    this.成员方法() 本类的成员方法
    super.成员方法() 父类的成员方法

    10.final(掌握)
    (1)是一个关键字,表示的是最终的意思。
    (2)它可以修饰类,修饰成员变量,修饰成员方法。
    (3)特点:
    它修饰的类不能被继承。
    它修饰的变量是常量。
    它修饰的成员方法不能被重写。
    (4)面试题:
    修饰局部变量。
    方法的形式参数:
    基本类型:基本类型的值不能发生改变。
    引用类型:引用类型的地址值不能发生改变,但是内容可以发生改变。

    11.内部类(理解)
    (1)把类定义在其他类的内部,就被称为内部类。
    (2)内部类的访问特点:
    A:内部类可以直接访问外部类的成员,包括私有。
    B:外部类要访问内部类的成员,必须创建对象。
    (3)内部类的分类:
    A:成员内部类
    a:private 访问的安全性
    b:static 访问的方便
    B:局部内部类
    a:带名字的(类)
    b:不带名字的(对象)
    (4)面试题:
    局部内部类访问局部变量必须加final修饰。
    (5)匿名内部类:(掌握)
    格式:
    new 类名或者接口名() {
    重写方法;

    12.继承(掌握)
    (1)把多个类中相同的内容提取出来,定义到一个类中。
    然后让这多个类和这个类产生一个关系,这多个类就具备该类的数据了。
    这种关系叫:继承。
    (2)表现形式:
    class SonClass extends FuClass {}

        SonClass: 子类,派生类
        FuClass: 父类,基类,超类
    (3)继承的好处:
        A:提高了代码的复用性。
        B:让类与类之间产生了一个关系,是多态的前提。
    (4)Java中继承的特点:
        A:Java中类只支持单继承。
        B:Java中类可以多层(重)继承。
    (5)继承间的成员关系:
        A:成员变量
            在子类方法中使用变量:
                局部范围
                成员范围
                父类成员范围
        B:构造方法
            a:子类构造方法中默认去访问父类的无参构造方法。
                原因:因为子类要使用父类的数据,父类的数据必须先初始化。
            b:假如父类没有构造方法
                要么,使用super(...)调用带参
                要么,使用this(...)访问本类其他构造,本类至少有一个构造方法访问了父类构造方法。
        C:成员方法
            通过子类对象使用成员方法:
                子类
                父类

    13.多态(掌握)
    (1)同一个对象在不同时刻表现出现的多种状态。
    理解:
    编译时期状态和运行时期状态不一致的现象。
    判断下面哪个有问题:从右边往左边念。
    Fu f = new Zi(); //多态
    Zi z = new Fu(); //报错
    (2)多态的前提:
    A:要有继承或者实现关系。
    B:有方法重写。
    因为一般都是抽象类或者接口的多态。
    C:要有父类/父接口的引用指向子类对象。
    (3)多态访问的成员特点:
    Fu f = new Zi();
    A:成员变量
    编译看左边,运行看左边。
    B:成员方法
    编译看左边,运行看右边。
    C:静态方法
    编译看左边,运行看左边。
    (4)多态的好处和弊端:
    A:好处
    提高了程序的可维护性和可扩展性。
    维护性:继承保证
    扩展性:多态保证
    B:弊端
    父类/父接口不能访问子类特有功能。
    (5)多态中的类型转换:
    A:向上转型
    Fu f = new Zi();
    B:向下转型
    Zi z = (Zi)f;
    (6)多态的体现形式:
    A:具体类多态
    class Fu {}
    class Zi extends Fu {}

            Fu f = new Zi();
        B:抽象类多态
            abstract class Fu {}
            class Zi extends Fu {}
    
            Fu f =  new Zi();
        C:接口多态
            interface Inter {}
            //接口的实现类命名:接口名+Impl
            class InterImpl implements Inter{}
    
            Inter i = new InterImpl();

    14.抽象类(掌握)
    (1)把多个类中相同的方法声明给抽取出来。定义到一个类中。
    一个方法如果只有方法声明,没有方法体,那么该方法必须定义为抽象方法。
    而一个类中如果有抽象方法,那么,该类必须定义为抽象类。
    (2)抽象类的特点:
    A:抽象方法和抽象类都必须用abstract表示。
    B:一个类继承抽象类的时候;
    要么:本身是一个抽象类。
    要么:实现抽象类中的所有抽象方法。
    C:抽象类不能实例化。可以按照多态的使用方式使用。
    D:成员特点:
    a:成员变量
    可以是变量,也可以是常量。
    b:构造方法

    c:成员方法
    可以是抽象,也可以非抽象。
    (3)抽象类的好处:
    A:抽象类中的非抽象方法提高了代码的复用性。
    B:抽象类中的抽象方法强制要求子类必须重写某些方法。
    (4)抽象类中的几个小问题:
    A:抽象类不能实例化,构造方法有什么用呢?
    用于子类访问父类数据的初始化。
    B:如果一个类中没有抽象方法,而类却被定义为了抽象类,请问为什么?
    不让创建对象。
    C:abstract不能和哪些关键字共存:
    private: 冲突 final: 冲突 static: 无意义

    15.接口(掌握)
    (1)如果一个抽象类中的所有成员方法都是抽象的,java就提高了一种更抽象的表达方式:接口。
    (2)接口的特点:
    A:接口用interface定义。
    类实现接口用implements关键字。
    B:一个类要实现接口:
    要么:本身是抽象类。
    要么:实现接口中的所有抽象方法。
    C:接口不能实例化。可以按照多态的使用方式使用。
    D:成员特点:
    a:成员变量:只能是常量。
    默认修饰符:public static final
    b:成员方法:只能是抽象方法。
    默认修饰符:public abstract
    (3)类与接口的关系:
    A:类与类的关系
    继承,单继承。
    B:类与接口的关系
    实现,单实现,多实现。
    继承一个类的同时实现多个接口。
    C:接口与接口的关系
    继承,单继承,多继承。
    (4)抽象类和接口的区别:
    A:成员区别
    抽象类:
    a:成员变量
    可以是变量,也可以是常量。
    b:构造方法

    c:成员方法
    可以是抽象,也可以非抽象。
    接口:
    a:成员变量:只能是常量。
    默认修饰符:public static final
    b:成员方法:只能是抽象方法。
    默认修饰符:public abstract
    B:关系区别
    a:类与类的关系
    继承,单继承。
    b:类与接口的关系
    实现,单实现,多实现。
    继承一个类的同时实现多个接口。
    c:接口与接口的关系
    继承,单继承,多继承。
    C:设计理念不同
    抽象类被继承体现的是:is a的关系。抽象类中定义的是继承体系共性功能。
    接口被实现体现的是:like a的关系。接口中定义的是继承体系的扩展功能。
    ?

    原创不易,有用就关注一下。要是帮到了你 就给个三连吧,多谢支持。

    觉得不错的小伙伴,记得帮我@程序员漫话编程? 点个赞和关注哟,笔芯笔芯~**

    来源:程序员漫话编程
    作者:码工

    微信搜索:程序员漫话编程,回复:学习资料,关注公众号获得更多免费学习资料。
    ?

    cs