本文是在学习Java的过程中写的,主要记录Java与C#两种语言的不同点,通过对比来学习Java;不对两种语言的优劣进行比较。
C#开发环境:Win7 .NET 3.5, VS2008
Java开发环境:Win7, JDK7u4, Eclipse Indigo Service Release 2
写在详细内容之前:
1、笔者是在熟悉C#的基础上学习Java的,以前也学习过C++,但是详细的语法之类的已经还给老师了;
2、此文是在学习Java的过程中编写的,对Java的研究必然不能深入;
3、既然是学习笔记,错误和不足在所难免,但是笔者会在进一步深入学习Java和C#的过程中纠正错误和进一步补充,也欢迎大家指出。
一、跨平台
两种语言都是跨平台的,它们实现跨平台的方式是类似的。C#是通过.NET CLR,Java则是通过JVM,思路是一样的,将源代码编译成中间语言,然后在各自的平台上解释运行。Java的跨平台似乎更普遍,.NET也支持其他平台,但是主要还是Windows。
二、面向对象
1. 封装
默认
C#默认:在class或者structure中,定义的变量或方法如果没有访问修饰符则默认为private;类型本身则是default,仅在同一命名空间内公开,命名空间外无法访问。
Java默认default:所有情况一致,仅在包中公开,包外不能访问。
字段封装
C#将get和set访问器整合成property,客户代码可以以访问公开数据字段的方式访问属性。
Java采用get和set访问器,eclipse提供了封装字段的重构。
Java内部类
内部类可以直接访问外部类的私有成员;
用static声明的内部类变成了外部类,不能访问非static的外部类属性。
new Outer.StaticInner().func(); // 客户代码访问静态内部类 new Outer().new Inner().func(); // 客户代码访问非静态内部类,需要外部类的一个实例
在方法中定义内部类,不能直接访问方法的参数,如果方法的参数要被内部类访问需要加上final关键字。
内部类扩展:在抽象类和接口中可以定义多个接口或抽象类。
2. 继承
关键字
| C# | Java | |
| 类继承 | : | extends |
| 接口实现 | : | implements |
| 基类关键字 | base | super |
| 终止继承链 | sealed | final |
| 向上转型判断 | is | instanceof |
Java在接口中可以定义全局常量
Java继承中的初始化,先看代码:
public class Extends {
public static void main(String[] args){
// new B()
// A --> A(), field = 1
// B --> B()
System.out.println("new B()");
new B();
// new B(1)
// A --> A(), field = 1
// B --> B(int param)
System.out.println("\nnew B(1)");
new B(1);
// new B("1")
// A --> A(int field), field = 2
// B --> B(String param)
System.out.println("\nnew B(\"1\")");
new B("1");
}
}
class A{
private int field = 1;
public A(){
// 在构造函数之前,字段已经完成初始化
System.out.println("A --> A(), field = " + field);
}
public A(int field){
this.field = field;
System.out.println("A --> A(int field), field = " + field);
}
}
class B extends A{
/* private int field_b = 2;*/
public B(){
// 执行子类的构造函数前默认会先调用父类中的无参构造函数
System.out.println("B --> B()");
}
public B(int param){
// 显示调用父类的无参构造函数,效果同上
super();
System.out.println("B --> B(int param)");
}
/* public B(int param){
super(field_b); // 编译不通过
System.out.println("B --> B(int param)");
}*/
public B(String param){
// 调用父类的非无参构造函数,不会再调用父类的无参构造函数
super(2);
System.out.println("B --> B(String param)");
}
}从代码的结果可以看出初始化的顺序:
1、父类字段初始化,如果仅是声明,则会初始化成默认值;
2、执行父类的构造函数,若没有使用super显示调用父类构造函数,则会先调用父类中的无参构造函数;
3、子类字段初始化
4、子类构造函数
3. 多态
Java不提供virtual和override关键字。
三、其他语法的比较
foreach
C# foreach (Type var in collection){}
Java for (Type var : collection){}
可变参数
C# 返回值类型 方法名称(params 类型 参数名称){}
Java 返回值类型 方法名称(类型... 参数名称){}
Java 匿名内部类
四、异常处理
Java中提供了throws关键字,异常分为 Exception 和 RuntimeException,分别代表应用程序异常和虚拟机运行异常。
断言
assert boolean表达式;
assert boolean表达式 : 详细信息;
不提倡使用断言
五、包
package org.lxh.tools:打包,会将*.class文件布局在.\org\lxh\tools\目录下
import:包导入
static import:静态导入,
打包相关命令:
jar –cvf my.jar org // 打包
jar –tvf my.jar // 查看
jar –xf my.jar // 解压缩
六、总结
C#和Java面向对象的基本思想是一致的,只是在实现细节上区别比较大。

浙公网安备 33010602011771号