思考学校、小学、中学、中专、大学之间的关系,创建一个Java项目编程实现。提示:内容自定。

思考学校、小学、中学、中专、大学之间的关系,创建一个Java项目编程实现。提示:内容自定。

什么叫思考他们的关系?你会用继承不就能写出来了嘛

来自chatgpt的回答

首先,我们需要定义一个School类,以及它的子类ElementarySchoolMiddleSchoolUniversity。其中,ElementarySchoolMiddleSchoolSchool的子类,而University则是它的兄弟类(即和School同级别的类)。

java
public class School {
    private String name;
    private int foundingYear;

    public School(String name, int foundingYear) {
        this.name = name;
        this.foundingYear = foundingYear;
    }

    // 省略getter和setter方法
    // ...
}

public class ElementarySchool extends School {
    private String address;

    public ElementarySchool(String name, int foundingYear, String address) {
        super(name, foundingYear);
        this.address = address;
    }

    // 省略getter和setter方法
    // ...
}

public class MiddleSchool extends School {
    private int studentCount;

    public MiddleSchool(String name, int foundingYear, int studentCount) {
        super(name, foundingYear);
        this.studentCount = studentCount;
    }

    // 省略getter和setter方法
    // ...
}

public class University {
    private String name;
    private int foundingYear;
    private String president;

    public University(String name, int foundingYear, String president) {
        this.name = name;
        this.foundingYear = foundingYear;
        this.president = president;
    }

    // 省略getter和setter方法
    // ...
}
接着,我们可以定义一个Interface类,来表示各个学校之间的共同特征,比如说它们都有一个校名和创办年份。

java
public interface Interface {
    String getName();
    int getFoundingYear();
}
最后,我们可以让School类实现这个接口,并根据需要在子类中重写相应的方法。

java
public class School implements Interface {
    // 省略上面的内容

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getFoundingYear() {
        return foundingYear;
    }
}

public class ElementarySchool extends School {
    // 省略上面的内容

    @Override
    public String getName() {
        // 在校名前面加上“小学”三个字
        return "小学" + super.getName();
    }
}

public class MiddleSchool extends School {
    // 省略上面的内容

    @Override
    public String getName() {
        // 在校名前面加上“中学”三个字
        return "中学" + super.getName();
    }
}

public class University implements Interface {
    // 省略上面的内容

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getFoundingYear() {
        return foundingYear;
    }
}
这样一来,我们就可以方便地创建各种学校的实例,并使用它们的方法来获取所需信息。例如:

java
ElementarySchool es = new ElementarySchool("一小", 1950, "石家庄市长安区");
MiddleSchool ms = new MiddleSchool("一中", 1901, 2000);
University u = new University("清华大学", 1911, "邱勇");

System.out.println(es.getName() + "成立于" + es.getFoundingYear() + "年,地址在" + es.getAddress());
System.out.println(ms.getName() + "成立于" + ms.getFoundingYear() + "年,学生人数为" + ms.getStudentCount());
System.out.println(u.getName() + "成立于" + u.getFoundingYear() + "年,校长是" + u.getPresident());
输出结果如下:

