菜鸟Java基础教程 1.Java简介

Java 简介

Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发,并在 1995 年正式推出。

后来 Sun 公司被 Oracle (甲骨文)公司收购,Java 也随之成为 Oracle 公司的产品。

Java分为三个体系:

JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版)
JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版)
JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版)。
2005 年 6 月,JavaOne 大会召开,SUN 公司公开 Java SE 6。此时,Java 的各种版本已经更名,以取消其中的数字 “2”:J2EE 更名为 Java EE,J2SE 更名为Java SE,J2ME 更名为 Java ME。

主要特性

1.Java 语言是简单的:

Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。

逐个特点详细说明,并用示例代码加以说明。

  1. 类C/C++语法

Java语法与C语言和C++语言类似,采用了许多相似的语法结构和关键字,使得那些熟悉C/C++的程序员很容易学习和使用Java。

示例代码:

// Java的Hello World程序
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
// C的Hello World程序
#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}
// C++的Hello World程序
#include <iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
# Python的Hello World程序
print("Hello, world!")

在这个示例中,我们可以看到Java、C、C++和Python的打印输出方式都不同,但都保持了相对简单和直观的语法。

  1. 舍弃复杂特性

Java摒弃了C++中的一些复杂特性,如操作符重载、多继承、自动的强制类型转换等,这些特性在C++中有时候会增加代码的复杂性和难度。

示例代码:

Java摒弃了C++的操作符重载特性,例如在Java中不能重载操作符 + 来实现不同类型的加法。此外,在Java中也不支持多继承,避免了多继承可能带来的复杂性和歧义。

// Java中不支持操作符重载的示例
public class OperatorOverloadingExample {
    public static void main(String[] args) {
        // Java中不能重载操作符 + 来实现不同类型的加法
        // 下面代码会报错
        // int result = 5 + "5";
    }
}
// C中的操作符重载示例
#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

float add(float a, float b) {
    return a + b;
}

int main() {
    int sum_int = add(3, 5);
    float sum_float = add(3.5f, 5.5f);
    printf("Sum of integers: %d\n", sum_int);
    printf("Sum of floats: %f\n", sum_float);
    return 0;
}

/*
这个示例中没有真正的操作符重载,而是函数重载。
C语言并不支持操作符重载,只有一些特定的运算符是内置的,并且它们的行为是固定的。
在C++中,你可以使用运算符重载来定义自定义类型的运算符行为,但在C中是不可能的。
*/

// C++中的操作符重载示例
#include <iostream>

// 定义一个复数类
class Complex {
private:
    double real; // 实部
    double imag; // 虚部

public:
    // 构造函数,初始化实部和虚部
    Complex(double r, double i) : real(r), imag(i) {}

    // 重载+运算符,实现两个复数相加的操作
    Complex operator+(const Complex& other) {
        return Complex(real + other.real, imag + other.imag);
    }

    // 显示复数的实部和虚部
    void display() {
        std::cout << real << " + " << imag << "i" << std::endl;
    }
};

int main() {
    // 创建两个复数对象
    Complex c1(1.0, 2.0);
    Complex c2(2.0, 3.0);

    // 对两个复数对象进行相加操作
    Complex sum = c1 + c2;

    // 显示相加后的结果
    sum.display();

    return 0;
}

在这个示例中,我们展示了Java、C和C++中操作符重载的不同实现方式。

  1. 引用而非指针

Java中使用引用(reference)代替了C/C++中的指针(pointer),这样可以降低内存管理的复杂度,避免了因指针操作而引发的许多错误。

示例代码:

// Java中的引用示例
public class ReferenceExample {
    public static void main(String[] args) {
        int x = 5;
        int reference = x; // 引用
        System.out.println("x = " + x);
        System.out.println("reference = " + reference);
        x = 10; // 修改原变量
        System.out.println("x = " + x);
        System.out.println("reference = " + reference); // 引用的值不受影响
    }
}
// C中的指针示例
#include <stdio.h>

int main() {
    int x = 5;
    int* pointer = &x; // 指针
    printf("x = %d\n", x);
    printf("*pointer = %d\n", *pointer);
    x = 10; // 修改原变量
    printf("x = %d\n", x);
    printf("*pointer = %d\n", *pointer); // 指针指向的值也会改变
    return 0;
}
// C++中的引用示例
#include <iostream>

