为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA项目开发学习:新手入门与实践指南

标签:
Java
概述

本文详细介绍了JAVA项目开发学习的全过程,涵盖了开发环境搭建、基础语法学习、面向对象编程、项目开发流程以及进阶技巧。从新手入门到实战案例,旨在帮助开发者全面掌握JAVA项目开发技能。

Java项目开发学习:新手入门与实践指南
Java开发环境搭建

Java开发工具安装

在开始学习Java开发之前,首先需要搭建合适的开发环境。主要的开发工具包括Java开发工具包(JDK)、集成开发环境(IDE)等。以下是一些常用的开发工具和安装步骤。

JDK安装

JDK是Java开发的必备工具,包含了Java运行环境(JRE)以及Java开发工具。下载JDK安装包后,按照安装向导进行安装。安装时需注意选择合适的安装路径,以及环境变量的配置。

IDE安装

IDE是集成开发环境的简称,它集成了代码编辑、编译、调试、版本控制等功能。常用的IDE有Eclipse、IntelliJ IDEA和NetBeans等。

  • Eclipse

    • 下载Eclipse安装包并解压。
    • 配置Eclipse的工作空间路径,即存放项目的目录。
    • 安装Eclipse插件,增强功能。
  • IntelliJ IDEA
    • 下载安装IntelliJ IDEA,安装时选择合适的安装路径。
    • 创建新的项目,配置项目的基本信息,如项目名称、项目路径、语言等。

开发环境配置步骤

JDK环境变量配置

JDK安装完成后,需要配置环境变量以便在命令行中使用Java命令。以下是配置步骤:

  1. 设置JAVA_HOME环境变量
    • Windows系统中,右键“计算机”,选择“属性”->“高级系统设置”->“环境变量”。
    • 设置JAVA_HOME变量,值为JDK的安装路径,如C:\Program Files\Java\jdk1.8.0_241
  2. 设置PATH环境变量
    • 在环境变量中设置PATH变量,将%JAVA_HOME%\bin添加到环境变量中。
  3. 验证配置
    • 打开命令行,输入java -version命令,查看是否显示Java版本信息。

IDE配置

IDE的配置主要涉及到创建新项目、配置项目开发环境等。

  1. 创建新项目

    • 打开Eclipse或IntelliJ IDEA,创建新的Java项目。
    • 指定项目名称、保存路径、Java版本等信息。
  2. 导入JAR包
    • 如果项目中需要使用第三方库,可以在项目中导入相应的JAR包。
    • 在Eclipse中,右键项目选择“Build Path” -> “Add External Archives”。
    • 在IntelliJ IDEA中,右键项目选择“Module Settings” -> “Dependencies” -> “+” -> “JARs or directories”。

常用开发工具介绍

Eclipse

Eclipse是一款开源的Java IDE,支持多种编程语言,包括Java、C、C++等。它拥有丰富的插件,支持代码编辑、调试、重构等多种功能。

IntelliJ IDEA

IntelliJ IDEA是JetBrains公司开发的Java IDE,与Eclipse相比,它具有更好的性能和更强大的代码编辑功能。它支持多种编程语言,如Java、Kotlin、Python等。

NetBeans

NetBeans是另一个开源的Java IDE,支持多种编程语言,包括Java、HTML、CSS等。它同样拥有强大的代码编辑和调试功能,适合初学者使用。

Java基础语法学习

数据类型与运算符

数据类型

Java中的数据类型分为两大类:基本数据类型和引用数据类型。

  • 基本数据类型:包括整型(int、byte、short、long)、浮点型(float、double)、字符型(char)、布尔型(boolean)。

  • 引用数据类型:包括类(Class)、接口(Interface)、数组(Array)等。

以下是一个简单的Java代码示例:

public class DataTypeExample {
    public static void main(String[] args) {
        int a = 10;
        float b = 3.14f;
        boolean c = true;
        char d = 'A';
        String e = "Hello World";
        System.out.println("a: " + a);
        System.out.println("b: " + b);
        System.out.println("c: " + c);
        System.out.println("d: " + d);
        System.out.println("e: " + e);
    }
}

运算符

Java的运算符包括算术运算符、关系运算符、逻辑运算符、位运算符等。

  • 算术运算符:包括加法(+)、减法(-)、乘法(*)、除法(/)、取余(%)。
  • 关系运算符:包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。
  • 逻辑运算符:包括逻辑与(&&)、逻辑或(||)、逻辑非(!)。
  • 位运算符:包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)、右移(>>)、无符号右移(>>>)。

以下是一个简单的Java代码示例:

