Java 面向物件基礎 以及進階知識 總結
Controlling Access to Members of a Class.
private: 僅僅可以在自己的類中使用
public: 哪裡都可以用
protected: package-private 就是在同一個包下都可以使用,並且在別的包下繼承他的子類中也可以使用。
no-modifier: package-private 只能在同一個包下使用( 對於同一包下 與protected 相同)。在別的包不行。
Overriding 重寫和 Overloadding 過載
Overriding: 是用於子類與父類之間,除了函式體變化外其他的全部不變。且子類overriding的access controller 不能高於父類。
Overloadding: 是對於同類中,方法之間。 引數列表必須改變,返回型別可以改變或不改變。
Polymorphism 多型
大體上可以理解為
ParentClass obj = new ChindClass(); //A
ChildClass obj2 = new ChildClass(); //B
ChildClass obj3 = new ParentClass(); //C 錯誤例子
交給大家一個竅門,為什麼會有這個設定。對於A, 我們聲明瞭ParentClass那麼我們就相當於在記憶體中給ParentClass中的變數和方法分別開了房間, 當我們new 的時候,就比如實際來了人 來了ChildClass, 因為ChildClass中的變數 和 方法數量一定是 大於或者等於ParentClass中的,所以我們之前開的房間都住滿了,那麼酒店很開心,訂了多少住了多少。 對於C中, 我們預定了ChildClass中的變數和方法的房間,但是實際來的人是ParentClass,數量明顯小於ChildParent中的人,那麼訂的住不滿,酒店就很生氣,給你報了錯。
overriding and overloadding 是多型的重要體現形式。
Abstract Class 抽象類
abstract class 能含有或者不含有 abstract函式, abstract 函式必須用 abstract 關鍵字來修飾。
只要一個類含有一個abstract 函式那麼就必須對這個類使用abstract 關鍵字來修飾。相同的在它的子類中。
Interface 介面
介面就是比abstract 類更極端的東西。它裡面的所有方法必須都是 abstract 方法, 不能含有instance field, 對於所有的constant 比如int等必須是 static 和 final的。
implement 它的必須是 實現所有的abstract方法就和abstract 一樣了。
Java Advanced Knowledge
Generic Class
很簡單通過下面的例子很明顯。比如arraylist或者hashmap中都是generic的。
package Generic;
//generic class
public class GenericMethodTest< A,Z > {
//generic variable
public A a;
public void setA( A a) {
this.a = a;
}
//generic methods
public A getA () {
return this.a;
}
public void printArray ( Z[] inArray) {
for ( Z temp : inArray) {
System.out.println(temp);
}
}
public static < B > void printArray_2 (B[] inArray) {
for (B temp : inArray) {
System.out.println(temp);
}
}
}
package Implement;
import Generic.GenericMethodTest;
public class a{
public static void main (String[] args) {
GenericMethodTest<Integer,String> gm = new GenericMethodTest<Integer,String>() ;
gm.setA(10);
String[] ss = {"aaa", "bbb", "ccc"};
Double [] bb = {1.0, 2.0, 3.0};
gm.printArray(ss);
gm.printArray_2(ss);
gm.printArray_2(bb);
}
}
Serialize 序列化
序列化簡單來講就是轉變存在的 例項化的物件 轉化成 byte陣列的 一種技術或者過程。它有很多好處,請看。
http://stackoverflow.com/questions/2232759/what-is-the-purpose-of-serialization-in-java
簡單的序列化,可以根據下面的程式碼來學習下。
注意: 對於一些我們不想序列化的 區域 我們可以使用關鍵字 transient 來修飾。
package Serialize;
import java.io.*;
public class Employee implements Serializable{
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck (){
System.out.println("Mailing a check to "+ name + " " + address);
}
}
package Serialize;
import java.io.*;
public class SerializeDemo {
public static void main (String[] args) {
Employee e = new Employee();
e.name = "Reyan df";
e.address = "New York, ManhaThan";
e.SSN = 1234433224;
e.number = 101;
try {
FileOutputStream fileOut =
new FileOutputStream ("/Users/huazhe/Desktop/demo.ser");
ObjectOutputStream out = new ObjectOutputStream (fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.println("Serialization done...");
} catch (IOException i){
System.out.println(i);
}
}
}
package Serialize;
import java.io.*;
public class DeserializaDemo {
public static void main (String[] args) {
Employee e = null;
try {
FileInputStream fileIn = new FileInputStream("/Users/huazhe/Desktop/demo.ser");
ObjectInputStream in = new ObjectInputStream (fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
System.out.println(i);
} catch (ClassNotFoundException c) {
System.out.println(c);
}
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
}
}
multithreading 多執行緒
用的不多,用的時候再看。謝謝。
有問題歡迎指出。