int main() {
    int x = 5;
    int& ref = x; // 引用
    std::cout << "x = " << x << std::endl;
    std::cout << "ref = " << ref << std::endl;
    x = 10; // 修改原变量
    std::cout << "x = " << x << std::endl;
    std::cout << "ref = " << ref << std::endl; // 引用的值也会改变
    return 0;
}

在这个示例中,我们展示了Java、C和C++中引用和指针的使用方式及其区别。


引用和指针是两种不同的概念,尽管它们在某些方面有相似之处,但在其他方面又有很大的不同。以下是它们的主要区别:

  1. 语法和操作

    • 指针:指针是一个变量,它存储了另一个变量的内存地址。指针可以进行指针运算(如加法、减法),并且可以被重新赋值以指向不同的内存地址。
    • 引用:引用是一个别名,它与另一个变量绑定在一起,引用始终指向同一个对象。引用不能进行指针运算,也不能被重新赋值为指向其他对象。
  2. 空值(null)

    • 指针:指针可以是空指针(即指向空地址或未初始化的指针)。
    • 引用:引用不能为null。在Java中,引用要么指向一个有效的对象,要么为空引用。
  3. 内存管理

    • 指针:在C/C++中,开发者负责手动分配和释放内存,可能导致内存泄漏、悬挂指针等问题。
    • 引用:在Java中,内存由垃圾回收器自动管理,开发者不需要手动释放内存,这减少了内存管理方面的错误。
  4. 安全性

    • 指针:由于指针可以指向任意内存地址,使用不当可能导致许多安全问题,如内存越界、强调文本野指针等。
    • 引用:由于引用不能为null并且不涉及指针运算,因此它们通常比指针更安全。

总的来说,引用提供了一种更安全、更方便的方式来处理对象,而指针则在特定情况下仍然是有用的,特别是在需要直接操作内存地址或进行低级别编程时。


  1. 内存管理自动化

Java提供了自动的内存管理机制,即

垃圾回收(Garbage Collection),程序员不需要手动分配和释放内存,这降低了内存泄漏的风险,并减少了程序员的负担。

示例代码:

// Java中的动态内存分配示例(Java自动管理内存)
public class GarbageCollectionExample {
    public static void main(String[] args) {
        MyClass obj = new MyClass(); // 创建对象
        obj = null; // 对象不再被引用
        System.gc(); // Java会自动进行垃圾回收,释放对象占用的内存空间
    }
}

class MyClass {
    // 一些成员变量和方法
}
// C中的动态内存分配示例(手动管理内存)
#include <stdio.h>
#include <stdlib.h>

int main() {
    int* ptr = (int*)malloc(sizeof(int)); // 分配动态内存
    *ptr = 5;
    printf("*ptr = %d\n", *ptr);
    free(ptr); // 释放动态内存
    return 0;
}
// C++中的动态内存分配示例(使用智能指针)
#include <iostream>
#include <memory>

int main() {
    std::shared_ptr<int> ptr = std::make_shared<int>(5); // 创建智能指针
    std::cout << "*ptr = " << *ptr << std::endl;
    // 不需要手动释放内存,当智能指针超出作用域时会自动释放内存
    return 0;
}

在这个示例中,我们展示了Java、C和C++中动态内存分配的不同方式及其对应的内存管理方式。


2.Java 语言是面向对象的:

Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。

当我们说Java是一种面向对象的语言时,这意味着Java程序由对象组成,这些对象通过相互发送消息来协同工作。这种方法使得程序的设计更为模块化、灵活和易于维护。


