您的位置:

Java特性概述

一、Java语言特性

Java是一门面向对象的语言,它的特性包括类、对象、继承、封装、抽象、多态等。Java还有许多其他语言不具备的特性,这些都是Java的优势之一。

1. 类和对象

public class Student {
    String name;
    int age;
    double score;

    public void printInfo() {
        System.out.println("姓名:" + name);
        System.out.println("年龄:" + age);
        System.out.println("成绩:" + score);
    }
}

public class Main {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.name = "Tom";
        stu.age = 18;
        stu.score = 96.5;
        stu.printInfo();
    }
}

类是Java的基本单元,它包含了数据和方法。对象是类的一个实例,可以调用类中的方法和访问类中的数据。

2. 继承

public class Animal {
    String name;
    int age;

    public void eat() {
        System.out.println(name + "正在吃东西");
    }
}

public class Dog extends Animal {
    public void bark() {
        System.out.println(name + "正在汪汪叫");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "旺财";
        dog.age = 3;
        dog.eat();
        dog.bark();
    }
}

Java中的继承允许一个类继承另一个类的属性和方法,并且可以根据需要重写继承来的方法或者添加新的方法。

3. 封装

public class Book {
    private String name;
    private String author;
    private double price;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        Book book = new Book();
        book.setName("Java从入门到精通");
        System.out.println(book.getName());
    }
}

Java中的封装把数据和方法封装在类中,外部不能直接访问这些数据,需要通过方法来访问。

4. 抽象

public abstract class Shape {
    public abstract double area();
}

public class Square extends Shape {
    double side;

    public Square(double side) {
        this.side = side;
    }

    public double area() {
        return side * side;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape shape = new Square(4.0);
        System.out.println("正方形的面积为:" + shape.area());
    }
}

Java中的抽象类可以让子类继承并实现其中的抽象方法,这些抽象方法只有声明,没有具体的实现。

5. 多态

public class Animal {
    public void speak() {
        System.out.println("动物可以发出声音");
    }
}

public class Cat extends Animal {
    public void speak() {
        System.out.println("猫发出“喵喵”声");
    }
}

public class Dog extends Animal {
    public void speak() {
        System.out.println("狗发出“汪汪”声");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.speak();
        animal = new Dog();
        animal.speak();
    }
}

Java中的多态允许不同的子类实现同一个方法,可以通过父类的引用来调用这个方法,具有灵活性。

二、Java虚拟机特性

Java虚拟机(JVM)是Java的核心,它实现了Java语言的跨平台性,提供了自动内存管理、垃圾回收、动态字节码执行等特性。

1. 自动内存管理和垃圾回收

Java的自动内存管理和垃圾回收是通过Java虚拟机来实现的。它可以自动管理内存的分配和释放,大大地简化了程序员的工作,避免了内存泄漏和内存溢出等问题。

2. 动态字节码执行

Java编译器将Java源代码编译成Java字节码,Java虚拟机可以执行这些字节码,实现了跨平台的特性。Java虚拟机可以在运行时动态地加载和执行字节码,这也为Java语言的动态性和灵活性提供了基础。

3. 即时编译

即时编译是Java虚拟机中的一个重要特性,它可以将Java字节码编译成本地机器码,从而获得更好的执行效率。即时编译器会监测运行时的代码,并对经常执行的代码进行优化,提高程序的性能。

三、Java API特性

Java API(Application Programming Interface)是Java提供的一组类库和方法,通过这些类库和方法可以完成一些常见的任务,如IO操作、网络编程、GUI编程等。

1. IO操作

import java.io.*;

public class Main {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            System.out.println("请输入文字:");
            String line = br.readLine();
            System.out.println("输入的文字是:" + line);
        } catch(IOException e) {
            System.out.println("发生IO异常");
        }
    }
}

Java提供了丰富的IO类和方法,可以实现对文件、网络中数据的读取和写入。上面的代码演示了如何从控制台读取用户输入的数据。

2. 网络编程

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8888);
             BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {

            String cmd = "Hello, server!";
            bw.write(cmd);
            bw.newLine();
            bw.flush();

            String response = br.readLine();
            System.out.println("服务器返回:" + response);
        } catch (IOException e) {
            System.out.println("发生异常:" + e.getMessage());
        }
    }
}

public class Server {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8888);
             Socket socket = serverSocket.accept();
             BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {

            String cmd = br.readLine();
            System.out.println("客户端请求:" + cmd);
            String response = "Hello, client!";
            bw.write(response);
            bw.newLine();
            bw.flush();
        } catch (IOException e) {
            System.out.println("发生异常:" + e.getMessage());
        }
    }
}

Java中的网络编程可以实现Socket通信,通过套接字(socket)可以在网络中发送和接受数据。

3. GUI编程

import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Hello, Java");
        frame.setSize(200, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel label = new JLabel("Hello, world!");
        frame.getContentPane().add(label);

        frame.setVisible(true);
    }
}

Java中的GUI(Graphical User Interface)编程可以使用Swing或JavaFX等类库来构建GUI应用程序,实现窗口、按钮、文本框等常见的界面元素,并添加动作或事件处理逻辑。

四、Java并发特性

Java并发编程是Java语言中的一个特性,它可以实现多个线程之间的并发执行,提高程序的效率和响应速度。

1. 线程

public class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("线程 " + Thread.currentThread().getId() + " 正在执行:" + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

Java中的线程可以使用Thread类来创建,并且可以通过继承Thread类来实现自定义的线程。线程可以并发地执行。

2. 同步和锁

public class Counter {
    private long count = 0;

    public synchronized void add(long value) {
        this.count += value;
    }

    public long getCount() {
        return count;
    }
}

public class MyThread extends Thread {
    private Counter counter;

    public MyThread(Counter counter) {
        this.counter = counter;
    }

    public void run() {
        for (int i = 0; i < 10000; i++) {
            counter.add(1);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();
        MyThread thread1 = new MyThread(counter);
        MyThread thread2 = new MyThread(counter);
        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            System.out.println("发生异常:" + e.getMessage());
        }

        System.out.println("计数器的值为:" + counter.getCount());
    }
}

Java并发编程需要使用同步和锁来保护共享的资源,否则会出现竞争条件和数据不一致的问题。上面的代码演示了如何使用synchronized关键字实现对计数器的同步。

3. 线程池

public class MyTask implements Runnable {
    private int taskId;

    public MyTask(int taskId) {
        this.taskId = taskId;
    }

    public void run() {
        System.out.println("任务 " + taskId + " 开始执行");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            System.out.println("发生异常:" + e.getMessage());
        }
        System.out.println("任务 " + taskId + " 执行完成");
    }
}

public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 10; i++) {
            executor.submit(new MyTask(i));
        }
        executor.shutdown();
    }
}

Java中的线程池可以实现线程的复用和调度。它可以管理一组线程,并在需要时分配和回收线程。上面的代码演示了如何使用ExecutorService和ThreadPoolExecutor来创建线程池和提交线程任务。