java不少语法都跟C#相似,下面列举一些不一样的地方******注意***** java中的系统方法首字母都是小写的,而C#中首字母都是大写的
一、java中继承的用法
class children extends parent
{
}
而c#中:
class children :parent
{
}
java中继承接口的用法
class children implements parent
{
}
而c#中:
class children :parent
{
}
二、还有一点很重要的事java中的main函数所在的类名必须和文件名相同。
其次是在一个文件中只能main函数所在的类是public修饰的,其余不能带public ,一个文件中只能有一个public类。
java中的静态成员既能够实例化对象调用,也能够类名来点出来,非静态成员只能实例化对象调用。****没有静态类
而在C#中静态成员不能实例化对象调用
三、java中方法的重写就方法的覆盖,貌似真的是覆盖,就是从新写一遍
而C#中的重写要用关键字override,而且只能是抽象和虚方法或者标记为override才能重写。
四、java中有一个特殊的static语句块功能,static语句块中的语句在构造函数以前执行且只执行一次java
五、java和C#中初始化类的时候都是先初始化变量后执行函数代码sql
六、java中final的用法:
不想让类中的成员被子类修改
修饰类的时候,被修饰的类不能被继承
变量被final修饰的时候,必须赋初值
final和const相似(只是相似)
C#中不行让类被继承能够用关键字sealed修饰(密封)
不能让子类修改,不知道用什么方法数据库
七、java中的集合
java中的ArraList集合跟C#中很类似,二者都是一样的声明方式。
1、List类型的集合
都是用的add方法(不一样的事C#中的系统方法通常首字母大写)
有一个不一样的地方是java中集合的取值方式用的事get("这里是对应的坐标")方法来取。而C#用的事跟数组同样的方法用下标取值:a[0]。
C#中的键值对集合有两种取值方法,一种是下标取值,一种是下标加键取值
java中获取集合中数量的方法是size(),而C#中用的是count()方法。
删除都是用的remove()方法,清空用的都是clear()方法。
LinkedList集合比ArrayList多了addFirst()和addLast()方法,分别指的是每次都添加在最前面或者最后面。(在有些需求的时候颇有用)
vector和ArrayList的用法基本上同样
stack和ArrayList的用法也是基本上同样(可是值得注意的事stack由于栈的特色,因此每次插入新值的时候都是插在最前面的)
2、Map类型的集合(带有键值对的集合,相似于C#中的键值对集合)
主要有Hashmap,Hashtable等
添加键值对用put()方法。
读取方法:
//取出键的视图
Iterator<String > iterator=hashMap.keySet().iterator();
//遍历全部键
while (iterator.hasNext()) {
String string = (String) iterator.next();
((animal)hashMap.get(string)).sayhi();//读取并调用方法
}
3、总结
一、若是要求线程安全,应该使用Vector、Hashtable
二、若是不要求线程安全,应该使用ArrayList、LinkedList、HashMap
三、若是要求键值对,则使用HashMap,Hashtable
四、若是数据量很大,又要线程安全考虑Vector
Java中两个字符串比较值是否相等必定要用 s1.equals(s2)方法,不能直接用==来比较,这样比较的只是字符串的引用地址。编程
4、java中子类构造函数中调用父类的构造函数用super();只能在子类的构造函数中写c#
而C#中直接在子类构造函数后面写:base()数组
例如:public son:father安全
{
son():base()
{
}
}
5、swing主要布局方式
flowLayout(流式布局)、borderLayout(边界布局)、GridLayout(网格布局)等
6、java多线程
要使用多线程的类须要继承Thread,须要继承其余类的时候,要继承Runnable接口
继承Thread的时候,启用线程的方法:
类名(继承了Thread的) th=new 类名();
th.start();
继承了Runnable接口的时候,启用线程的方法:
类名 l=new 类名();
Thread th=new Thread(l);
th.start();
thread.currentThread().getName();//用于显示当前是哪一个线程在执行(显示的事线程的下标)
防止多线程并发的方法,加上synchronized(object){须要阻止并发的代码段}(如同C#中的Block锁)服务器
7、java IO流
(1)字节流网络
1 public static void main(String[] args) throws IOException { 2 File file=new File("e:\\wode.txt");//打开文件 3 if(!file.exists()){ 4 try { 5 file.createNewFile();//建立文件 6 System.out.println("建立成功!"); 7 } catch (IOException e) { 8 e.printStackTrace(); 9 } 10 } 11 12 FileOutputStream fos=new FileOutputStream(file);//写操做 13 String string="你好啊\r\n世界!"; 14 try { 15 fos.write(string.getBytes());//写入数据 16 } catch (IOException e) { 17 e.printStackTrace(); 18 }finally{ 19 try { 20 fos.close(); 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 } 25 26 FileInputStream fis=new FileInputStream(file);//读操做 27 int n=0; 28 byte []bytes=new byte[4*1024]; 29 30 //fis.read(bytes, 0, (int) file.length());//按字节读取(一次读完) 31 //String s=new String(bytes,0,(int) file.length()); 32 //System.out.println(s); 33 34 while ((n= fis.read(bytes))!=-1) {//分块读取 35 String s=new String(bytes,0,n); 36 System.out.println(s); 37 } 38 }
(2)字符流多线程
1 public static void main(String[] args) { 2 FileReader fReader=null; //读操做 3 FileWriter fileWriter=null; //写操做 4 try { 5 fReader=new FileReader("e:\\wode.txt"); //直接读取路径 6 fileWriter=new FileWriter("e:/个人.txt"); 7 int n=0; 8 char[] c=new char[1024]; 9 while ((n=fReader.read(c))!=-1) {//循环读取,读到结尾返回-1(每次读取c的大小) 10 String s=new String(c,0,n); //将字符数组转换成字符串 11 //System.out.println(c); 12 fileWriter.write(s); //写入数据 13 System.out.println("写入成功"); 14 15 } 16 } catch (Exception e) { 17 e.printStackTrace(); 18 }finally{ 19 try { 20 fReader.close(); 21 fileWriter.close(); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } 25 } 26 }
----------------------------------
按行读写文件(提升效率)
1 public static void main(String[] args) { 2 BufferedReader bfr=null; 3 BufferedWriter bfw=null; 4 5 FileReader fileReader; 6 try { 7 fileReader = new FileReader("e:/wode.txt"); //读操做(做为 BufferedReader的构造参数) 8 bfr=new BufferedReader(fileReader); // 按行读操做 9 FileWriter fileWriter=new FileWriter("e:/个人.txt"); //写操做(做为BufferedWriter的构造参数) 10 bfw=new BufferedWriter(fileWriter); //按行写操做 11 String string=null; 12 while ((string=bfr.readLine())!=null) { //循环读每一行,读到末尾返回null 13 System.out.println(string); 14 bfw.write(string+"\r\n"); //按行写 15 } 16 } catch (Exception e) { 17 e.printStackTrace(); 18 }finally{ 19 try { 20 bfr.close(); 21 bfw.close(); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } 25 26 27 } 28 29 }
8、数据库
(1)开发时数据库的选择条件:
<1>成本
<2>功能多少
<3>并发性(最终用户多少)
<4>安全性
(2)基本查询
<1> sal between 100 and 200 //表示 sal>=100 and sal<=200
<2>like(模糊查询)
%:表示0到多个模糊字符 _;表示单个模糊字符
例如:一、查询姓李的人的名字
select name from emp where name like '李%';
二、查询名字的第二个字为明的人的名字
select name from emp where name like '_明%';
<3>查询条件是一个字段符合多个条件的时候,通常用in(批量查询)
例如:查询员工的年龄是22,25,31岁的员工的姓名
select name fron emp where age in(22,25,31);
<4>判断字段内容为null时返回指定的信息用isnull()函数
isnull(age,0); //这句话表示当age不为null时就返回实际的值,当为null时就返回0
<5>使用 Oder by 进行排序
order by age asc //默认升序
order by age desc //降序排列
例子:按照部门号升序,工资降序排列
select * from emp order by dempno asc ,sal desc;
<6> group by having
having 是用来筛选group by 分组后的数据
**在选择列中若是有列、表达式、分组函数,那么这些列和表达式必须有一个出如今group by子句中,不然就会出错!
<7>经典案例
--显示公司每一个员工的名字和她的上级的名字
//这里能够把emp表当作两张表,分别是worker、boss
select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno
<8>分页查询
//这里的num1指的是每一页显示的行数,num2指的是第几页
select top num1 * from emp where empno not in (select top num1*num2 from emp);
<8>***疯狂在一个表中插入数据
insert into test(name,pass) select name,pass from test
insert into test select name,pass from test
<9>删除表中的重复记录
select distinct * into #temp from testTable
delete from tsetTable
insert into tsetTable select * from #temp
drop table #temp
<unique>惟一约束,不能重复,能够为null
<check>范围约束
<default>默认值
<foreign key>外键 用法:foreign key reference table2(id)
(3)备份、恢复数据库
备份:
backup database 要备份的数据库名字 to disk='路径';
恢复:
restore database 数据库名 from disk='路径'
9、JDBC
(1)演示使用JDBC-odbc桥接方式链接数据库cakesales
<1>配置数据源(在控制面板→管理工具→odbc配置工具里面)
<2>在程序中去链接数据源
*************一、使用Statement的方式*************************************
***代码以下****
1 Connection con=null; 2 Statement sm=null; 3 ResultSet rSet=null; 4 try { 5 // 一、加载驱动(做用是把须要的驱动程序加入内存) 6 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 7 //二、获得链接 8 con=DriverManager.getConnection("jdbc:odbc:MySqlSever", "sa", "920606"); 9 10 //三、建立Statement或者PreparedStatement[区别] 11 //Statement用处是:主要用于发送sql语句到数据库 12 sm=con.createStatement(); 13 14 //四、执行crud(增删改查) 15 16 //增长 17 //int i=sm.executeUpdate("insert into cakecategory values('小蛋糕',1)"); 18 19 //删除 20 //int i=sm.executeUpdate("delete from cakecategory where CGname='小蛋糕'"); 21 22 //更新 23 //int i=sm.executeUpdate("update cakecategory set CGname='蛋糕' where CGname='小蛋糕'"); 24 25 //System.out.println(i); 26 27 28 //查询表信息 29 rSet=sm.executeQuery("select * from cakecategory"); 30 while (rSet.next()) { 31 int id=rSet.getInt(1); 32 String name=rSet.getString(2); 33 int state=rSet.getInt(3); 34 System.out.println(id+"\t"+name+"\t"+state); 35 } 36 37 } catch (Exception e) { 38 // TODO Auto-generated catch block 39 e.printStackTrace(); 40 }finally{ 41 try { 42 if(rSet!=null) 43 rSet.close(); 44 if(sm!=null) 45 sm.close(); 46 if(con!=null) 47 con.close(); 48 } catch (SQLException e) { 49 // TODO Auto-generated catch block 50 e.printStackTrace(); 51 }
*************一、使用PreparedStatement的方式*************************************
****此方法有如下有点
1>效率有所提升(由于对sql语句进行了预编译)
2>防止sql注入
***代码以下****
1 Connection connection=null; 2 PreparedStatement ps=null; 3 ResultSet rSet=null; 4 5 try { 6 //一、引入驱动 7 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 8 //二、建立链接 9 connection=DriverManager.getConnection("jdbc:odbc:MySqlSever", "sa", "920606"); 10 //三、建立PreparedStatement对象 11 ps=connection.prepareStatement("select * from cakecategory where CGname=?"); 12 ps.setString(1, "蛋糕"); 13 14 //四、获取结果集 15 rSet=ps.executeQuery(); 16 17 //五、循环读取 18 while (rSet.next()) { 19 int id=rSet.getInt(1); 20 String name=rSet.getString(2); 21 int state=rSet.getInt(3); 22 System.out.println(id+"\t"+name+"\t"+state); 23 } 24 } catch (Exception e) { 25 // TODO: handle exception 26 e.printStackTrace(); 27 }finally{ 28 try { 29 if(rSet!=null) 30 rSet.close(); 31 if(ps!=null) 32 ps.close(); 33 if(connection!=null) 34 connection.close(); 35 } catch (SQLException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 }
(2)演示使用JDBC直接链接数据库cakesales
1>不用配置数据源,直接代码链接
2>此种方法须要引入外部的三个jar包,操做以下:
选中项目 右键-> 选择属性->选择java构建路径->选择 库 ->选择添加 而后导入三个驱动文件便可(msbase.jar 、 mssqlserver.jar 、 msutil.jar)
3>遇到几个典型的错误,以下
1)java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
这个缘由是由于没有打开sqlserver的监听端口致使的,解决方法以下:
*****选中计算机右键—>管理—>服务和应用程序—>sql server管理器—>sql server 网络配置—>MSSQLSERVER协议—>TCP/IP—>IP 地址 就能够看见了
2)java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'cakecategory' 无效。
这是因为SQLSERVER账号的默认数据库致使的。若是使用的库不是当前账号的默认库的话,就会找不到表
解决方法:1、把账号的默认数据库改成要查询的库
修改方法:打开数据库,在左侧菜单栏->安全性->登陆名->sa 右键 属性 找到下面的默认数据库修改为要用的就好了
2、在执行查询前先执行“use xxx”语句
*****推荐使用第二种解决方法!
*********************实例代码以下**********************************
1 Connection con=null; 2 PreparedStatement ps=null; 3 ResultSet rSet=null; 4 5 6 try { 7 //一、引入驱动 8 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 9 //二、建立链接 10 con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;database=CakeSales","sa","920606"); 11 12 //三、建立preparedStatement对象 13 ps=con.prepareStatement("use CakeSales select * from cakecategory"); 14 //ps.setString(1, "蛋糕"); 15 16 //四、接收结果集 17 rSet=ps.executeQuery(); 18 //五、循环读取数据 19 while (rSet.next()) { 20 int id=rSet.getInt("CGid"); 21 String name=rSet.getString(2); 22 int state=rSet.getInt(3); 23 System.out.println(id+"\t"+name+"\t"+state); 24 } 25 } catch (Exception e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 }finally{ 29 try { 30 if(rSet!=null) 31 rSet.close(); 32 if(ps!=null) 33 ps.close(); 34 if(con!=null) 35 con.close(); 36 } catch (SQLException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } 40 }
(3)演示使用JDBC直接链接数据库进行ddl操做(也就是新建,删除,备份,恢复数据库)
******************************实例代码以下******************************
1 Connection con=null; 2 PreparedStatement ps=null; 3 try { 4 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 5 //不指定数据库链接 6 //con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;", "sa", "920606"); 7 con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;database=xinjiande", "sa", "920606"); 8 9 //新建数据库 10 //ps=con.prepareStatement("create database xinjiande"); 11 12 //新建表 13 //ps=con.prepareStatement("use xinjiande create table users(uid int primary key identity(1,1))"); 14 15 16 //删除表 17 //ps=con.prepareStatement("use xinjiande drop table users"); 18 19 //删除数据库 20 ps=con.prepareStatement("drop database xinjiande"); 21 22 //备份数据库 23 24 //ps=con.prepareStatement("backup database xinjiande to disk='e:/xinjiande.bak'"); 25 26 //恢复数据库 27 //ps=con.prepareStatement("restore database xinjiande from disk='e:/xinjiande.bak'"); 28 29 if(!ps.execute()){ 30 System.out.println("ok"); 31 } 32 } catch (Exception e) { 33 // TODO: handle exception 34 e.printStackTrace(); 35 }finally{ 36 try { 37 if(ps!=null){ 38 ps.close(); 39 } 40 if(con!=null){ 41 con.close(); 42 } 43 } catch (SQLException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 }
10、java中的可变参数
关键字:...(没错,就是三个点。好像C语言中也是三个点)
例子:下面是我下的链接数据库的可变参数
1 public sqlHelper(String sql,String ...strings){ 2 try { 3 this.sql=sql; 4 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 5 con=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;database=javaTset", "sa", "920606"); 6 ps=con.prepareStatement(sql); 7 if(strings!=null){ 8 int i=1; 9 for(String s:strings){ 10 ps.setString(i, s); 11 i++; 12 } 13 } 14 } catch (Exception e) { 15 // TODO: handle exception 16 e.printStackTrace(); 17 } 18 }
****c#中的可变参数用的是parameter关键字
11、java网络编程
和C#中的网络编程Socket差很少
1>服务器端代码及过程以下: 先创建ServerSocket监听->而后等待客户端链接->以后读取客户端发来的消息或者向客户端发送消息
1 try { 2 //开始监听 3 ServerSocket ss=new ServerSocket(9999); 4 //等待客户端链接 5 Socket socket=ss.accept(); 6 7 //读取客户端发来的消息 8 BufferedReader bfr=new BufferedReader(new InputStreamReader(socket.getInputStream())); 9 10 //向客户端发消息 11 PrintWriter pWriter=new PrintWriter(socket.getOutputStream(),true); 12 13 Scanner scanner=new Scanner(System.in); 14 while (true) { 15 16 String string=bfr.readLine();//读取消息 17 System.out.println(string); 18 19 20 String s=scanner.next();//接收控制台输入 21 pWriter.println(s);//发送消息 22 23 24 } 25 26 } catch (IOException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 }
2>客户端代码及过程以下: 先链接服务器->以后读取服务器发来的消息或者向服务器发送消息
1 try { 2 Socket socket=new Socket("127.0.0.1", 9999);//链接服务器 3 4 //发送消息 5 PrintWriter pWriter=new PrintWriter(socket.getOutputStream(),true); 6 //读取客户端发来的消息 7 BufferedReader bReader=new BufferedReader(new InputStreamReader(socket.getInputStream())); 8 9 Scanner scanner=new Scanner(System.in); 10 while (true) { 11 //发送消息 12 String s=scanner.next(); 13 pWriter.println(s); 14 15 16 //读取消息 17 String string=bReader.readLine(); 18 System.out.println(string); 19 20 } 21 22 } catch (Exception e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 }
3>*****对象流传输例子以下,发送用的是ObjectOutputStream,接收用的是ObjectInputStream
*********************注意:对象必需要继承Serializable序列化接口***************************************
1 public class conSK { 2 public static Socket sk; 3 ObjectOutputStream oop; 4 public conSK(){ 5 System.out.println("gr"); 6 try { 7 sk=new Socket("127.0.0.1", 9999); 8 9 } catch (Exception e) { 10 // TODO Auto-generated catch block 11 e.printStackTrace(); 12 } 13 } 14 15 /** 16 * 向服务器发送数据 17 * @param object 18 */ 19 public void sendMsg(Object object){ 20 try { 21 oop=new ObjectOutputStream(sk.getOutputStream()); 22 oop.writeObject(object); 23 //System.out.println(((User)object).getPwd()); 24 } catch (IOException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 } 29 30 31 /** 32 * 接收服务器发过来的消息 33 * @return 返回Object类型 34 */ 35 public Object getMsg(){ 36 Object object =null; 37 try { 38 ObjectInputStream oop=new ObjectInputStream(sk.getInputStream()); 39 object=oop.readObject(); 40 } catch (Exception e) { 41 // TODO Auto-generated catch block 42 e.printStackTrace(); 43 } 44 return object; 45 } 46 }