public class OperatorExample {
    public static void main(String[] args) {
        int a = 10;
        int b = 5;
        System.out.println("a + b = " + (a + b));
        System.out.println("a - b = " + (a - b));
        System.out.println("a * b = " + (a * b));
        System.out.println("a / b = " + (a / b));
        System.out.println("a % b = " + (a % b));
        System.out.println("a == b: " + (a == b));
        System.out.println("a != b: " + (a != b));
        System.out.println("a > b: " + (a > b));
        System.out.println("a < b: " + (a < b));
        System.out.println("a >= b: " + (a >= b));
        System.out.println("a <= b: " + (a <= b));
        System.out.println("!(a == b): " + !(a == b));
    }
}

流程控制语句

条件语句

Java中的条件语句包括ifelse ifelse语句。

  • if语句:判断条件是否满足,满足则执行特定代码块。
  • else if语句:如果前一个条件不满足,则判断下一个条件。
  • else语句:如果所有条件都不满足,则执行else代码块。
public class IfElseExample {
    public static void main(String[] args) {
        int score = 85;
        if (score >= 90) {
            System.out.println("优秀");
        } else if (score >= 80) {
            System.out.println("良好");
        } else if (score >= 70) {
            System.out.println("中等");
        } else {
            System.out.println("不及格");
        }
    }
}

循环语句

Java中的循环语句包括forwhiledo-while循环。

  • for循环:先判断条件,条件满足则执行循环体,循环结束后再次判断条件。
  • while循环:先判断条件,条件满足则执行循环体,循环结束后再次判断条件。
  • do-while循环:先执行循环体,然后判断条件,条件满足则继续循环。
public class LoopExample {
    public static void main(String[] args) {
        // for循环
        for (int i = 0; i < 5; i++) {
            System.out.println("For循环第" + i + "次");
        }
        System.out.println();

        // while循环
        int i = 0;
        while (i < 5) {
            System.out.println("While循环第" + i + "次");
            i++;
        }
        System.out.println();

        // do-while循环
        i = 0;
        do {
            System.out.println("Do-while循环第" + i + "次");
            i++;
        } while (i < 5);
    }
}

数组与集合

数组

Java中的数组是同一种类型的元素的集合。数组可以是一维的,也可以是多维的。

  • 一维数组:定义一个一维数组,初始化数组元素,遍历数组元素。
public class ArrayExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        for (int i = 0; i < numbers.length; i++) {
            System.out.println("数组元素:" + numbers[i]);
        }
    }
}
  • 多维数组:定义一个多维数组,初始化数组元素,遍历数组元素。
public class MultiDimensionArrayExample {
    public static void main(String[] args) {
        int[][] matrix = {{1, 2}, {3, 4}, {5, 6}};
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                System.out.println("矩阵元素:" + matrix[i][j]);
            }
        }
    }
}

集合

集合是Java中用于存储对象的一种数据结构。集合框架主要包括集合接口Collection、列表接口List、映射接口Map等。

  • ArrayList:实现了List接口,是一个可变大小的数组列表,允许存储重复元素。
  • HashSet:实现了Set接口,不允许存储重复元素,元素无序。
  • HashMap:实现了Map接口,存储键值对,不允许键重复。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CollectionExample {
    public static void main(String[] args) {
        // ArrayList
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");
        System.out.println("List: " + list);
        System.out.println();

        // HashSet
        HashSet<String> set = new HashSet<>();
        set.add("Java");
        set.add("Python");
        set.add("C++");
        System.out.println("Set: " + set);
        System.out.println();

        // HashMap
        Map<String, Integer> map = new HashMap<>();
        map.put("Java", 1);
        map.put("Python", 2);
        map.put("C++", 3);
        System.out.println("Map: " + map);
    }
}
Java面向对象编程

类与对象的概念

面向对象编程是一种编程范式,它将数据和操作数据的方法封装在一起,形成一个类。类是对象的模板,对象是类的实例。

类的定义

在Java中定义一个类使用class关键字,并使用publicprivate等访问修饰符。

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

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

    // 成员方法
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

对象的创建

对象是类的实例,使用new关键字创建对象。

public class Main {
    public static void main(String[] args) {
        // 创建对象
        Student student = new Student("张三", 18);

        // 访问对象的方法
        System.out.println("姓名:" + student.getName());
        System.out.println("年龄:" + student.getAge());
    }
}

封装、继承、多态

封装

封装是将数据和操作数据的方法封装在一起,隐藏内部实现细节,只暴露必要的接口供外部调用。

public class BankAccount {
    private double balance;

    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    public double getBalance() {
        return balance;
    }

    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount(1000);
        account.deposit(500);
        account.withdraw(200);
        System.out.println("余额:" + account.getBalance());
    }
}

继承

继承是面向对象编程的核心特性之一,它允许一个类继承另一个类的属性和方法。

public class Animal {
    public void eat() {
        System.out.println("动物正在吃东西");
    }
}

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

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat(); // 继承自Animal类
        dog.bark(); // Dog类的方法
    }
}

多态

