Advertisement

Java面试宝典——Java基础知识总结

阅读量:

作者:禅与计算机程序设计艺术

1.简介

Java(发音:/dʒɑːvə/)是一种基于静态面向对象的编程语言;它由Sun Microsystems公司于1995年正式宣布并随后在次年发布了第一个版本即 Java 1.0;经过多年的持续改进与升级至今日已发展成为现代计算机领域中广泛使用的首选编程语言。该语言以其跨平台特性安全可靠以及易用性著称;其典型应用领域包括Web应用开发移动应用程序设计分布式系统构建以及嵌入式设备软件开发等多个方面。

相较于其他编程语言而言, Java特别强调了语法的严格性, 基于严格的类型系统实现了代码的一致性和可维护性, 从而能够有效地提升代码的质量和可扩展性。它还提供了丰富的反射功能以及注解支持, 并且还具备异常处理和动态代理等功能, 从而能够有效地应对各种复杂的开发需求。Java程序运行在基于JVM的虚拟机上, 因此可以通过JVM平台调用Java编写的代码

Java是一门基于静态编译机制的语言,在编译阶段利用编译程序将源代码转换为高效执行的字节码文件。这种预先生成字节码的方式使得Java程序在运行时展现出显著的高效性。相比之下,C/C++等解释型语言则依赖于运行时环境对字节码文件进行逐行解码,这导致其运行效率相对较低。

本文全面概述了Java语言的发展历程及其核心要素,并系统归纳了其关键技术及实现细节;同时深入分析了常见数据结构的具体实现情况以及类加载机制的基本运行流程,在此基础上着重探讨了内存管理的相关问题。

2.背景介绍

2.1 Java的历史发展

Java始于1995年,由Sun Microsystems公司的詹姆斯·高斯林、比尔·克劳德·欧普曼和蒂姆·库伦三人共同开发,并由高斯林担任项目负责人。随后其他团队成员陆续加入,共同制定了并完善了第一代Java编译器、运行环境及标准规范。

Java经历了10余年的演进后如今已经成为全球最受欢迎的语言之一拥有超过两亿的用户群体其在全球计算机硬件市场占据了约20%的份额特别是在移动设备与嵌入式系统领域表现尤为突出

1995年的Java

1995年8月,在美国加利福尼亚州的帕洛奥图市(帕洛阿尔托),微软雅虎公司的四位创始人——比尔·盖茨、丹·斯科特、伊恩·麦卡锡以及另外两位联合创始人唐纳德•Gosling和路易•卡内基——共同签署了公司章程。随后不久(即当年晚些时候),比尔•盖茨推出了Windows 95操作系统。“当时计算机市场非常激烈竞争”, software供应商们为了吸引更多的客户群体开始提供商业 software产品。“这些 software包括著名的文字处理程序Word”、“数据库管理程序Access”以及“网络浏览器Netscape Navigator等”。这些 software都是基于微软 Windows API开发的,“它们都需要预先安装在用户的机器上才能运行”。

1995年11月的那一笔交易中,微软购并了Asteroid Corp,并将其列为其五大所有者之一。此次交易预示着微软正式踏入了游戏产业的领域。尽管如此,在游戏市场中却面临着诸多专利侵权纠纷案件的困扰。

于1996年10月,《Java》软件首次 public发布。《Java》软件的第1版(标记为'1')标志着产品的 initial public release;而带引号的'0'则表明该版正处于研发中。该版不仅提供了类库(如)、框架结构(如)、事件处理机制(如)以及虚拟机环境(如)等基础组件。《Java》软件的迭代更新频率极高,在过去几年中几乎每年都有新功能面世。当前最新发布的 Java 版本是 Java SE 的第7次大更新(Update 40)。

尽管 Java 已经成为最流行的编程语言之一 但却一直没有统一的标准规范 以确保跨平台运行和数据共享 Java 社区通过开发人员共同制定了标准化的编程接口 API 这种做法确实有助于开发者快速上手学习 然而这种做法却也带来了严重的混乱与冲突

1997年9月,在经过充分商议后, Oracle公司( Sun Microsystems旗下子公司 )正式宣布与 Sun Microsystems 达成协议,并终止对 Java 开发的所有权利;同时决定将 Java 的源代码开放供全球开发者共同参与其开发工作.

2000年的Java

在2000年1月,Sun Microsystems公司采取行动以打破Java开发者的垄断局面。在当年夏天(即Java SE 1.0 Release 2版本之后),Sun公司推出了Java Community Process(JCP)。

JCP作为一个具有开放性的国际平台,在这个社区中汇聚了许多高水平的Java专家。他们根据市场反馈持续增加新功能,并将在开发完成后进行开源共享。该组织的主要使命是加速Java语言的发展,并推动其进入一个蓬勃发展中的开源生态系统。

