手记

JavaSE入门教程:基础概念与实践指南

概述

JavaSE入门介绍包括JavaSE的基础概念、优势及应用场景,详细步骤搭建开发环境,并涵盖Java基础语法和面向对象编程等知识,帮助初学者全面了解和掌握JavaSE。

JavaSE简介

JavaSE概述

Java是一种面向对象的编程语言,广泛用于开发跨平台的软件。Java SE(Java Standard Edition)是Java平台的基础,提供了开发和部署在桌面、移动、嵌入式环境的应用程序所需的类库和工具。Java SE的核心是Java虚拟机(JVM),它能够运行Java字节码,使得Java程序能够在任何支持Java的平台上运行,即“一次编写,到处运行”。

Java的优势及应用场景

Java具有多种优势,包括但不限于:

  • 跨平台性:Java程序可以在各种操作系统上运行,只需编译成字节码,而无需重新编译。这极大地简化了软件的移植和维护。
  • 安全性:Java具备内置的安全机制,包括类加载器、沙箱机制和安全性管理器等,使得Java程序更加安全和可靠。
  • 可移植性:Java源代码和字节码可以很容易地在不同的硬件和操作系统上移植。
  • 自动内存管理:Java的垃圾收集器自动回收不再使用的内存,减少了内存泄漏的风险。
  • 强大的类库:Java提供了丰富的标准类库,这些类库包括了网络通信、多线程、图形用户界面等众多功能,这使得开发人员可以迅速地构建复杂的应用程序。

Java的应用场景广泛,包括但不限于:

  • Web应用开发:Java是构建网页应用和服务端应用的流行技术之一,如Spring Boot、Java Servlet等。
  • Android应用开发:Android操作系统的核心就是Java语言,使用Java可以开发出各种各样的移动应用。
  • 企业级应用:Java在企业级应用开发中占据重要地位,尤其在大型系统的开发中,J2EE(Java EE)提供了丰富的组件和服务。
  • 桌面应用开发:可以使用Swing或JavaFX等库来开发桌面应用程序。
  • 嵌入式系统:Java可以用于开发智能设备、移动设备等嵌入式系统的应用。

Java开发环境搭建

为了搭建Java SE开发环境,通常需要经过以下步骤:

  1. 安装Java开发工具包(JDK):首先,从Oracle官方网站或OpenJDK的官方渠道下载并安装JDK,确保安装完成后环境变量已正确配置。例如,安装JDK 11,可以设置环境变量 JAVA_HOME 指向JDK安装目录,如 C:\Program Files\Java\jdk-11.0.1。同时,将 JAVA_HOME 添加到 PATH 环境变量中,如 %JAVA_HOME%\bin。这将允许命令行窗口识别 javacjava 和其他Java相关的命令。

  2. 选择编辑器或IDE:选择一个合适的开发工具进行编程。常见的IDE有Eclipse、IntelliJ IDEA、NetBeans等。Eclipse是最受欢迎的开源IDE之一,使用它可以帮助开发者提高开发效率。安装Eclipse的步骤如下:
    • 访问Eclipse官方网站,下载适合你操作系统的Eclipse版本。
    • 解压下载的压缩包到你选择的目录,例如 C:\Eclipse
    • 双击 eclipse.exe 启动Eclipse。
    • 在Eclipse中,设置新的工作空间,即你的Java项目文件存放路径。
    • 对于IntelliJ IDEA,同样需要下载并安装适合你操作系统的版本,解压后双击运行即可。
    • 对于NetBeans,同样需要下载并安装适合你操作系统的版本,解压后双击运行即可。
  3. 设置环境变量:确保环境变量已正确配置,可以在命令行中输入 java -version 来验证Java是否安装成功。
  4. 编写并运行第一个Java程序:创建一个名为 HelloWorld.java 的源文件,内容如下:

    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }

    然后,在命令行中进入该文件所在的目录,执行以下命令进行编译和运行:

    javac HelloWorld.java
    java HelloWorld

    执行后,你应该会看到输出 Hello, World!

Java基础语法

