1. 面向對象
java是門面向對象的語言,在java裏面萬物是皆對象。其實對象就是類的一個實列,有狀態有行爲。列如一條狗就是一個對象,他的狀態是它的顏色,名字品種;行爲有喫飯,跑和叫等。那麼類就很簡單了就是一類對象的總和。你可以把狗看做一個類,這個類包括哈巴狗,貴賓犬等對象;
下面通過代碼瞭解一下類和對象
package com.ge;
public class Animal { //定義了一個動物類
String name; //屬性
int age;
public void eat(){ //行爲
System.out.println("一隻活了"+age+"年的"+name+"正在喫飯");
}
}
package com.ge;
public class Test {
public static void main(String[] args) { //寫個測試類
Animal dog = new Animal(); //實列化對象 dog就是Animal這個類中的一個對象
dog.name = "狗";
dog.age = -100; //通過對象名 . 屬性 爲屬性賦值
dog.eat(); //對象.方法 操作方法
}
}
通過上面的代碼我們發現了一個弊端,我們無法控制類中的屬性,年齡怎麼能爲負數呢,因此就引出了封裝。在面向對象程式設計方法中,封裝(英語:Encapsulation)是指一種將抽象性函式接口的實現細節部份包裝、隱藏起來的方法。 封裝可以被認爲是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。
修改屬性的可見性來限制對屬性的訪問(一般限制爲private),例如:
public class Animal { //定義了一個動物類
private String name; //私有化屬性
private int age;
}
類中的屬性一旦私有化,就只能有本類才能訪問,只有提供一個取值的方法,外部通過調用這個方法才能對私有屬性進行訪問
package com.ge;
public class Animal { //定義了一個動物類
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) throws Exception{
if(age <= 0){
throw new Exception("年齡不能小於0");
}
this.age = age;
}
public void eat(){ //行爲
System.out.println("一隻活了"+age+"年的"+name+"正在喫飯");
}
}
開發中我們通過異常拋出來處理問題,這樣寫雖然能解決年齡值得問題,但是調用者並不知道是什麼類型的異常,因此就需要我們自定義一下異常了
package com.ge;
public class AgeOutofException extends Exception{
public AgeOutofException(){}
public AgeOutofException(String message){
super(message);
}
}
這樣調用着就知道是什麼異常了。
繼承,多態
java中爲什麼會出現繼承呢?
繼承是java面向對象編程技術的一塊基石,因爲它允許創建分等級層次的類。
繼承就是子類繼承父類的特徵和行爲,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行爲。 通過繼承在開發中就大量減少了我們的代碼量,就好比動物這個父類就會衍生很多狗,貓這些子類;這樣我們就可以把他們共有的部分抽取一個父類,然後子類繼承父類就能擁有父類非私有的屬性和方法了,(就好比父親積累的財富我們直接就能用一樣)
package com.ge;
public class Animal { //定義了一個動物類
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) throws Exception{
if(age <= 0){
throw new AgeOutofException("年齡需要大於0");
}
this.age = age;
}
public void eat(){ //行爲
System.out.println("一隻活了"+age+"年的"+name+"正在喫飯");
}
}
package com.ge;
public class AgeOutofException extends Exception{
public AgeOutofException(){}
public AgeOutofException(String message){
super(message);
}
}
package com.ge;
public class Dog extends Animal{
public void lookHome(){
System.out.println(getName()+"能看家");
}
}
package com.ge;
public class Cat extends Animal{
public void catchMouse(){
System.out.println("我能捕捉老鼠");
}
}
package com.ge;
public class Test {
public static void main(String[] args) { //寫個測試類
//創建個狗得對象
Dog dog = new Dog();
dog.setName("二哈");
try {
dog.setAge(1);
} catch (Exception e) {
e.printStackTrace();
}
dog.eat();
dog.lookHome();
//創鍵個貓的對象
Cat cat = new Cat();
cat.setName("狸貓");
try {
cat.setAge(2);
} catch (Exception e) {
e.printStackTrace();
}
cat.eat();
cat.catchMouse();
}
}
這裏很明顯動物都有喫這個行爲因此我們可以定義抽象類,只對其行爲進行什麼,至於怎麼實現,就是子類的事情了
很明顯我們能看出狗和貓裏面直接使用了父類中的方法和屬性這樣就不會反覆寫共有的內容了;但是類只能實現單繼承,這樣就出現了接口,接口就是動作的抽象
package com.ge;
interface Animal { //定義了一個動物類接口
public static final int num = 1;//這裏必須是常量
void eat();
}
package com.ge;
public class Cat implements Animal{
@Override
public void eat() {
System.out.println("貓正在喫");
}
}
package com.ge;
public class Dog implements Animal{
@Override
public void eat() {
System.out.println("狗正在喫");
}
}
package com.ge;
public class Test {
public static void main(String[] args) { //寫個測試類
//創建個狗得對象
//父類引用指向子類對象,子類重寫父類方法,父類引用調用子類重寫後的方法,執行的結 果是子類重寫後的方法
Animal animal = new Dog(); //父類引用指向子類對象
animal.eat();
}
}
在開發中有時我們的項目會很大,不可能每次修改都重新編譯,這種硬編碼很明顯不適合,因此我們通過反射機制進行創建對象
E盤下創建個文件, 這樣就可以通過更換類的權限定名通過讀取文件創建對象,就不需要每次更換接口而去重新編譯了
package com.ge;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) { //寫個測試類
//創建個狗得對象
// Animal animal = new Dog();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\animal.txt")));
String str = bufferedReader.readLine();
Animal animal = (Animal) Class.forName(str).newInstance();
animal.eat();
} catch (Exception e) {
e.printStackTrace();
}
}
}