面向過程
核心是過程二字,過程指的是解決問題的步驟,設計一條流水線,機械式的思惟方式;java
面向對象
核心就是對象二字,對象就是特徵與技能的結合體,利用「類」和「對象」來建立各類模型來實現對真實世界的描述。編程
面向對象的三大特徵
封裝 (Encapsulation)
繼承 (Inheritance)
多態 (Polymorphism)安全
面向對象的編程思想力圖使計算機語言中對事物的描述與現實世界中該事物的原本面目儘量的一致。
類(class)和對象(object)是面向對象方法的核心概念。類是對一類事物描述,是抽象的、概念上的定義;對象是實際存在的該類事物的每一個個體,於是也稱實例(instance)。網絡
若是將對象比做汽車,那麼類就是汽車的設計圖紙。因此面向對象程序設計的重點是類的設計,而不是對象的設計。app
語法格式函數
[< 修飾符>] class < 類名> { [<屬性聲明>] [<構造器聲明>] [<方法聲明>] }
說明:工具
修飾符public:類能夠被任意訪問
類的正文要用{ }括起來this
舉例:spa
public class Person{ private int age ; //聲明私有變量 age public void showAge(int i) { //聲明方法showAge age = i; } }
語法格式:.net
[<修飾符>] 類型 < 屬性名> [=初值] ;
說明:
修飾符 private: 該屬性只能由該類的方法訪問。
修飾符 public: 該屬性能夠被該類之外的方法訪問。
類型:任何基本類型,如int、boolean或任何類。
屬性有時也稱爲:數據成員(數據),成員變量(變量)
舉例
public class Person{ private int age; //聲明private變量 age public String name = 「Lila」; //聲明public變量 name }
語法格式:
<修飾符> <返回類型> <方法名>([< 參數表>]) { [< 語句>] }
說明:
修飾符:public,private,protected 等。
返回類型:return語句傳遞返回值。沒有返回值:void。
方法有時也稱爲:成員函數(函數)
舉例:
public class Person{ private int age; public int getAge() { return age; } //聲明方法getAge public void setAge(int i) { //聲明方法setAge age = i; //將參數i的值賦給類的成員變量age } }
使用 new +構造方法 建立一個新的對象;
當一個對象被建立時,會對其中各類類型的成員變量自動進行初始化賦值。除了基本數據類型以外的都是變量類型都是引用類型。
使用 「對象名.對象成員」 的方式訪問對象成員(包括屬性和方法);
public class Animal { public int legs; public void eat(){ System.out.println(「Eating.」); } public viod move(){ System.out.println(「Move.」); } }
public class Zoo{ public static void main(String args[]){ Animal xb=new Animal(); xb.legs=4; System.out.println(xb.legs); xb.eat(); xb.move(); } }
若是建立了一個類的多個對象,對於類中定義的屬性,每一個對象都擁有各自的一套副本,且互不干擾。
public class Zoo{ public static void main(String args[]){ Animal xb=new Animal(); Animal xh=new Animal(); xb.legs=4; xh.legs=0; System.out.println(xb.legs); //4 System.out.println(xh.legs); //0 xb.legs=2; System.out.println(xb.legs); //2 System.out.println(xh.legs); //0 } }
提示:
在一個類中的訪問機制:類中的方法能夠直接訪問類中的成員變量。(有一個例外)
在不一樣類中的訪問機制:先建立要訪問類的對象,再用對象訪問類中定義的成員。
有變量引用(指向)對象,對象就不會成爲垃圾對象。
咱們也能夠不定義對象的句柄,而直接調用這個對象的方法。這樣的對象叫作匿名對象, 如:new Person().shout();
若是對一個對象只須要進行一次方法調用,那麼就可使用匿名對象。
咱們常常將匿名對象做爲實參傳遞給一個函數調用。
使用者對類內部定義的屬性(對象的成員變量)的直接操做會致使數據的錯誤、混亂或安全性問題。應該將屬性保護起來,防止亂用。
經過信息隱藏來實現,Java中經過將數據聲明爲私有的(private),再提供公開的(public)方法:getXXX和setXXX實現對該屬性的操做,以實現下述目的:
隱藏一個類的實現細節;
使用者只能經過事先定製好的方法來訪問數據,能夠方便地加入控制邏輯,限制對屬性的不合理操做;
便於修改,加強代碼的可維護性;
public class Animal{ private int legs; //將屬性legs定義爲private,只能被Animal類內部訪問 public void setLegs(int i){ //在這裏定義方法 eat() 和 move() if (i != 0 && i != 2 && i != 4){ System.out.println("Wrong number of legs!"); return; } legs=i; } public int getLegs(){ return legs; } }
public class Zoo{ public static void main(String args[]){ Animal xb=new Animal(); xb.setLegs(4); //xb.setLegs(-1000); xb.legs=-1000; //非法 System.out.println(xb.getLegs()); } }
它具備與類相同的名稱;
它不含返回值;注意:在構造方法裏不含返回值的概念是不一樣於「void」的,在定義構造方法時加了「void」,結果這個方法就再也不被自動調了。
當一個類的實例對象剛產生時,這個類的構造方法就會被自動調用,咱們能夠在這個方法中加入要完成初始化工做的代碼。這就好像咱們規定每一個「人」一出生就必須先洗澡,咱們就能夠在「人」的構造方法中加入完成「洗澡」的程序代碼,因而每一個「人」一出生就會自動完成「洗澡」,程序就沒必要再在每一個人剛出生時一個一個地告訴他們要「洗澡」了。
因此,構造器的功能就是:建立類的實例時,初始化實例的一組指令。
語法格式:
< 修飾符> <類名>([< 參數表>]) { [< 語句>] }
舉例:
public class Animal { private int legs; public Animal() {legs = 4; } // 構造器 public void setLegs(int i) { legs = i; } public int getLegs(){return legs;} }
建立Animal類的實例:Animal a=new Animal(); // 調用構造器,將legs初始化爲4
註釋:構造器的名稱必須與類名相同。修飾符:public、private、protected,構造器不是方法,沒有返回值(連void也不能寫)
Java語言中,每一個類都至少有一個構造方法;若是類的定義者沒有顯式的定義任何構造方法,系統將自動提供一個默認的構造方法:
默認構造方法沒有參數
默認構造方法沒有方法體
默認的構造方法:Animal(){}
因此,不編寫構造方法就能用new Xxx()建立類的實例。
Java類中,一旦類的定義者顯式定義了一個或多個構造方法,系統將再也不提供默認的構造方法;
構造器的主要做用:利用構造器參數初始化對象的屬性。
定義一個函數的格式
返回值類型 函數名(參數類型 形式參數1,參數類型 形式參數2,….){ 程序代碼 return 返回值; }
形式參數:在方法被調用時用於接收外部傳入的數據的變量。
參數類型:就是該形式參數的數據類型。
返回值:方法在執行完畢後返還給調用它的程序的數據。
返回值類型:函數要返回的結果的數據類型。
實參:調用函數時實際傳給函數形式參數的數據。
函數的重載就是在同一個類中容許同時存在一個以上的同名函數,只要它們的參數個數或類型不一樣便可。
重載方法的參數列表必須不一樣
重載方法的返回值類型能夠相同,也能夠不一樣
調用時根據方法的參數類型來區別。
public class PrintStream{ public void print(int i) {……} public void print(float f) {……} public void print(String s) {……} }
舉例
package com.uncleyong; public class MethodOverload { /** * 定義三個重載方法並調用。方法名爲mOL。 * 三個方法分別接收一個int參數、 * 兩個int參數、 * 一個字符串參數。 * 分別執行平方運算並輸出結果,相乘並輸出結果,輸出字符CallMOL串信息。 */ public void mOL(String str){ System.out.println("CallMOL:" + str); } public void mOL(int a, int b){ System.out.println(a * b); } public void mOL(int a){ System.out.println(a * a); } }
1 package com.uncleyong; 2 3 public class TestMethodOverload { 4 5 public static void main(String[] args) { 6 MethodOverload mo = new MethodOverload(); 7 8 mo.mOL(5); 9 mo.mOL("abc"); 10 mo.mOL(3, 4); 11 } 12 13 }
構造方法通常用來建立對象的同時初始化對象,構造方法重載使得對象的建立更加靈活,方便建立各類不一樣的對象。
構造方法重載舉例:
public class Person{ public Person(String name, int age, Date d) {this(name,age);} public Person(String name, int age) {…} public Person(String name, Date d) {…} public Person(){…} }
構造方法重載,參數列表必須不一樣
每一個成員方法內部,都有一個this引用變量,指向調用這個方法的對象
在通常的方法中能夠經過 this 來引用當前對象的成員(方法、屬性)
經過 this() 調用重載的構造器. 須要注意的是, 經過此種方法調用重載的構造器的代碼必須放在當前構造器的第一行
package com.uncleyong; /** * (1)定義Person類,有4個屬性:String name; int age; String school; String major, * (2)定義Person類的3個構造方法: * 第一個構造方法Person(String n, int a)設置類的name和age屬性; * 第二個構造方法Person(String n, int a, String s)設置類的name,age 和school屬性; * 第三個構造方法Person(String n, int a, String s, String m)設置類的name, age ,school和major屬性; */ public class Person { private String name; private int age; private String school; private String major; public Person(String n, int a, String s, String m){ this(n, a, s); major = m; } public Person(String n, int a, String s){ this(n, a); school = s; } public Person(String n, int a){ name = n; age = a; } public String getName() { return name; } public int getAge() { return age; } public String getSchool() { return school; } public String getMajor() { return major; } public void setName(String name) { this.name = name; } }
package com.uncleyong; public class TestPerson { public static void main(String[] args) { Person person = new Person("uncleyong", 15, "北大", "Java"); System.out.println(person.getName()); System.out.println(person.getAge()); System.out.println(person.getSchool()); System.out.println(person.getMajor()); } }
軟件包幫助管理大型軟件系統:將語義近似的類組織到包中。包能夠包含類和子包。
package語句做爲Java源文件的第一條語句,指明該文件中定義的類所在的包。(若缺省該語句,則指定爲無名包)。
它的格式爲:
package <頂層包名>[.<子包名>]* ;
示例
package p1; //指定類Test屬於包p1 public class Test{ public void display(){ System.out.println("in method display()"); } }
包對應於文件系統的目錄,package語句中用‘ .’ 來指明包(目錄)的層次;包一般用小寫單詞。
若是在程序Test.java中已定義了包p1,編譯時採用以下方式:
-d將生成的類文件的路徑更改成另外一個目錄。
javac -d destpath Test.java,則編譯器會自動在destpath目錄下創建一個子目錄p1,並將生成的.class文件都放到destpath/p1下。
javac Test.java,則編譯器會在當前目錄下生成Test.class文件,再在適合位置(destpath目錄)手動建立一個名爲p1的子目錄,將Test.class複製到該p1目錄下。
爲使用定義在不一樣包中的Java類,需用import語句來引入所須要的類。Import語句告訴編譯器到哪裏去尋找類。
語法格式:
import 包名[.子包名…]. <類名 |*>
應用舉例:
import p1.Test; // import p1.*;表示引入p1包中的全部類 public class TestPackage{ public static void main(String args[]){ Test t = new Test(); //Test類在p1包中定義 t.display(); } }
java.lang----包含一些Java語言的核心類,如String、Math、Integer、System和Thread,提供經常使用功能。java.awt----包含了構成抽象窗口工具集(abstract window toolkits)的多個類,這些類被用來構建和管理應用程序的圖形用戶界面(GUI)。java.applet----包含applet運行所需的一些類。java.net----包含執行與網絡相關的操做的類。java.io----包含能提供多種輸入/輸出功能的類。java.util----包含一些實用工具類,如定義系統特性、使用與日期日曆相關的函數。