变量和数据类型

Java语言中的变量用于存储数据。变量的定义包括类型和名称。在Java中,变量可以分为基本类型(原始数据类型)和引用类型(对象类型)。

基本类型

Java的基本类型包括以下几种:

  • byte:8位,有符号整数,取值范围从-128到127。
  • short:16位,有符号整数,取值范围从-32768到32767。
  • int:32位,有符号整数,取值范围从-2147483648到2147483647。
  • long:64位,有符号整数,取值范围从-9223372036854775808到9223372036854775807。
  • float:32位,浮点数,有单精度。
  • double:64位,浮点数,有双精度。
  • boolean:逻辑类型,取值为truefalse
  • char:16位,表示Unicode字符。

例如:

byte a = 1;
short b = 2;
int c = 3;
long d = 4L;
float e = 5.0f;
double f = 6.0;
boolean g = true;
char h = 'A';

引用类型

Java引用类型主要用于存储对象的引用,即对象的地址。引用类型包括类、接口和数组。通过引用类型可以访问对象的方法和属性。

例如:

String name = "World";
Person person = new Person("John");
String[] names = {"Alice", "Bob"};

运算符

Java运算符可以分为以下几类:

  • 算术运算符:包括加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。
  • 赋值运算符:包括简单的赋值(=)、复合运算(+=-=*=/=%=等)。
  • 逻辑运算符:包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。
  • 比较运算符:包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。
  • 位运算符:包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。

例如:

int a = 5;
int b = 3;

int sum = a + b;        // 加法
int difference = a - b; // 减法
int product = a * b;    // 乘法
int quotient = a / b;   // 除法
int remainder = a % b;  // 取模

boolean isEqual = a == b;
boolean isNotEqual = a != b;

boolean result = (a > b) && (a < 10);

流程控制语句

Java中的流程控制语句包括条件语句和循环语句。这些语句用来控制程序的执行流程。

条件语句

Java中的条件语句主要分为 if 语句和 switch 语句。

  • if 语句:根据条件的真假执行相应的代码块。

    int x = 10;
    
    if (x > 0) {
      System.out.println("x is positive.");
    } else {
      System.out.println("x is non-positive.");
    }
  • switch 语句:根据不同的条件执行不同的代码块。每个条件对应一个 case

    int day = 2;
    switch (day) {
      case 1:
          System.out.println("Monday");
          break;
      case 2:
          System.out.println("Tuesday");
          break;
      default:
          System.out.println("Other day");
    }

循环语句

Java中的循环语句包括 for 循环、while 循环和 do-while 循环。

  • for 循环:通常用于已知循环次数的情况。

    for (int i = 0; i < 5; i++) {
      System.out.println("Iteration " + i);
    }
  • while 循环:根据条件执行循环,条件满足时继续循环。

    int i = 0;
    while (i < 5) {
      System.out.println("Iteration " + i);
      i++;
    }
  • do-while 循环:先执行循环,然后判断条件,如果条件满足则继续循环。

    int i = 0;
    do {
      System.out.println("Iteration " + i);
      i++;
    } while (i < 5);

数组和字符串处理

数组和字符串是Java中非常常用的数据结构。

数组

数组是一种存储相同类型元素的数据结构。在Java中,有两种类型的数组:

  • 基本类型数组:如int[]double[]等。

    int[] numbers = new int[5];
    numbers[0] = 1;
    numbers[1] = 2;
    numbers[2] = 3;
    numbers[3] = 4;
    numbers[4] = 5;
    
    for (int i = 0; i < numbers.length; i++) {
      System.out.println(numbers[i]);
    }
  • 引用类型数组:如String[]

    String[] names = new String[3];
    names[0] = "Alice";
    names[1] = "Bob";
    names[2] = "Charlie";
    
    for (int i = 0; i < names.length; i++) {
      System.out.println(names[i]);
    }

字符串

