Java 物件導向基礎 以及進階知識 總結

殷老實發表於2016-10-07

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 多執行緒

用的不多,用的時候再看。謝謝。



有問題歡迎指出。




相關文章