自JCP发布以来

在2001年12月,《Java One》会议顺利举行。此次会议由全球知名的 Java 开发社区及 Oracle 和 Sun 等企业共同举办。大会吸引了众多来自美国、欧洲、日本以及韩国等国家与地区的 Java 开发者参与讨论。全面探讨了当前 Java 技术领域的各个方面及其未来发展趋势。

自2002年3月起启动运营。

由于 OpenJDK 的成功取得显著进展, Java 社区所面临的这一局面得到了一定程度上的缓和。 软件公司大量企业开始开发基于 OpenJDK 的应用程序,并在其基础上进行功能上的升级与优化。 OpenJFX 项目即为一个基于这两个开源库构建的应用框架, 主要用于支持 JavaFX 框架下的图形用户界面(GUI)应用程序开发。 它最初源于 Eclipse 项目中的 AdoptOpenJDK 项目, 该计划专注于提供一个轻量级的 OpenJDK 发行版, 以服务于 Eclipse 经典集成环境(Eclipse IDE)相关的插件开发需求。

2004年10月起,Sun Microsystems公司正式宣布割让其Java SE的所有资产,并由此成立了Oracle Corporation.

2.2 Java的基本概念和术语

2.2.1 Java虚拟机(JVM)

Java虚拟机(JVM)是独立于操作系统的一个可靠且不可替代的软件组件;它负责由其执行Java程序;它包含用于解码Java字节码的解释器或Just-In-Time(JIT)编译器、垃圾回收机制、类加载系统以及资源管理模块等;每个基于JVM的计算机系统都必须配备一个JVM实例。

在运行前(即,在执行之前),首先由编译器将其转换为字节码文件(即Java bytecode)。这些字节码文件本质上是一个二进制指令序列(即一组二进制指令)。这种代码无需特定硬件配置(即无需特定机器或操作系统),因此任何支持Java虚拟机的设备均能运行这些字节码文件。

基于Java标准规范规定了Java虚拟机的行为特征,这使得不同计算平台之间的软件移植变得更加简便,因为任何拥有相同JVM配置的设备都可以直接运行同一版本的Java程序.此外,该规范还确保了相关程序的安全运行,从而有效防止了恶意代码对系统造成的潜在危害.

2.2.2 类、对象和引用

2.2.2.1 类

下面是对传入文本的内容进行同义改写的版本

复制代码
    public class Student {
    private String name;
    private int age;
    private String address;
    private double score;
    
    public void study() {
        System.out.println("正在学习...");
    }
    
    // Getter and Setter methods for the member variables
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读
2.2.2.2 对象

通过类的实例化可以获得相应的对象;该对象即为该类的一个实例。例如,在Python中可以通过cls()方法来创建Student类型的实例,并为其设置属性值。

复制代码
    // Creating an object of type Student
    Student student = new Student();
    
    // Setting the values of the properties of the object
    student.setName("John");
    student.setAge(18);
    student.setAddress("New York");
    student.setScore(90.0);
    
    // Calling a method on the object to perform some action
    student.study();
    
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读
2.2.2.3 引用

对象被采用引用方式进行存储于内存中,并通过引用的方式能够访问其成员变量和方法。

在Java语言中,默认情况下所有操作都是面向对象的。一个类实例可以通过构造函数初始化其属性。当我们将一个对象赋值给一个类实例时,则相当于将该对象的属性地址复制到该实例上。如果两个类实例共享相同的属性,则它们共享相同的实例并享有相同的属性内容。

复制代码
    // Assigning one object reference to another variable
    Person person1 = new Person();
    Person person2 = person1;
    
    System.out.println("person1: " + person1);   // Output: person1: com.example.Person@4e4d2b8c
    System.out.println("person2: " + person2);   // Output: person2: com.example.Person@4e4d2b8c
    
    // Modifying the properties of one object affects both references
    person1.name = "Alice";
    
    System.out.println("person1: " + person1.getName());    // Output: Alice
    System.out.println("person2: " + person2.getName());    // Output: Alice
    
    
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

请记住:当引用变量指向某个对象之后(x),不允许将它指向其他对象(y),这可能会导致错误或崩溃)。因此,在同一个程序中(特别是在同一类或同一个静态块内),我们通常不会自行手动创建引用变量。Java编译器会自动为我们建立引用变量

2.2.3 包(Package)

