厚积薄发

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

本文是在学习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面向对象的基本思想是一致的,只是在实现细节上区别比较大。

posted on 2013-05-02 11:57  孤单颂  阅读(405)  评论(0)    收藏  举报