字符串在Java中是通过String类来表示的,它是一个不可变对象。常用操作包括:

  • 创建字符串

    String name = "John";
  • 字符串操作

    String str1 = "Hello";
    String str2 = "World";
    
    // 拼接
    String result = str1 + " " + str2;
    System.out.println(result); // Hello World
    
    // 长度
    int len = str1.length();
    System.out.println(len); // 5
    
    // 字符串转换为数组
    char[] characters = str1.toCharArray();
    for (char c : characters) {
      System.out.println(c);
    }
  • 字符串比较

    String s1 = "abc";
    String s2 = "abc";
    
    boolean isEqual = s1.equals(s2);
    System.out.println(isEqual); // true
对象与类

类的定义与使用

在面向对象编程中,类是构建对象的蓝图。类定义了对象的结构(属性)和行为(方法)。一个类可以包含变量(成员变量)和方法(成员方法)。

定义一个简单的类

public class Person {
    // 成员变量
    private String name;
    private int age;

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 成员方法
    public void introduce() {
        System.out.println("My name is " + name + ". I am " + age + " years old.");
    }

    // 静态方法
    public static void staticMethod() {
        System.out.println("Static method called.");
    }

    static {
        System.out.println("Static block executed.");
    }
}

创建和使用对象

public class Main {
    public static void main(String[] args) {
        // 创建Person对象
        Person person = new Person("John", 20);

        // 调用对象方法
        person.introduce(); // 输出:My name is John. I am 20 years old.
    }
}

对象的创建与初始化

对象的创建可以使用构造方法,构造方法的名字必须与类名相同,并且不返回任何值(即返回类型为void)。构造方法可以有参数,用于初始化对象的成员变量。

使用构造方法初始化对象

public class Book {
    private String title;
    private String author;

    // 构造方法
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    // 成员方法
    public void displayInfo() {
        System.out.println("Title: " + title + ", Author: " + author);
    }
}

public class Main {
    public static void main(String[] args) {
        // 使用构造方法创建对象
        Book book = new Book("The Great Gatsby", "F. Scott Fitzgerald");

        // 调用对象的方法
        book.displayInfo(); // 输出:Title: The Great Gatsby, Author: F. Scott Fitzgerald
    }
}

构造函数与方法重载

构造函数用于初始化新创建的对象。方法重载是指在一个类中定义多个同名的方法,但每个方法的参数列表不同。

构造函数的重载

public class Rectangle {
    private double width;
    private double height;

    // 构造方法
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    // 重载的构造方法
    public Rectangle(double side) {
        this.width = side;
        this.height = side;
    }

    // 成员方法
    public double area() {
        return width * height;
    }
}

public class Main {
    public static void main(String[] args) {
        // 使用构造方法创建对象
        Rectangle rect1 = new Rectangle(4, 5);
        Rectangle rect2 = new Rectangle(3);

        // 调用对象的方法
        System.out.println(rect1.area()); // 输出:20.0
        System.out.println(rect2.area()); // 输出:9.0
    }
}

封装、继承和多态

封装、继承和多态是面向对象编程的三大特性。

封装

封装(Encapsulation)是指将对象的状态信息(成员变量)封装在对象内部,通过方法(成员方法)来访问这些信息。通过封装,可以隐藏对象内部的状态,使外部只能通过特定接口与对象交互。

public class Person {
    // 封装的成员变量
    private String name;
    private int age;

    // 成员方法
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }

    public void introduce() {
        System.out.println("My name is " + name + ". I am " + age + " years old.");
    }
}

继承

继承(Inheritance)是指一个类可以继承另一个类的属性和方法。被继承的类称为父类或超类,继承的类称为子类。子类可以继承父类的方法,并可以添加新的方法或重写父类的方法。

public class Animal {
    public void eat() {
        System.out.println("Animal is eating.");
    }

    public void sleep() {
        System.out.println("Animal is sleeping.");
    }
}

public class Dog extends Animal {
    public void bark() {
        System.out.println("Dog is barking.");
    }

    public void eat() {
        System.out.println("Dog is eating.");
    }
}

多态

多态(Polymorphism)是指父类对象可以引用子类对象。当调用的方法在子类中被重写时,调用该方法时将调用子类中的方法。

