前言:
這幾天看了Java的基本語法和一些特性,今天就比較下和OC與C的不同點,方便自己記憶。
一、基本語法
先從最大的不同點開始,在Java中一個.java文件相當于OC/C的.h和.m,Java類的屬性、方法都在一個代碼塊中,比如下面這段代碼
public class Animal {//Animal類
//屬性
String name;
//屬性的getter與setter方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
//實例方法
public void eatFood(){
System.out.println(this.name + "吃飯");
}
//方法的重載
public void eatFood(String foodName) {
System.out.println(this.name + foodName);
}
@Override
public String toString(){
return "12345678";
}
}
而不同于OC的語法,把屬性、方法等的聲明與實現(xiàn)分割到.h與.m文件中,不過據(jù)我所知,C++、C#等高級語言在這塊和Java如出一致,也許只有OC秉承著C的精神還把聲明與實現(xiàn)分成兩個文件。
1.權限修飾符
在OC中我們通過public、private、protected和default(缺?。?/code>的修飾符確定屬性的權限,方法通過是否在.h中聲明來區(qū)分是否可以被別的類調用。而在Java中,public、private、protected不僅可以確定屬性的權限,還可以確定類與方法的權限。
對于屬性和方法而言,修飾符確定的權限如下:
| 修飾符 | 類內部 | 同一個包 | 子類 | 任何地方 |
|---|---|---|---|---|
| private | YES | |||
| default | YES | YES | ||
| protected | YES | YES | YES | |
| public | YES | YES | YES | YES |
對于類而言只能使用public或default,public可以在任何地方被訪問(前提當然是引用類所在的包),default只可以被同一個包內部的類訪問。
2.運算符與條件判斷語句
這兩個放一塊說是因為基本上和OC一樣,只是Java的switch語句可以以字符串作為判斷條件。數(shù)組上也和C語言一致,在初始化的時候大小就固定,不能在擴充。
3.重載
這是OC與Java很大的一個不同點,因為OC是沒有重載這個概念的,在Java中同一個類中滿足、方法名相同、參數(shù)列表不同這三個條件就構成重載,比如下面這個兩個方法,一個無參,一個有個String類型的參數(shù),個人覺得很實用:
public void eatFood(){
System.out.println(this.name + "吃飯");
}
public void eatFood(String foodName) {
System.out.println(this.name + foodName);
}
4.this與super
這里和OC很像,this表示調用this所在代碼塊的對象,和OC中的self一致,super表示調用super所在代碼塊的對象的父對象,和OC中的super一致。
5.其他一些諸如局部變量、形參、實參等概念據(jù)我所知的幾種語言是一致的,在此不在贅述
二、類的成員
1.類的屬性
在第一段代碼和上述的描述中我們可以看到類的屬性和OC一樣,有getter與setter方法,需要注意的是直接調用屬性是不會走getter或setter方法的,需要手動的去調用getter與setter方法,也許是因為Java沒有OC中@property自動合成_屬性而導致這樣設計的原因吧。
2.類方法與實例方法
在Java中,類方法通過static聲明,比如下面的代碼
public class Animal {//Animal類
//實例方法
public void eatFood(String foodName) {
System.out.println(this.name + foodName);
}
//類方法
public static void eat(String foodName) {
System.out.println(foodName);
}
}
在調用上也和OC非常相似,OC通過[對象 消息]調用方法,而Java通過對象.消息調用方法
public class TestAnimal {
public static void main(String args[]){
Animal animal = new Dog();
animal.eatFood();
animal.eatFood("骨頭");
Animal.eat("骨頭");
}
}
3.構造器
乍看上去很高端的樣子,其實和OC中alloc] init]的作用是一致的,為對象分配內存空間與初始化,語法是這樣的,比如Animal類的構造器為public Animal(),每個類默認有無參的構造器,有參的構造器可以是這樣的public Animal(String name),多個構造器之間構成重載。
三、面向對象的特征性
我們都知道OOP有三大特征性:封裝、繼承與多態(tài),那么Java相比OC有什么不同呢?先拋出結論,個人覺得是沒什么區(qū)別的,個人認為封裝、繼承與多態(tài)更側重于思想,而不局限于語言,語法上雖然有點區(qū)別,但是只是表面上不同罷了。
1.封裝
Java中有個包(package)的概念倒值得一說,為了更好地組織類,Java 提供了包機制,和C++的命名空間有點類似。通常Javaer把功能相似或相關的類或接口組織在同一個包中,方便類的查找和使用。不同的包中的類的名字是可以相同的,這相比于OC而言,實在是個很大的亮點。
2.繼承
Java通過 class Dog extends Animal來實現(xiàn)繼承,Dog類繼承于Animal類,和OC一樣,Java中的父類引用也可以指向子類對象,子類繼承父類公開的屬性和方法,并且Java也支持單繼承,OC通過擴展與類別解決OC單繼承的局限性,而Java通過接口解決單繼承的局限性,23333。
3.多態(tài)
什么是多態(tài),當編譯時的類型與運行時的類型不一致,就會出現(xiàn)多態(tài),子類對象可以通過父類引用可以調用父類被重寫的方法,應用上非常廣泛。
總結:
這幾天差不多就看了這些東西吧,有些東西沒寫出來,太零散了,總得來說語法上沒多大差別,下周爭取說一些Java特有的東西。