Java中的命名空间(namespace)设计用于预防标识符之间可能出现的混淆与冲突,在软件架构中起到了重要的组织作用。通过将相互关联的类(class)、接口(interface)、枚举(enum)以及注释(annotation)等整合在一起形成一个逻辑单元(unit),开发者能够更加高效地进行代码管理和维护工作。每一个命名空间都有一个独特的名称,在这种命名体系中,默认情况下这些名称通常通过点号.来进行分隔

当编译器处理包含包声明的代码时,在编译过程中会生成相应的存储路径,并将编译后的类文件放置于指定位置。若缺少该存储路径,则会导致程序异常退出;若发现某个构建的目标路径已存在但并非合法的Java package directory,则会在后续阶段触发构建错误提示信息。

复制代码
    // Package declaration statement
    package com.example.package_name;
    
    
      
      
    
    代码解读

2.2.4 修饰符(Modifier)

在Java语言中,特定的关键字用于决定对象或类中的元素(成员)的访问控制权以及它们的其他功能特性。这些关键字包括八种不同的访问权限修饰符。

  1. public : 设置为公开权限:允许任何外部类访问
  2. protected : 定义为保护性权限:仅允许同一包内的相关类以及其子类访问
  3. default : 默认设置下:仅限于当前模块内的相关内容可被访问;不支持通过继承机制获取信息
  4. private : 限定为只能在本类内部进行操作:不允许外部代码直接访问

此外还存在两个具有继承特性的修饰符(分别为final和abstract这两个关键字)。其中final用于修饰类、方法以及变量,并且无法被修改;而abstract则用于修饰类与方法,并仅用于继承而不允许直接构造实例。

复制代码
    // Example usages of modifiers in classes, interfaces, methods, fields
    
    // Access modifiers
    public class MyClass {}
    protected class AnotherClass extends MyClass {}
    class YetAnotherClass implements MyInterface {}
    private void myMethod() {}
    public static final long serialVersionUID = 1L;
    
    // Inheritance modifiers
    class ChildClass extends ParentClass {}
    interface MyInterface extends OtherInterface {}
    abstract class AbstractClass {}
    abstract interface AbstractInterface {}
    final class FinalClass {}
    static class StaticClass {}
    synchronized class SynchronizedClass {}
    volatile class VolatileClass {}
    transient volatile float price;
    
    // Variable modifiers
    int x = 10;      // Not modifiable by subclasses
    final double y = Math.PI;     // Value cannot be changed after initialization
    static String message = "Hello World!";       // Same value accessible from any instance
    ThreadLocal<String> threadName = ThreadLocal.withInitial(() -> getNameOfCurrentThread()); 
                                                // Value is unique per thread
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

2.2.5 抽象类和接口

它们都不能被直接实例化,并且只能通过继承或定义来扩展或实现功能。这些 abstract 类既可以定义 abstract 方法又可容纳 concrete 方法;如果不需要 abstract 的功能,则可以选择不定义 abstract methods. 而 interface 只能定义 abstract 方法而不能有任何具体的实现代码

抽象类和接口的区别在于:

  • 抽象类能够支持使用特定的具体方法。
    • 接口仅能够支持定义抽象方法。
    • 抽象类允许为构造函数提供默认实现。
    • 接口则不允许为构造函数提供默认实现。
    • 抽象类可以定义具有默认实现的构造函数。
    • 而接口则无法定义具有默认实现的构造函数。

通常情况下,在软件系统中接口主要用于建立协议关系,在设计时主要关注操作名称以及固定值等信息而不涉及具体操作步骤。而抽象类则用于构建基线类别,并包含了具体的操作逻辑。

复制代码
    // An example implementation of abstract class Shape using Rectangle as subclass
    abstract class Shape {
    protected Point center;
    
    public abstract double area();
    
    public void translate(double dx, double dy) {
        this.center.translate(dx, dy);
    }
    
    // Constructor
    public Shape(Point center) {
        this.center = center;
    }
    }
    
    class Circle extends Shape {
    private double radius;
    
    @Override
    public double area() {
        return Math.PI * Math.pow(radius, 2);
    }
    
    // Constructor
    public Circle(Point center, double radius) {
        super(center);
        this.radius = radius;
    }
    }
    
    class Rectangle extends Shape {
    private double width;
    private double height;
    
    @Override
    public double area() {
        return width * height;
    }
    
    // Constructor
    public Rectangle(Point center, double width, double height) {
        super(center);
        this.width = width;
        this.height = height;
    }
    }
    
    // An example implementation of interface Animal with two implementations Cat and Dog
    interface Animal {
    void move();
    }
    
    class Cat implements Animal {
    @Override
    public void move() {
        System.out.println("Meow!");
    }
    }
    
    class Dog implements Animal {
    @Override
    public void move() {
        System.out.println("Woof!");
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

全部评论 (0)

还没有任何评论哟~