public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = new Dog();

        // 调用父类方法
        animal.eat(); // 输出:Animal is eating.

        // 使用父类引用指向子类对象
        Animal animal2 = new Dog();
        animal2.eat(); // 输出:Dog is eating.
        animal2.bark(); // 输出:Dog is barking.

        // 调用子类方法
        dog.eat(); // 输出:Dog is eating.
        dog.bark(); // 输出:Dog is barking.
    }
}
异常处理

异常的概念与分类

在Java中,异常是一种在程序运行时可能出现错误的情况。Java异常分为两种:检查异常(编译时异常)和非检查异常(运行时异常)。

  • 检查异常:通常由程序员处理,需要在方法声明中使用throws关键字抛出或者在方法内部使用try-catch块捕获。例如IOExceptionSQLException等。
  • 非检查异常:通常由程序逻辑错误引起,例如NullPointerExceptionArrayIndexOutOfBoundsException等,这些异常不需要在方法声明中声明。

异常处理机制

Java通过try-catch块来处理异常。try块中包含可能抛出异常的代码,catch块用于捕获并处理该异常。一个try块可以有多个catch块,也可以有finally块,用于清理资源。

public class Main {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[3]); // 数组越界
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        } finally {
            System.out.println("Finally block executed.");
        }
    }
}

自定义异常类

除了使用Java提供的异常类,还可以自定义异常类。自定义异常类需要继承Exception类或其子类。

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            throw new MyException("This is a custom exception.");
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}
输入输出流

文件输入输出操作

Java提供了多种方式来处理文件输入输出,包括java.io.*包中的类。常用的类有FileInputStreamFileOutputStreamBufferedReaderBufferedWriter等。

使用文件输入输出流

import java.io.*;