小学一小成立于1950年,地址在石家庄市长安区
中学一中成立于1901年,学生人数为2000
清华大学成立于1911年,校长是邱勇

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7500930
  • 这篇博客也不错, 你可以看下我的Java教程,不断整理,反复学习,记录着那些年大学奋斗的青春
  • 你还可以看下java参考手册中的 java-学习Java语言 - 描述Java编程语言的基本概念和特点的课程。-语言基础介绍了语言的传统特征,包括变量、数组、数据类型、运算符和控制流。-变量
  • 除此之外, 这篇博客: 多线程系列:一、进程与线程、Java中的线程池中的 参数含义: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • int corePoolSize:该线程池中核心线程数最大值核心线程

    线程池新建线程的时候,如果当前线程总数小于corePoolSize,则新建的是核心线程,如果超过corePoolSize,则新建的是非核心线程,核心线程默认情况下会一直存活在线程池中,即使为闲置状态。如果指定ThreadPoolExecutor的allowCoreThreadTimeOut这个属性为true,那么核心线程如果不干活(闲置状态)的话,超过一定时间(时长下面参数决定),就会被销毁掉。

    int maximumPoolSize:该线程池中线程总数最大值

    线程总数 = 核心线程数 + 非核心线程数。
    

    long keepAliveTime:线程池中线程等待任务的超时时长

    一个非核心线程,如果获取任务(即闲置状态)的时长超过这个参数所设定的时长,就会被销毁掉。默认情况下(allowCoreThreadTimeOut = false),只作用于非核心线程,也可以使其作用于核心线程。

    TimeUnit unit:keepAliveTime时间单位

    BlockingQueue workQueue:该线程池中的任务队列,维护着等待执行的 Runnable 对象

       当核心线程数已经到达最大值时,新添加的任务会被添加到这个队列中等待处理。

    常用的workQueue类型:

    • SynchronousQueue
      不存储元素 的阻塞队列,每一个 put 操作必须等待一个 take 操作,否则不能继续添加元素。因此这里的 Synchronous 指的是读线程和写线程需要同步,数据必须从某个写线程交给某个读线程,而不是在队列中等待被消费。
      由此可知,SynchronousQueue 的吞吐量比 唤醒空闲线程执行任务 的 LinkedBlockingQueue 和 ArrayBlockingQueue 高。

    • LinkedBlockingQueue:链表实现的有界阻塞队列,元素排序按 FIFO。注意:该队列默认大小为 Integer.MAX_VALUE。

    ExecutorService fixedThreadPool = new ThreadPoolExecutor(6, 10, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(18));
            for (int i = 0; i < 100; i++) {
                int finalI = i;
                fixedThreadPool.execute(new Runnable(){
                    @Override
                    public void run() {
                        System.out.println(finalI+"fixedThreadPool "+Thread.currentThread().getName());
    
                        try {
                            Thread.sleep(50000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                    }
                });
            }
    
    
    print:
    0fixedThreadPool pool-1-thread-1
    2fixedThreadPool pool-1-thread-3
    4fixedThreadPool pool-1-thread-5
    1fixedThreadPool pool-1-thread-2
    24fixedThreadPool pool-1-thread-7
    3fixedThreadPool pool-1-thread-4
    5fixedThreadPool pool-1-thread-6
    25fixedThreadPool pool-1-thread-8
    27fixedThreadPool pool-1-thread-10
    java.util.concurrent.RejectedExecutionException:......
    
    • ArrayBlockingQueue:数组实现的有界阻塞队列,元素排序按 FIFO,使用 ReentrantLock 和两个 Condition 对象完成加锁和阻塞的动作。
    ExecutorService fixedThreadPool = new ThreadPoolExecutor(6, 10, 60L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(18));
            for (int i = 0; i < 100; i++) {
                int finalI = i;
                fixedThreadPool.execute(new Runnable(){
                    @Override
                    public void run() {
                        System.out.println(finalI+"fixedThreadPool "+Thread.currentThread().getName());
    
                        try {
                            Thread.sleep(50000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                    }
                });
            }
    print:
    RejectedExecutionException.....
    1fixedThreadPool pool-1-thread-2
    3fixedThreadPool pool-1-thread-4
    5fixedThreadPool pool-1-thread-6
    25fixedThreadPool pool-1-thread-8
    27fixedThreadPool pool-1-thread-10
    2fixedThreadPool pool-1-thread-3
    0fixedThreadPool pool-1-thread-1
    4fixedThreadPool pool-1-thread-5
    26fixedThreadPool pool-1-thread-9
    24fixedThreadPool pool-1-thread-7
    
    • PriorityBlockingQueue:支持优先级排序的无界阻塞队列,基于数组的二叉堆实现。添加元素时,如果容量不足会使用 tryGrow 进行扩容。

    • DelayQueue:支持延迟获取元素的无界阻塞队列,队列内元素必须实现 Delayed 接口(Delay接口又继承了 Comparable,需要实现 compareTo 方法)。每个元素都需要指明过期时间,通过 getDelay(unit) 获取元素剩余时间(剩余时间 = 到期时间 - 当前时间)
      当从队列获取元素时,只有过期的元素才会出队列。

    • LinkedTransferQueue:由链表组成的无界 TransferQueue

    • LinkedBlockingDeque:由链表构成的界限可选的双端阻塞队列,如不指定边界,则为 Integer.MAX_VALUE。

    ThreadFactory threadFactory

    创建线程的方式,这是一个接口,你new他的时候需要实现他的Thread newThread(Runnable r)方法

    RejectedExecutionHandler handler

    当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理;

    jdk1.5 后提供了四种饱和策略 :

    • AbortPolicy :默认。直接抛异常(RejectedExecutionException)。

    • CallerRunsPolicy :只用调用者所在的线程执行任务,重试添加当前的任务,它会自动重复调用execute()方法

    • DiscardOldestPolicy :丢弃任务队列中最久的任务。

    • DiscardPolicy :丢弃当前任务。

  • 您还可以看一下 贪吃蛇学院老师的Java学习路线,好的学习路线和好的方法,能让我们少走些弯路课程中的 Java学习路线,好的学习路线和好的方法,能让我们少走些弯路小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对问题,具体步骤如下:

    1. 确定需求:根据问题描述,需要考虑学校、小学、中学、中专、大学之间的关系,因此需要确定需要查询的数据源和需要展示的查询结果。
    2. 设计数据库结构:根据需求,可以设计一个学校表和一个类型表,类型表分别包括小学、中学、中专和大学,学校表中需要包括名称、类型和地点等信息。
    3. 实现查询服务:实现一个通用的查询服务,这个服务应该支持按学校名、类型和地点进行查询,同时支持模糊查询,如查询类型为“中学”的所有学校。
    4. 设计接口:设计查询服务的接口,包括输入参数和返回结果。
    5. 编写Java项目代码:基于上述设计,编写Java代码来实现查询服务,可以使用JDBC连接数据库,将查询结果返回给用户。
    6. 优化性能:针对Java编程语言的优缺点,可以采用一些优化措施,如减少数据库的查询次数,优化代码以提高查询效率等。

    参考代码如下:

    1. 数据库结构设计
    CREATE TABLE school (
      id INT(11) NOT NULL AUTO_INCREMENT,
      name VARCHAR(50) NOT NULL,
      type VARCHAR(50) NOT NULL,
      location VARCHAR(100) NOT NULL,
      PRIMARY KEY (id)
    );
    
    1. 查询服务实现
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class SchoolQueryService {
        private static final String DB_URL = "jdbc:mysql://localhost:3306/school_db";
        private static final String DB_USER = "root";
        private static final String DB_PASS = "root";
    
        // 查询学校列表
        public List<School> querySchools(String name, String type, String location) throws SQLException {
            List<School> schools = new ArrayList<>();
            Connection conn = null;
            PreparedStatement stmt = null;
            ResultSet rs = null;
    
            try {
                conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
                StringBuilder sb = new StringBuilder("SELECT * FROM school WHERE 1 ");
                List<Object> params = new ArrayList<>();
                if (name != null && !name.isEmpty()) {
                    sb.append("AND name like ? ");
                    params.add("%" + name + "%");
                }
                if (type != null && !type.isEmpty()) {
                    sb.append("AND type = ? ");
                    params.add(type);
                }
                if (location != null && !location.isEmpty()) {
                    sb.append("AND location like ? ");
                    params.add("%" + location + "%");
                }
                stmt = conn.prepareStatement(sb.toString());
                for (int i = 0; i < params.size(); i++) {
                    stmt.setObject(i + 1, params.get(i));
                }
                rs = stmt.executeQuery();
                while (rs.next()) {
                    schools.add(new School(rs.getString("name"), rs.getString("type"), rs.getString("location")));
                }
            } finally {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            }
            return schools;
        }
    }
    
    class School {
        private String name;
        private String type;
        private String location;
    
        public School(String name, String type, String location) {
            this.name = name;
            this.type = type;
            this.location = location;
        }
        // 省略getter、setter方法
    }
    
    1. 设计接口
    public class SchoolQueryController {
        private SchoolQueryService service = new SchoolQueryService();
    
        // 查询学校列表
        public List<School> querySchools(String name, String type, String location) throws SQLException {
            return service.querySchools(name, type, location);
        }
    }
    
    1. 编写Java项目代码
    import java.sql.SQLException;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            SchoolQueryController controller = new SchoolQueryController();
            try {
                List<School> schools = controller.querySchools("北京", "中学", "海淀");
                for (School school : schools) {
                    System.out.println(school.getName());
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    1. 优化性能

    可以采取以下措施来优化查询性能:

    • 尽量避免使用SELECT *,只查询需要的字段;
    • 给数据库中的字段添加索引,可以提高查询效率;
    • 合理利用缓存,可以减少数据库查询的次数。

    总之,针对这个问题,需要从需求确定开始,设计数据库结构和接口,编写Java代码来实现查询服务,并优化性能以提高查询效率。