下面是Java中面向对象编程的一些关键概念和代码示例:

  1. 类和对象
    在Java中,类是对象的模板,它定义了对象的属性和方法。对象是类的实例。以下是一个简单的Java类的示例:

    public class Car {
        // 属性
        String color;
        int year;
        
        // 方法
        void drive() {
            System.out.println("Driving the car...");
        }
    }
    

    现在我们可以创建Car类的对象:

    public class Main {
        public static void main(String[] args) {
            // 创建Car对象
            Car myCar = new Car();
            
            // 设置属性值
            myCar.color = "Red";
            myCar.year = 2022;
            
            // 调用方法
            myCar.drive();
        }
    }
    
  2. 继承
    继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。
    继承extend
    Java中只支持单继承,但一个类可以实现多个接口。以下是继承的示例:

    public class Vehicle {
        void start() {
            System.out.println("Vehicle starting...");
        }
    }
    
    // Car类继承自Vehicle类
    public class Car extends Vehicle {
        void drive() {
            System.out.println("Driving the car...");
        }
    }
    
  3. 多态
    多态是指相同的消息可以被不同类型的对象接收并产生不同的行为。Java中的多态通过方法重写来实现。以下是一个多态的示例:

    public class Animal {
        void makeSound() {
            System.out.println("Animal makes a sound");
        }
    }
    
    public class Dog extends Animal {
        // 重写父类的方法
        void makeSound() {
            System.out.println("Dog barks");
        }
    }
    
    public class Cat extends Animal {
        // 重写父类的方法
        void makeSound() {
            System.out.println("Cat meows");
        }
    }
    

    在上面的示例中,DogCat类重写了Animal类的makeSound方法。

    public class Main {
        public static void main(String[] args) {
            Animal myDog = new Dog();
            Animal myCat = new Cat();
            
            myDog.makeSound(); // 输出:Dog barks
            myCat.makeSound(); // 输出:Cat meows
        }
    }
    

以上是Java中面向对象编程的基础概念和代码示例。通过类、继承和多态,Java提供了一种灵活和强大的编程模型,使得开发者能够构建复杂的程序和系统。

继承和重写的目的在于代码的重用和扩展性。当子类继承父类时,子类会自动获得父类的属性和方法,这样可以避免代码的重复编写提高了代码的复用性。而当需要对父类的某些方法进行定制化或者特定的行为时,可以在子类中重写这些方法。

使用继承和重写的好处之一是能够保留原有的代码结构和接口,同时可以根据子类的需要进行定制化的修改。 这种方式也有利于代码的维护和管理,因为不需要修改父类的代码,只需在子类中进行修改即可。

因此,继承和重写是面向对象编程中常用的两种技术,它们为代码的组织、复用和扩展提供了便利。


3. Java语言是分布式的:

Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。


其他语言也可以用于开发分布式系统,但Java之所以被称为分布式的,主要是因为它在设计和实现上考虑了分布式系统的需求,并提供了专门的工具和库来支持分布式编程。以下是Java被称为分布式的一些原因:

  1. 内置网络编程支持:Java提供了内置的网络编程API(如java.net包),使得开发者可以轻松地创建网络应用程序。这些API提供了用于处理网络通信的类和方法,使得Java适合于开发网络应用和分布式系统。

  2. RMI(远程方法调用):Java提供了RMI机制,允许在不同的Java虚拟机之间进行远程方法调用。这使得Java可以方便地构建分布式系统,通过远程调用实现不同节点之间的通信和协作。

  3. Java EE平台:Java企业版(Java EE)是用于开发企业级应用的平台,提供了丰富的技术和规范来构建分布式系统。Java EE包括Servlet、JSP、EJB、JMS等技术,可以帮助开发者构建复杂的分布式系统。

  4. 并发编程支持:Java提供了强大的并发编程支持,包括线程、线程池、同步机制等,使得开发者可以方便地处理分布式系统中的并发和并行任务。

总的来说,Java被称为分布式的主要是因为它提供了丰富的工具和库来支持分布式编程,使得开发者可以方便地构建分布式系统和网络应用。虽然其他语言也可以用于开发分布式系统,但Java在这方面的支持较为完善和广泛。


4.Java 语言是健壮的:

Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。


当谈到Java语言的健壮性时,我们可以深入了解以下几个方面:

  1. 强类型机制:Java是一种强类型语言,这意味着在编译时会进行严格的类型检查。这样的设计可以在程序编写阶段就捕获到许多潜在的类型错误,从而提前防止程序运行时的异常情况。例如,如果尝试将一个字符串赋值给一个整数类型的变量,编译器会立即报错,而不会等到运行时才发现。

  2. 异常处理:Java提供了强大的异常处理机制,使得开发者能够更有效地处理程序可能出现的异常情况。通过捕获和处理异常,程序可以在出现问题时进行优雅的回退或错误处理,而不至于导致整个程序崩溃。这种异常处理机制提高了程序的可靠性和健壮性。

  3. 垃圾的自动收集:Java的垃圾收集器能够自动管理内存,回收不再使用的对象,从而减少了内存泄漏和内存溢出的风险。程序员不需要手动管理内存分配和释放,这减少了很多常见的编程错误,提高了程序的稳定性。

  4. 指针的丢弃:与C或C++等语言不同,Java放弃了指针的使用,而是通过引用来操作对象。这减少了由于指针操作引起的内存访问错误和潜在的安全问题,避免了常见的内存错误,提高了程序的健壮性和安全性。

  5. 安全检查机制:Java具有严格的安全检查机制,包括类加载机制、访问控制和安全管理器等。这些机制可以防止恶意代码的执行,提高了程序的安全性和健壮性。 例如,Java的类加载器会检查加载的类是否来自可信任的源,以防止恶意代码的注入。

