JavaとC#のひっかりやすい違い
C#使用者がJavaを使用するにあたり、ひっかかりやすい違いをまとめる
ここでの違いは全ての違いを網羅しているわけではないので、
用法要領を守り正しくお使いください。
Javaのprivate はpublicの内部クラスでしか使えない
java.java
public class MyClass {
// このクラスは public なので他のパッケージからもアクセス可能
private class PrivateClass {
}
}
class DefaultClass {
// このクラスはデフォルトアクセスなので同じパッケージ内のみでアクセス可能
}
C#.cs
// Program.cs
namespace TestApp
{
public class MyClass
{
}
private class PrivatelClass
{
//C#はprivateで内部クラスが定義できる
}
}
Javaは名前空間はpackageを利用
java.java
package test.pg;
public class MyClass {
public void sayHello() {
System.out.println("Hello from MyClass in package test.pg");
}
}
C#.cs
namespace TestApp
{
public class MyClass
{
public void SayHello()
{
Console.WriteLine("Hello from MyClass in namespace TestApp");
}
}
}
JavaはGetSetがない
java.java
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
C#.cs
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
オーバーロードとオーバーライド
オーバーロードはC#同じと考えて問題なし。
オーバーライドの違い
@Overrideを付ける
java.java
class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}
C#.cs
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Animal sound");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Bark");
}
}
Javaはイベントとデリゲートが、ない
リスナーで実装する
java.java
interface ButtonClickListener {
void onClick();
}
class Button {
private ButtonClickListener listener;
public void setClickListener(ButtonClickListener listener) {
this.listener = listener;
}
public void click() {
if (listener != null) {
listener.onClick();
}
}
}
C#.cs
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Animal sound");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Bark");
}
}
Javaのメモリは自動でクリーンアップされる。
Javaはガーベッジコレクタによって自動的にクリーンアップされる
20240827追記.
Javaでもtry-with-resources文を使用しメモリを明示的に解放できる仕組みがある。
C#の場合メモリを明示的に管理できる仕組みが言語レベルで存在する。
C#.cs
using System;
class Resource : IDisposable
{
public void Dispose()
{
// リソースのクリーンアップコード
Console.WriteLine("Resource cleaned up");
}
}
class Program
{
static void Main()
{
using (Resource res = new Resource())
{
// リソースを使用
}
// 自動的にDisposeが呼ばれる
}
}