多态是一种允许使用一个接口表示多种不同形式的能力。通过继承和方法重写,可以在不同的对象上使用相同的方法,得到不同的结果。

public class Shape {
    public void draw() {
        System.out.println("绘制图形");
    }
}

public class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

public class Square extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制正方形");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape shape1 = new Circle();
        Shape shape2 = new Square();

        shape1.draw(); // 输出:绘制圆形
        shape2.draw(); // 输出:绘制正方形
    }
}

接口与抽象类

接口

接口是一种特殊的类,它定义了一组抽象方法,这些方法必须由实现该接口的类来实现。接口可以用于定义类的行为规范。

public interface Animal {
    void eat();
    void sleep();
}

public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("狗正在吃东西");
    }

    @Override
    public void sleep() {
        System.out.println("狗正在睡觉");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
        dog.sleep();
    }
}

抽象类

抽象类是一种不能实例化的类,它包含抽象方法,抽象方法只有方法签名,没有方法实现。抽象类可以被继承,子类必须实现抽象方法。

public abstract class Animal {
    public abstract void eat();
    public abstract void sleep();
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗正在吃东西");
    }

    @Override
    public void sleep() {
        System.out.println("狗正在睡觉");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
        dog.sleep();
    }
}
Java项目开发流程

需求分析与设计

需求分析是项目开发的第一步,需要明确项目的需求和目标。需求分析包括功能需求、性能需求、安全性需求等。

  • 功能需求:明确项目需要实现的功能。
  • 性能需求:包括响应时间、并发处理能力等。
  • 安全性需求:确保数据安全,防止数据泄露。

设计阶段需要进行系统设计、数据库设计、界面设计等。系统设计包括模块划分、接口设计、数据结构设计等。

编码与单元测试

编码阶段是实现需求的阶段,需要按照设计文档进行编码。编码过程中需要遵循良好的编程规范,如代码风格、注释、异常处理等。

  • 代码风格

    • 使用有意义的变量名、方法名。
    • 代码结构清晰,逻辑层次分明。
    • 代码尽量简洁,避免冗余。
  • 注释

    • 对代码逻辑复杂的部分添加注释。
    • 说明代码的主要功能和实现逻辑。
    • 对重要的参数和返回值进行说明。
  • 异常处理
    • 捕获可能的异常,避免程序崩溃。
    • 对异常进行处理,提供友好的错误提示。

单元测试是测试代码单元(如方法、类)是否按预期运行。单元测试可以提高代码质量,减少错误。

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 2);
        assertEquals(3, result);
    }

    @Test
    public void testSubtract() {
        Calculator calculator = new Calculator();
        int result = calculator.subtract(5, 3);
        assertEquals(2, result);
    }
}

项目部署与维护

项目部署是将项目代码发布到生产环境的过程。部署过程需要考虑环境配置、数据迁移、版本控制等因素。

  • 环境配置

    • 配置服务器环境,如操作系统、数据库、中间件等。
    • 配置应用服务器,如Tomcat、Jetty等。
    • 配置线程池、连接池等资源管理。
  • 数据迁移

    • 将测试数据迁移到生产环境。
    • 设置数据库备份策略,防止数据丢失。
  • 版本控制
    • 使用版本控制系统,如Git。
    • 配置持续集成和持续部署,如Jenkins。

项目维护是保持项目稳定运行、解决用户反馈问题的过程。维护阶段需要不断优化代码、修复BUG、更新依赖等。

  • 代码优化

    • 重构代码,提高代码可读性和可维护性。
    • 优化算法,提高程序性能。
  • BUG修复

    • 收集用户反馈,定位BUG。
    • 修复BUG,发布新版本。
  • 依赖更新
    • 定期更新依赖库,避免安全漏洞。
    • 升级版本,获取新功能。
Java项目实战案例

简单的学生管理系统

学生管理系统是一个典型的小型项目,用于管理学生信息。系统功能包括添加学生、删除学生、查询学生信息等。

import java.util.ArrayList;
import java.util.List;

public class StudentManagementSystem {
    private List<Student> students;

    public StudentManagementSystem() {
        students = new ArrayList<>();
    }

    public void addStudent(Student student) {
        students.add(student);
    }

    public void removeStudent(Student student) {
        students.remove(student);
    }

    public Student findStudentById(int id) {
        for (Student student : students) {
            if (student.getId() == id) {
                return student;
            }
        }
        return null;
    }

    public void displayStudents() {
        for (Student student : students) {
            System.out.println(student);
        }
    }
}

public class Student {
    private int id;
    private String name;
    private int age;

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

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        StudentManagementSystem system = new StudentManagementSystem();
        system.addStudent(new Student(1, "张三", 18));
        system.addStudent(new Student(2, "李四", 19));
        system.displayStudents();

        Student student = system.findStudentById(1);
        if (student != null) {
            System.out.println("找到学生:" + student);
        } else {
            System.out.println("未找到学生");
        }