综上所述,Java语言通过强类型机制、异常处理、自动内存管理、放弃指针、严格的安全检查等特性,确保了程序在编译时和运行时都能保持健壮性,避免了许多常见的编程错误和安全问题,使得Java程序更加可靠、稳定和安全。


Java的安全检查机制主要包括以下几个方面:

  1. 类加载机制:Java的类加载器负责加载类文件并创建对应的Class对象。在加载类文件时,Java会对类文件进行安全检查,确保它来自可信任的源。Java的类加载器通常会遵循双亲委派模型,即先尝试由父类加载器加载类文件,只有在父类加载器无法加载时才由子类加载器加载,从而防止恶意类文件的注入。

  2. 字节码验证:在类加载过程中,Java虚拟机会对字节码进行验证,以确保它符合Java虚拟机规范。这个过程包括对字节码的结构、类型和语义的验证,以及对可能导致安全漏洞的操作的检查。通过字节码验证,可以防止恶意类文件通过修改字节码来攻击系统。

  3. 访问控制:Java的访问控制机制包括public、protected、private等访问修饰符,用于限制类、方法和变量的访问范围。通过访问控制,可以防止未授权的代码访问私有成员或执行敏感操作,提高了程序的安全性。

  4. 安全管理器:Java的安全管理器是一种安全机制,用于控制Java应用程序对系统资源的访问。安全管理器可以限制Java应用程序的权限,例如禁止访问文件系统、网络、系统属性等敏感资源,以防止恶意代码对系统的攻击。

  5. 安全策略文件:Java的安全策略文件用于配置安全管理器的行为。通过安全策略文件,可以指定哪些操作是允许的,哪些是禁止的,从而对Java应用程序的行为进行精细化的控制。

综上所述,Java的安全检查机制包括类加载机制、字节码验证、访问控制、安全管理器和安全策略文件等多个方面,通过这些机制可以保护Java程序免受恶意代码的攻击,提高了程序的安全性和健壮性。


5.Java语言是安全的:

Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。


6.Java 语言是体系结构中立的:

Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。


没错,Java语言被称为是体系结构中立的,主要有以下几个原因:

  1. 编译为字节码:Java程序在编译时被转换为字节码(.class文件),而不是与特定硬件体系结构相关的机器码。字节码是一种中间形式的代码,它可以在任何支持Java虚拟机(JVM)的平台上运行。

  2. 跨平台性:由于Java程序被编译为字节码,因此可以在实现了Java虚拟机规范的任何系统上运行。这意味着同一个Java程序可以在不同的操作系统和硬件平台上运行,而不需要对程序进行修改或重新编译。

  3. 适用于异构网络环境:由于Java程序可以在不同的系统上运行,因此非常适合于异构的网络环境,其中可能存在不同操作系统和硬件平台的混合。

  4. 软件分发:Java的体系结构中立性也使得软件的分发变得更加简单。开发者可以编写一次Java程序,并将其字节码分发给用户,用户可以在其所用的任何平台上运行该程序,而无需关心底层的硬件架构。

总的来说,Java语言的体系结构中立性使得它成为一种非常灵活和便于分发的编程语言,可以在各种不同的系统上运行,从而简化了软件开发和分发的过程。


7.Java 语言是可移植的:

这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。