public class FileIOExample {
    public static void main(String[] args) {
        try {
            // 写文件
            FileOutputStream fos = new FileOutputStream("output.txt");
            String text = "Hello, world!";
            fos.write(text.getBytes());
            fos.close();

            // 读文件
            FileInputStream fis = new FileInputStream("output.txt");
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) > 0) {
                System.out.print(new String(buffer, 0, length));
            }
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用缓冲流

缓冲流可以提高输入输出的效率。BufferedReaderBufferedWriter用于文本文件的读写。

import java.io.*;

public class BufferedFileIOExample {
    public static void main(String[] args) {
        try {
            // 写文件
            BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
            bw.write("Hello, buffered world!");
            bw.close();

            // 读文件
            BufferedReader br = new BufferedReader(new FileReader("output.txt"));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

字符流与字节流

Java中的流分为字节流和字符流。字节流处理二进制数据,字符流处理文本数据。

字节流

InputStreamOutputStream是所有字节流的父类。FileInputStreamFileOutputStream是处理文件字节流的例子。

import java.io.*;

public class ByteStreamExample {
    public static void main(String[] args) {
        try {
            // 写文件
            FileOutputStream fos = new FileOutputStream("output.bin");
            byte[] buffer = {1, 2, 3, 4, 5};
            fos.write(buffer);
            fos.close();

            // 读文件
            FileInputStream fis = new FileInputStream("output.bin");
            int b;
            while ((b = fis.read()) != -1) {
                System.out.println(b);
            }
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

字符流

ReaderWriter是所有字符流的父类。FileReaderFileWriter是处理文件字符流的例子。

import java.io.*;

public class CharStreamExample {
    public static void main(String[] args) {
        try {
            // 写文件
            FileWriter fw = new FileWriter("output.txt");
            String text = "Hello, char stream!";
            fw.write(text);
            fw.close();

            // 读文件
            FileReader fr = new FileReader("output.txt");
            int b;
            while ((b = fr.read()) != -1) {
                System.out.print((char) b);
            }
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

对象序列化与反序列化

对象序列化(Serialization)是将对象的状态转换为可以存储或传输的字节流的过程,反序列化(Deserialization)是将字节流转换回对象的过程。常用的类有ObjectInputStreamObjectOutputStream

序列化与反序列化对象

import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        try {
            // 创建对象
            Person person = new Person("John", 20);

            // 序列化
            FileOutputStream fos = new FileOutputStream("person.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(person);
            oos.close();
            fos.close();

            // 反序列化
            FileInputStream fis = new FileInputStream("person.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Person deserializedPerson = (Person) ois.readObject();
            ois.close();
            fis.close();

            // 打印反序列化后的对象
            deserializedPerson.introduce();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

public class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void introduce() {
        System.out.println("My name is " + name + ". I am " + age + " years old.");
    }
}
面向对象编程进阶

抽象类与接口

抽象类和接口是用于实现抽象和复用的机制。

抽象类

抽象类是不能实例化的类,通常包含一个或多个抽象方法(没有实现的方法)。子类继承抽象类必须实现其中的抽象方法。

public abstract class Animal {
    public abstract void eat();
    public void sleep() {
        System.out.println("Animal is sleeping.");
    }
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.eat(); // 输出:Dog is eating.
        animal.sleep(); // 输出:Animal is sleeping.
    }
}

接口

接口(Interface)是包含一组抽象方法的类,实现接口的类必须提供这些方法的具体实现。

public interface Flyable {
    void fly();
}

public class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("Bird is flying.");
    }

    public void sing() {
        System.out.println("Bird is singing.");
    }
}

public class Main {
    public static void main(String[] args) {
        Flyable flyable = new Bird();
        flyable.fly(); // 输出:Bird is flying.
    }
}

包与访问权限控制

包(Package)用于组织类,避免命名冲突并便于查找。Java中常用关键字控制类和方法的访问权限。

包的声明

package com.example;

public class Example {
    public void print() {
        System.out.println("This is an example.");
    }
}

访问权限

  • public:可以在任何地方访问。
  • protected:在同一个包内或子类中访问。
  • private:仅在定义它的类中访问。
  • 默认(无修饰符):在同一个包内访问。
public class AccessControlExample {
    public int publicField = 1;

    protected int protectedField = 2;

    private int privateField = 3;

    int defaultField = 4;
}

public class Main {
    public static void main(String[] args) {
        AccessControlExample example = new AccessControlExample();
        System.out.println(example.publicField); // 输出:1
        // System.out.println(example.protectedField); // 编译错误,不在同一个包内
        // System.out.println(example.privateField); // 编译错误,不可访问
        // System.out.println(example.defaultField); // 编译错误,不在同一个包内
    }
}

Java集合框架简介

Java集合框架(Java Collections Framework)是用于处理集合数据的标准化框架。它通过Collection接口和Map接口提供了多种集合类,如ListSetQueue等。

List接口

List接口表示元素有序的集合。常用的实现类包括ArrayListLinkedList

import java.util.*;

public class ListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}

Set接口

Set接口表示元素不重复的集合。常用的实现类包括HashSetTreeSet

import java.util.*;

public class SetExample {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(1); // 不会重复添加

        for (Integer number : set) {
            System.out.println(number);
        }
    }
}

Map接口

Map接口表示元素为键值对的集合。常用的实现类包括HashMapTreeMap

import java.util.*;

public class MapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Orange", 3);

        for (String key : map.keySet()) {
            System.out.println(key + ": " + map.get(key));
        }
    }
}

性能与应用场景

  • ArrayList:基于数组实现,提供快速的随机访问,但插入和删除操作较慢。
  • LinkedList:基于链表实现,插入和删除操作较快,但随机访问较慢。
  • HashSet:基于哈希表实现,提供快速的插入、删除和查找操作,不保证元素的顺序。
  • TreeSet:基于红黑树实现,提供有序的存储,插入、删除操作较慢。
  • HashMap:基于哈希表实现,提供快速的插入、删除和查找操作,不保证元素的顺序。
  • TreeMap:基于红黑树实现,提供有序的存储,插入、删除操作较慢。

通过以上介绍,可以对Java集合框架有一个基本的了解,并能够有效地使用它们来处理集合数据。

0人推荐
随时随地看视频
慕课网APP