        system.removeStudent(new Student(1, "张三", 18));
        system.displayStudents();
    }
}

网站后端接口开发

网站后端接口开发是开发Web应用的重要部分,需要实现用户注册、登录、查询等功能。

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        if ("register".equals(action)) {
            // 处理用户注册逻辑
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            // 注册用户到数据库
            System.out.println("注册用户:" + username);
        } else if ("login".equals(action)) {
            // 处理用户登录逻辑
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            // 检查用户名和密码是否匹配
            System.out.println("登录用户:" + username);
        } else if ("query".equals(action)) {
            // 处理查询逻辑
            String id = req.getParameter("id");
            // 查询用户信息
            System.out.println("查询用户:" + id);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

数据库操作与连接

数据库操作是项目开发中的重要部分,需要实现增删改查(CRUD)操作。

JDBC连接数据库

使用JDBC(Java Database Connectivity)连接数据库,JDBC提供了一组标准的SQL执行接口,可以连接各种数据库。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcExample {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 获取数据库连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
            // 创建Statement对象
            stmt = conn.createStatement();
            // 执行SQL查询
            rs = stmt.executeQuery("SELECT * FROM users");
            // 处理结果集
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("id: " + id + ", name: " + name + ", age: " + age);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

数据库连接池

数据库连接池可以提高数据库访问性能,减少数据库连接的创建和销毁次数。

import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;

public class DataSourceExample {
    public static void main(String[] args) {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("password");

        try (Connection conn = dataSource.getConnection()) {
            // 使用数据库连接
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Java项目开发进阶

异常处理与日志管理

异常处理

异常处理是程序开发中的重要部分,可以捕获程序中的异常,防止程序崩溃。

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int a = 10;
            int b = 0;
            int result = a / b;
            System.out.println("结果:" + result);
        } catch (ArithmeticException e) {
            System.out.println("发生算术异常:" + e.getMessage());
        } finally {
            System.out.println("执行finally块");
        }
    }
}

日志管理

日志管理是记录程序运行信息的重要手段,可以帮助开发人员调试和定位问题。

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LogExample {
    private static final Logger logger = LogManager.getLogger(LogExample.class);

    public static void main(String[] args) {
        logger.info("程序开始运行");
        int a = 10;
        int b = 0;
        try {
            int result = a / b;
            logger.info("结果:" + result);
        } catch (ArithmeticException e) {
            logger.error("发生算术异常:" + e.getMessage());
        } finally {
            logger.info("执行finally块");
        }
    }
}

线程与并发编程

线程

线程是程序并发执行的基本单位,Java中使用Thread类创建和管理线程。

public class ThreadExample implements Runnable {
    @Override
    public void run() {
        System.out.println("线程开始执行");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程结束执行");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadExample());
        thread.start();
    }
}

并发编程

并发编程是提高程序性能的重要手段,Java中通过ExecutorService等类实现并发编程。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ConcurrencyExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(4);
        for (int i = 0; i < 10; i++) {
            executor.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("任务开始执行");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("任务结束执行");
                }
            });
        }
        executor.shutdown();
    }
}

性能优化与调试技巧

性能优化

性能优化是提高程序运行效率的重要手段,可以通过算法优化、减少IO操作、使用缓存等方法实现性能优化。

public class PerformanceOptimizationExample {
    public static void main(String[] args) {
        int[] numbers = new int[1000000];
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = i;
        }

        long startTime = System.currentTimeMillis();
        int sum = 0;
        for (int number : numbers) {
            sum += number;
        }
        long endTime = System.currentTimeMillis();
        System.out.println("总和:" + sum);
        System.out.println("耗时:" + (endTime - startTime) + "ms");

        long startTimeOptimized = System.currentTimeMillis();
        int sumOptimized = 0;
        for (int i = 0; i < numbers.length; i++) {
            sumOptimized += numbers[i];
        }
        long endTimeOptimized = System.currentTimeMillis();
        System.out.println("总和:" + sumOptimized);
        System.out.println("优化后耗时:" + (endTimeOptimized - startTimeOptimized) + "ms");
    }
}

调试技巧

调试是程序开发中的重要环节,可以通过断点调试、日志输出、代码审查等方法实现调试。

public class DebuggingExample {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int result = a + b;
        System.out.println("结果:" + result);

        // 断点调试
        // 在变量a或b上设置断点,查看变量值变化
    }
}
结语

Java项目开发是一个复杂的过程,需要综合运用各种技术和工具。通过本指南的学习,你可以掌握Java开发的基本概念和技术,为实际项目开发打下坚实的基础。建议在学习过程中多动手实践,通过实际项目开发来巩固和提升自己的编程能力。如果你需要更多的学习资源,可以参考慕课网(https://www.imooc.com/)上的相关课程

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消