Java语言的可移植性确实源自于多个方面的设计和实现:

  1. 体系结构中立性:Java程序在编译时会生成与特定硬件体系结构无关的字节码文件(.class文件)。这些字节码文件可以在任何支持Java虚拟机(JVM)的平台上运行,因为JVM负责将字节码文件解释或编译成特定平台上的机器码。因此,Java程序的可移植性得以保证,不受硬件平台的限制。

  2. 基本数据类型的长度规定Java对基本数据类型(如int、long、float、double等)的长度进行了严格的规定。 例如,int类型的长度为32位,double类型的长度为64位等。这样一来,无论在哪个平台上运行Java程序,这些基本数据类型的长度都是一致的,不会受到不同平台的影响,从而保证了程序的可移植性。

  3. Java编译器和运行环境的实现:Java编译器和运行环境都是用Java语言实现的。这意味着它们本身也具有很好的可移植性。另外,Java的运行环境(JRE)是用ANSI C语言实现的,而C语言本身也是一种具有很好可移植性的语言,因此Java系统的可移植性得到了进一步的增强。

综上所述,Java语言的可移植性是由体系结构中立性、基本数据类型长度规定以及Java编译器和运行环境的实现方式共同保证的。这些设计和实现使得Java程序可以在不同平台上轻松运行,而无需修改代码,从而大大降低了软件开发和维护的成本。


8.Java 语言是解释型的:

如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。


这段描述有一点不准确。Java语言通常被认为是一种半编译型(semi-compiled)或者混合型(hybrid)的语言,而不是完全的解释型语言。

在Java中,源代码首先被编译成字节码格式(.class文件),这个过程是通过Java编译器完成的。然后,这些字节码文件被Java虚拟机(JVM)解释执行或者即时编译(JIT)成本地机器码。这意味着Java程序的执行包含了编译和解释两个阶段。

解释阶段主要针对那些不经常执行的代码,而即时编译则是针对那些频繁执行的代码,它将字节码编译成本地机器码,从而提高了程序的执行效率。这种混合方式结合了解释型语言和编译型语言的特点,既保留了跨平台性,又提高了执行效率。

因此,Java语言通常被描述为一种半编译型或者混合型的语言,而不是完全的解释型语言。


9.Java 是高性能的:

与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。


确实,相较于解释型的高级脚本语言,Java可以被认为是高性能的。这是因为Java的运行速度受益于其采用的即时编译(Just-In-Time,JIT)编译器技术。

JIT编译器在程序运行时将字节码转换成本地机器码,这样可以提高程序的执行效率。
虽然与C++等编译型语言相比,Java的性能可能略有差距,但JIT编译器的发展使得Java的运行速度越来越接近于编译型语言。

因此,Java的高性能主要归功于JIT编译器技术的发展,这使得Java成为一种在性能和跨平台性之间取得良好平衡的编程语言。


10.Java 语言是多线程的:

在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。


在Java语言中,多线程是一项重要的特性。以下是关于Java多线程的一些要点:

  1. 线程的创建:Java中的线程是通过Thread类或其子类来创建的。通常有两种方法来创建线程:一种是实现Runnable接口并传递给Thread构造函数,另一种是继承Thread类并重写其run()方法。无论采用哪种方式,线程的主体逻辑都包含在run()方法中。

  2. 多线程执行:Java语言支持多个线程同时执行,这意味着程序可以并发执行多个任务,提高了系统的响应性和性能。

  3. 线程同步机制:由于多个线程可能同时访问共享资源,因此Java提供了同步机制来确保线程的安全性。关键字synchronized用于实现线程的同步,可以用于方法或代码块,以确保在同一时刻只有一个线程可以执行同步代码。

  4. 线程控制:Java提供了一组方法来控制线程的活动,包括启动线程、暂停线程、恢复线程、等待线程结束等。

  5. 线程生命周期:Java中的线程具有生命周期,包括新建、就绪、运行、阻塞和终止等状态,程序员可以通过调用不同的方法来管理线程的状态转换。

总的来说,Java语言提供了强大而灵活的多线程支持,使得开发者可以轻松地创建和管理多个线程,并实现复杂的并发任务。通过线程同步机制,可以确保多线程程序的正确性和安全性。


11.Java 语言是动态的:

Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。


