阿瑟 發表
Java的物件導向和C++在絕大部分都是相同的, 然而在Java中, 物件導向又多了許多的設計方式可以使用.
C++中的物件導向理念有三大要領: 繼承, 多態 與 封裝.
繼承 (Inheritance) 讓一個新的類別可以繼承其他類別的內容 (屬性與方法)
註: 在物件/類別中的變數叫屬性 (Attribute), 函式叫方法 (Method)
多態 (Polymorphism) 可以讓多個不同的類別用統一的方式進行存取
封裝 (Encapsulation) 可以隱藏程式內部的運作, 讓使用者只接觸到一個使用者介面
在Java中也是如此.
而Java中的類別繼承語法和C++只有些許的不同:
class A
{
...內容
}
class B extends A
{
...內容
}
差別就只有那個 extends 關鍵字而已.
在Java中, 除了一般的類別繼承, 還有一種特別的繼承方式: 介面 (interface).
Interface的作用本身是提供多個類別同樣的一個存取方式, 例:
interface Car
{
public void PrintInfo();
}
class Mercedes implements Car
{
public void PrintInfo()
{
System.out.println("=====Mercedes=====\n");
}
}
class Honda implements Car
{
public void PrintInfo()
{
System.out.println("=====Honda=====\n");
}
}
public class TestProgram
{
public static void main(String[] args)
{
Mercedes M = new Mercedes();
Honda H = new Honda();
M.PrintInfo();
H.PrintInfo();
}
}
在這個範例中, Mercedes 與 Honda 兩個類別的實體都有同樣的方法, 而執行結果則各不相同.
interface Test extends A, B, C....
{
...內容...
}
剛剛上面以介面寫的範例, 也可以用抽象類別來達成.
抽象類別是只有方法標頭的類別, 因此可以讓其子類別擁有同樣的方法名稱, 效果與介面十分的類似, 例:
abstract class Car
{
public abstract void PrintInfo();
}
class Mercedes extends Car
{
public void PrintInfo()
{
System.out.println("=====Mercedes=====\n");
}
}
class Honda extends Car
{
public void PrintInfo()
{
System.out.println("=====Honda=====\n");
}
}
public class AbstractClass
{
public static void main(String[] args)
{
Mercedes M = new Mercedes();
Honda H = new Honda();
M.PrintInfo();
H.PrintInfo();
}
}
在Java中撰寫類別的彈性也大大的增加了.
您可以在一個類別中撰寫另外一個類別, 這種寫法稱為 內部類別 (inner class), 例:
public class ThisAndSuper
{
class hello
{
int i = 300;
void test_this()
{
System.out.println("The value of variable i in this class is " + this.i + "\n");
}
}
public static void main(String args[])
{
ThisAndSuper t = new ThisAndSuper();
ThisAndSuper.hello h = t.new hello();
h.test_this();
}
}
在主要的類別中又有另外一個類別. 這種寫法唯一的限制就是必須先創造上層類別的實體才能夠建立內部類別的實體.
甚至在方法中都可以撰寫類別, 這種寫法叫 方法類別 (Method Class), 例:
public class TestMethod
{
void MethodA()
{
class TestB
{
public void MethodB()
{
System.out.println("===TestB.MethodB called===");
}
}
TestB b = new TestB();
b.MethodB();
}
public static void main(String args[])
{
TestMethod t = new TestMethod();
t.MethodA();
}
}
Java基本的物件導向理念與C++並沒有差太多, 但是寫法相較起來就開方多了.