题目:
题目涵盖知识内容:
1、了解接口的定义(要实现某种行为功能的时候才会定义接口,别问我为啥知道,因为珏哥教的)
2、了解实现接口,即用子类继承接口。一般情况下接口里面内容比较简单,只有自己定义的方法,但是接口方法里面不能写具体内容,所以接口自己本身没啥用,只有继承他去实现他里面的方法他才有存在的意义。而且在接口子类当中一定要实现接口的方法,不然会报错,同样需要实现的方法参数和方法名以及返回类型都得与接口里的一样,不然也会报错。
3、学会接口的使用,这里运用了多态的概念。多态这个说起来很玄乎,但是你要是用过的话就会觉得原来是这样啊。简单点说多态就是一种形式。当父类拥有多个子类,子类必定包含了父类的方法,而每个子类方法里的具体内容可能不一样,这就导致子类继承父类的相同方法功能却不相同。这个时候,不用担心同名方法功能混乱。你用父类(这个父类还可以是接口和抽象类)创建一个对象,再用某个子类去实例化它,这个父类创建的对象就带有了某种指向这个子类性质。当你用这个对象调用一个方法的时候,他不会去执行父亲里面的这个方法,更不会去执行其他子类里面相同的方法,而是会自动的去找这个实例化父类对象的子类里面的方法实现。这就是多态。
当然,我见过的多态都是在第三类的方法中实现:还是用上面的类演示,如下图:
4、掌握java对数据库操作。操作数据库首先你得有数据库,除了你用的ecplise等软件外,你还需要下载sql server 或者mysql这两种数据库软件。另外你还需要下载好JDBC 。什么是jdbc呢?简单来说就是JAVA和数据库交互的一个桥梁。JAVA可以通过他对数据库进行增删改查操作 。jdbc中有个jar包是我们需要用到的。下载好数据库软件后,将这个jar包导入到你的java项目中就行了(右键项目—Built Path—Confuguraton ..—选中上面的Libraries—Add External JARs,然后找到你下载的jdbc驱动,找到文件里的某个jar包,如mysql的连接数据库jar包为mysql-connetior-java..最后选中应用就好了)。其实我觉得这里比较麻烦的还是下载和使用软件。
然后后面的对着敲就好了。
解答解析:
题目第一点是以接口的方式传递底面积,所以要定义一个求底面积的行为:
package example; //接口,定义了一个求底面积的行为 public interface Inter { double bottom(); }
定义多个继承接口的子类:
package example; //子类一:圆柱 public class yuanzhu implements Inter{ double bian; yuanzhu(double bian){ this.bian = bian; } @Override public double bottom() { // TODO Auto-generated method stub return Math.PI * bian * bian; } }
package example; //子类:三棱柱 public class sanlengzhu implements Inter{ double a; double b; double c; sanlengzhu(double a,double b,double c){ this.a = a; this.b = b; this.c = c; } @Override public double bottom() { double p; p = (this.a+this.b+this.c)/2; double p1 = p - this.a; double p2 = p- this.b; double p3 = p - this.c; // TODO Auto-generated method stub return Math.sqrt(p*p1*p2*p3); } }
package example; //子类三:正四棱柱 public class zhisilengzhu implements Inter{ double a; double b; zhisilengzhu(double a,double b) { this.a = a; this.b = b; } @Override public double bottom() { // TODO Auto-generated method stub return a*b; } }
将底面信息传入数据库:
首先连接数据库操作,我将数据库连接和释放封装成了一个类;
package example; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; //数据库连接打包成一个类,用此类创建对象,在构造函数中传入Connection对象,即完成对数据库的连接 public class connectMyData{ private static String JDBC_DRIVER = "com.mysql.jdbc.Driver"; private static String DB_URL = "jdbc:mysql://localhost:3306/javaobject"; private static String USER = "sa"; //sa用户是我自己创建的 private static String PASS = "123456"; public static Connection getConection() { Connection conn = null; try { Class.forName(JDBC_DRIVER); conn = DriverManager.getConnection(DB_URL, USER, PASS); } catch (Exception e) { e.printStackTrace(); } return conn; } public static void close(Connection conn) { try { if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
2.这里很明显要用到多态的知识,于是再创建了一个计算体积的类,同时在里面实现多态求的底面积。
package example; //实现多态,在computerV方法中传入的参数是哪个子类型就会调用哪个子类的底面计算体积。 public class computer { double gao; computer(double gao){ this.gao = gao; } double computerV(Inter dimian){ return dimian.bottom()*gao; } }
3.创建对象,将对象信息存到数据库,再取出信息对对象进行属性进行赋值(信息重建),最后通过去取出的信息构建好对象之后计算体积:
package example; import java.sql.*; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class use { //主函数入口 public static void main(String[] args) { // TODO Auto-generated method stub yuanzhu yz = new yuanzhu(3); //创建一个圆柱底面对象 sanlengzhu slz = new sanlengzhu(1,2,3);//创建一个三棱柱底面对象,很明显两边之和不大于第三边,下面体积答案会是0. zhisilengzhu zslz = new zhisilengzhu(1,2);//创建一个直四棱柱底面对象 yuanzhu yz_2 = null; //创建三个需要从数据库获取信息对其进行插入数据的底面对象 sanlengzhu slz_2 =null; zhisilengzhu zslz_2 =null; //连接数据库需要创建的三个接口对象 Connection conn = null; PreparedStatement preStmt = null; ResultSet rs = null; //下面是数据库操作,包含连接数据库,插入对象数据,获取对象数据 try { //连接数据库对象 conn = connectMyData.getConection(); // 执行向数据库插入圆柱底面对象yz String insertYuanZhu_yz = "insert into yuanzhu(objectname,bian) values(?,?)"; preStmt = conn.prepareStatement(insertYuanZhu_yz); preStmt.setString(1, "yz"); preStmt.setDouble(2, yz.bian); int result1 = preStmt.executeUpdate(); if(result1 > 0) System.out.println("数据库插入圆柱柱底面对象yz成功!!!"); else System.out.println("插入数据库失败"); //执行向数据库插入三棱柱底面对象slz String insertSanLengZhu_slz ="insert into sanlengzhu(objectname,a,b,c) values(?,?,?,?)"; preStmt = conn.prepareStatement(insertSanLengZhu_slz); preStmt.setString(1, "slz"); preStmt.setDouble(2, slz.a); preStmt.setDouble(3, slz.b); preStmt.setDouble(4, slz.c); int result2 = preStmt.executeUpdate(); if(result2 > 0) System.out.println("数据库插入三棱柱底面对象slz成功!!!"); //执行向数据库插入直四棱柱底面对象zslz String insertZhiSiLengZhu_zslz ="insert into zhisilengzhu(objectname,a,b) values(?,?,?)"; preStmt = conn.prepareStatement(insertZhiSiLengZhu_zslz); preStmt.setString(1, "zslz"); preStmt.setDouble(2, slz.a); preStmt.setDouble(3, slz.b); int result3 = preStmt.executeUpdate(); if(result3 > 0) System.out.println("数据库插入直四棱柱底面对象zslz成功!!!!"); else System.out.println("插入失败"); //执行向数据库查询获取曾经叫yz的圆柱底面对象信息 String selectYuanZhu1 = "select bian from yuanzhu where objectname='yz'"; preStmt = conn.prepareStatement(selectYuanZhu1); rs = preStmt.executeQuery(); // 展开结果集数据库,用取出三棱柱对象slz的信息对slz_2对象属性赋值 //System.out.println(rs.getRow());判断数据指针到哪一条,从0开始 while(rs.next()){ // 通过字段检索 double bian = rs.getDouble("bian"); // 赋值 yz_2 = new yuanzhu(bian); System.out.println("输出一下yz_2的边:"+yz_2.bian); } //执行向数据库查询曾经叫slz的底面对象信息 String selectSanLengZhu1 = "select a,b,c from sanlengzhu where objectname='slz'"; preStmt = conn.prepareStatement(selectSanLengZhu1); rs = preStmt.executeQuery(selectSanLengZhu1); while(rs.next()) { double a = rs.getDouble("a"); double b = rs.getDouble("b"); double c = rs.getDouble("c"); slz_2 = new sanlengzhu(a,b,c); System.out.println("输出一下slz_2的边a:"+slz.a); } //执行向数据库查询并获取曾经叫zslz的底面对象信息 String selectZhiSiLengZhu1 = "select a,b from zhisilengzhu where objectname='zslz'"; preStmt =conn.prepareStatement(selectZhiSiLengZhu1); rs = preStmt.executeQuery(selectZhiSiLengZhu1); while(rs.next()) { double a = rs.getDouble("a"); double b = rs.getDouble("b"); zslz_2 = new zhisilengzhu(a,b); System.out.println("输出一下zslz_2的边a:" + zslz_2.a); } // 完成后关闭数据库连接 rs.close(); preStmt.close(); conn.close(); }catch(SQLException se){ // 处理 JDBC 错误 se.printStackTrace(); }catch(Exception e){ // 处理 Class.forName 错误 e.printStackTrace(); //这些都是异常处理不用管 }finally{ // 关闭资源 try{ if(preStmt!=null) preStmt.close(); }catch(SQLException se2){ }// 什么都不做 try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } //开始用获取的数据库对象yz_2,slz_2,zslz_2来通过computer类计算三种类型柱体的体积了。 computer graphV =new computer(1);//假设柱体的高都为1 System.out.println("此圆柱的体积为:"+graphV.computerV(yz_2)); System.out.println("此三棱柱的体积为:"+graphV.computerV(slz_2)); System.out.println("此直四棱柱的体积为:"+graphV.computerV(zslz_2)); } }
控制台最后运行结果:
数据库我用的是mysql 5.6版本。建议用5点多的版本,版本太新了可能你连驱动都难找,而且你的jdk不一定适合。建议使用mysql数据库,不建议用sql server,因为sql server 太大了,好慢,而且java开发多数用的是mysql资料也多。
下面是数据库创建数据库的sql语句:
create table yuanzhu(
objectname VARCHAR(20) PRIMARY KEY NOT NULL,
bian DOUBLE NOT NULL
);
create table sanlengzhu(
objectname VARCHAR(20) PRIMARY key NOT null,
a double not null,
b double not null,
c double not null
);
CREATE table zhisilengzhu(
objectname VARCHAR(20) PRIMARY key not null,
a double not null,
b double not NULL
);
数据库表结构:
运行之后表yuanzhu
运行之后表sanlengzhu
运行之后表zhisilengzhu
完结。。。。。。。。。。。。。。。。。。。。。。。。。。。。(珏哥牛批!!!)