在Java语言中,动态性体现在几个方面:

  1. 动态载入类:Java程序可以动态地载入所需的类到运行环境中。这意味着程序可以在运行时根据需要加载新的类,而不需要在编译时将所有类都固定下来。这种动态加载的特性使得Java程序更加灵活,并且有利于软件的扩展和升级。

  2. 网络载入类:Java程序可以通过网络载入所需的类。这种特性使得Java程序可以在分布式环境下运行,并且能够动态地从网络上获取所需的类文件,从而实现更加灵活的系统架构和资源管理。

  3. 运行时类型检查:Java中的类具有运行时刻的表示,可以进行运行时的类型检查。这意味着程序可以在运行时检查对象的类型,从而实现更加灵活的类型判断和处理,以及动态地适应不同类型的数据和场景。

综上所述,Java语言的动态性体现在类的动态载入、网络载入类以及运行时类型检查等方面。这些特性使得Java程序具有更好的灵活性和适应性,能够应对动态变化的环境和需求。


发展历史
1995 年 5 月 23 日,Java 语言诞生
1996 年 1 月,第一个 JDK-JDK1.0 诞生
1996 年 4 月,10 个最主要的操作系统供应商申明将在其产品中嵌入 JAVA 技术
1996 年 9 月,约 8.3 万个网页应用了 JAVA 技术来制作
1997 年 2 月 18 日,JDK1.1 发布
1997 年 4 月 2 日,JavaOne 会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
1997 年 9 月,JavaDeveloperConnection 社区成员超过十万
1998 年 2 月,JDK1.1 被下载超过 2,000,000次
1998 年 12 月 8 日,JAVA2 企业平台 J2EE 发布
1999 年 6月,SUN 公司发布 Java 的三个版本:标准版(JavaSE, 以前是 J2SE)、企业版(JavaEE 以前是 J2EE)和微型版(JavaME,以前是 J2ME)
2000 年 5 月 8 日,JDK1.3 发布
2000 年 5 月 29 日,JDK1.4 发布
2001 年 6 月 5 日,NOKIA 宣布,到 2003 年将出售 1 亿部支持 Java 的手机
2001 年 9 月 24 日,J2EE1.3 发布
2002 年 2 月 26 日,J2SE1.4 发布,自此 Java 的计算能力有了大幅提升
2004 年 9 月 30 日 18:00PM,J2SE1.5 发布,成为 Java 语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5 更名为 Java SE 5.0
2005 年 6 月,JavaOne 大会召开,SUN 公司公开 Java SE 6。此时,Java 的各种版本已经更名,以取消其中的数字 “2”:J2EE 更名为 Java EE,J2SE 更名为 Java SE,J2ME 更名为 Java ME
2006 年 12 月,SUN 公司发布 JRE6.0
2009 年 04 月 20 日,甲骨文 74 亿美元收购 Sun,取得 Java 的版权。
2010 年 11 月,由于甲骨文对于 Java 社区的不友善,因此 Apache 扬言将退出 JCP。
2011 年 7 月 28 日,甲骨文发布 Java7.0 的正式版。
2014 年 3 月 18 日,Oracle 公司发表 Java SE 8。
2017 年 9 月 21 日,Oracle 公司发表 Java SE 9
2018 年 3 月 21 日,Oracle 公司发表 Java SE 10
2018 年 9 月 25 日,Java SE 11 发布
2019 年 3 月 20 日,Java SE 12 发布
Java 开发工具
Java 语言尽量保证系统内存在 1G 以上,其他工具如下所示:

Linux 系统、Mac OS 系统、Windows 95/98/2000/XP,WIN 7/8系统。
Java JDK 7、8……
vscode 编辑器或者其他编辑器。
IDE:Eclipse、 IntelliJ IDEA、NetBeans 等。
安装好以上的工具后,我们就可以输出Java的第一个程序 “Hello World!”

public class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello World”);
}
}
在下一章节我们将介绍如何配置java开发环境。

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个简单的UDP Java编程示例,适合初学者理解和学习: 1. 创建一个UDP服务器 ```java import java.net.*; public class UDPServer { public static void main(String[] args) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while (true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } } } ``` 2. 创建一个UDP客户端 ```java import java.io.*; import java.net.*; public class UDPClient { public static void main(String[] args) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("localhost"); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine(); sendData = sentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); } } ``` 这个示例程序实现了一个简单的UDP服务器和客户端之间的通信,通过在控制台输入数据,将数据发送到服务器,并将服务器返回的数据打印到控制台。这个示例程序可以帮助你理解UDP协议和Java网络编程的基础知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值