程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 初學Java6:Java OOP基礎語法總結,java6oop

初學Java6:Java OOP基礎語法總結,java6oop

編輯:JAVA綜合教程

初學Java6:Java OOP基礎語法總結,java6oop



*************** Java OOP 基 礎 語 法 總 結 *************************
1,類與對象
1),類(class)是相同屬性和方法的一組集合。
A,類的組成:屬性和方法。
B,語法聲明:使用class關鍵字,eg:public class Student{}//類名首字母大寫,且必須和文件名一致
C,類的實例化:使用new關鍵字,eg:Student student=new Student();//聲明一個Student類型的變量or實例化一個Student對象
D,類與文件的關系;
a,一個java文件可以包含多個java類
b,一個java文件最多只能有一個public類
c,java文件的名稱必須和其中的public類名一致
E,eg:public class Student{//類(首字母大寫)
public void getName(){//方法(一般為動詞+名詞,動詞首字母小寫,名詞首字母大寫)
String name;//屬性(數據類型+屬性名)
}
}
2),對象(object)是一個具體的實體(entity)。
eg:某某學生即可作為一個對象
********************************************************************
2,方法
1),可以重復執行的代碼塊,對於調用者來說相當於一個“黑盒子”。
2),語法聲明;訪問控制修飾符 返回值類型 方法名 (參數列表){
方法體;
}
eg:public void getName(int num){
String name;
}
3),方法的傳參--數據類型:A,8種基本數據類型(byte,int,short,long,float,double,char,boolean)
B,引用數據類型(eg:Student student=new Student();中的student就是引用數據類型)
注:基本數據類型與引用數據類型的區別:
a,存儲方式不同,基本數據類型存在 棧 中,是按值傳
引用數控類型存在 堆 中,是按址傳
b,使用方式不同,基本數據類型 無屬性和方法
引用數控類型 有屬性和方法
********************************************************************
3,構造方法(Constructor)
1),是一個特殊的方法,該方法的作用是實例化對象,會在內存中分配空間,且可以對類的屬性進行初始化
2),語法特征:
a,構造方法的名字必須與所在的類一致
b,沒有返回值類型,注意和沒有返回值不是一回事
c,默認情況下有一個隱式的無參構造方法,其訪問控制修飾與所在的類的訪問控制修飾一致
d,如果我們自定義了構造方法,則隱式無參構造方法就不存在了
3),使用方法:使用new關鍵字調用

********************************************************************
4,包(package)
1),意義:解決命名沖突
2),命名:主要需要知道域名反寫,全部字母小寫,不能以數字開頭,eg:com.baidu.zhidao.azhi0828//合法包名
3),如果一個類需要使用另一個包中的類,需要使用import關鍵字導入相應的包,其中java.lang無需顯式導入
********************************************************************
5,可變長度參數
1),是在數據類型後面加上“...”表示,當成數組。
eg:int getTotal(int...num){
代碼塊;
}
2),調用時可以不傳參數,可以傳若干參數,傳入參數用逗號隔開,也可以傳入數組。
3),一個方法最多只能有一個可變長度參數,而且必須放在最後位置
eg:eg:int getTotal(int num1,int...num2){
代碼塊;
}
********************************************************************
6,命令行參數
***了 解***
********************************************************************
7,方法重載
1),在一個類中,具有相同的方法名,但是參數列表不同的方法。
2),可分為一般方法重載和構造方法重載。
eg:class Student{//同一個類
void getInformation(String name){//相同的方法名,不同的參數列表
***;
}
void getInformation(int age){//相同的方法名,不同的參數列表
***;
}
}
********************************************************************
8,this關鍵字
(1),使用環境:方法和構造方法中。
(2),使用方法兩種:
1),this.屬性(方法);//this表示當前運行的實列(對象),注意:this未運行時,不代表任何屬性(方法)。
2),this();//只能用在構造方法中。表示調用其他重載形式的構造方法,而且必須放在第一行。
(3),注意:靜態方法中不能使用this!(靜態方法屬於類,不是實列,而this代表了當前運行的實列,放一起順序會邏輯混亂),main中也不能使用this!
(4),eg:
 1 package com.zhi.java.course;
 2 public class Text{
 3     Text(int num){//this();只能用在構造方法中
 4         this.num=num;
 5     }
 6     Text(){
 7         this(100);//無參方法調用有參
 8     }
 9     int num=1;
10     int getNum(){
11         return num;//此處可以直接放回num
12     }
13     void setNum(int num){//新定義的num不同於成員變量num
14         this.num=num;//此處this不可省
15     }
16     void m1(){
17         
18     }
19     void m2(){
20         this.m1();//此處this可以省
21     }
22      static void m3(){
23         System.out.println(this.num);//Error!Cannot use this in a static context
24     }
25 }

 

********************************************************************
9,super關鍵字(對比this關鍵字)
(1),使用環境:一般的實列方法中和構造方法中
(2),使用方法兩種:
(1),super.屬性(方法);//調用父類的屬性(方法)
(2),super();//只能用在構造方法中。表示調用父類相應的構造方法,而且必須放在第一行。
********************************************************************
10,final關鍵字
(1),final修飾類,表示該類不能再被繼承;
eg:final class Animal(){}//Animal不能再被繼承。
(2),final修飾變量,該變量必須被賦值,final修飾後該變量變為常量,不能再改變;
eg:final int num=10;//num不可再改變。
(3),final修飾方法,該方法不能再被重寫;
eg:final void m1(){}//方法m1在f父類,在子類中final不能再被重寫。
(4),final修飾屬性,1),可以直接在聲明時賦值
2),可以在代碼塊中賦值
3),靜態的可以在靜態代碼塊中賦值
********************************************************************
11,繼承
(1),概念,繼承是OOP特征之一,是子類通過繼承獲取父類中的部分屬性和方法。
(2),使用extends關鍵字
1),符合is-a關系的設計使用繼承
2),繼承是代碼重用的一種方式
(3),好處:1),做到代碼重用
2),系統維護性更好。
(4),不能繼承的有:1),子類不能繼承父類的構造方法。
2),子類不能繼承父類的私有方法(private)。
3),子類和父類不在同一包,使用默認的訪問權限的成員
(5),eg:
 1 package com.zhi.java.course;
 2 public class Animal {
 3     String name;//公共的屬性或方法
 4     int age;
 5 }
 6 public class Dog extends Animal {//繼承父類的屬性,一個子類只能繼承一個父類(單根繼承)
 7     public static void main(String[] args) {
 8         Dog dog = new Dog();
 9         dog.name = "大黃";
10         dog.age = 300;
11         String na= "田不易";//也可以有子類的特有屬性(方法)
12     }
13 }

********************************************************************
12,類的初始化順序:(從上到下)
父類的靜態代碼塊
子類的靜態代碼塊
父類的代碼塊
父類的構造方法
子類的代碼塊
子類的構造方法
注意:靜態代碼塊只能執行一次!
********************************************************************
13,訪問控制修飾符
1),概念,a:Java提供四種訪問控制修飾符(public private 包 )
b:放在方法與變量前,部分訪問控制修飾符也可以放在類前
c:目的是控制代碼的訪問權限。
2),控制范圍(從大到小)
public 所有代碼都可以訪問
protected 本類,包及其子類的代碼可以訪問
包 本類,同一個包中訪問
private 私有的,它修飾的屬性,方法,或內部類只能本類使用

********************************************************************
14,方法重寫
1),概念:在子類中對父類的方法重新實現一遍,即在子類中對父類中某方法的默認邏輯進行修改。
2),語法:a,方法名一樣
b,方法的參數一樣
c,子類重寫的方法返回值類型要與父類返回值類型一樣或者是其子類
d,子類訪問控制修飾符的范圍不能比父類不能小
e,子類拋出的異常不能比父類拋出的異常多或范圍更大
3),以下方法不能重寫:
a,private方法
b,構造方法(Constructor)
c,static方法
d,final方法
********************************************************************
15,Object類
(1),java是單根繼承,在java中不允許多根繼承。
(2),Object是所有類的最終父類,所有類或者是數組都可以直接或間接繼承Object類。
(3),Object類來自java.lang包。
(4),可以將所有的引用類型值賦給Object類型聲明的變量,包括null。
(5),Object提供9中可用方法,所有的子類都都可以使用,其中
getClass(),notiFy(),notiFyall(),wait()不可以被子類重寫
toString(),equals(),hashCode(),clone(),finalize()可以被子類重寫
(6),toString()方法
1),自動調用toString()方法的場景:字符串拼接和控制台輸出,如下列:
 1 package com.zhi.java.course;
 2 public class Dog {
 3     String name;
 4     int age;
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11     public int getAge() {
12         return age;
13     }
14     public void setAge(int age) {
15         this.age = age;
16     }
17     public static void main(String[] args) {
18         Dog dog = new Dog();
19         dog.setName("大黃");
20         dog.setAge(300);
21         System.out.println(dog);//等同於System.out.println(dog.toString());會自動調用toString方法,故有以下結果
22     }
23 }
運行結果: com.zhi.java.course.Dog@2a139a55 //默認實現輸出格式:全限定類名@哈希碼的16進制 

2),重寫toString()方法
 1 package com.zhi.java.course;
 2 public class Dog {
 3     String name;
 4     int age;
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11     public int getAge() {
12         return age;
13     }
14     public void setAge(int age) {
15         this.age = age;
16     }
17     @Override//重寫注解,可判斷是否重寫
18     public String toString() {
19         return "名字:"+name+"\n年齡:"+age;  //重寫獲得需要的值
20     }
21     public static void main(String[] args) {
22         Dog dog = new Dog();
23         dog.setName("大黃");
24         dog.setAge(300);
25         System.out.println(dog);//等同於System.out.println(dog.toString());已經重寫toString()方法
26     }
27 }
運行結果:名字:大黃
   年齡:300
(7),equals()方法重寫
1),當類有邏輯上的等同意義而不僅是對象意義上的等同時 需要重寫equals()方法。
2),以下情況不能重寫:
a,每個類實列本質上是唯一的。
b,不關心類是否提供了“邏輯意義上的等同”測試。
c,超類已經重新了equals,該方法也適合子類。
3),回顧 "==":比較基本數據類型的值是否相等(按值比較),比較引用數據類型是否是同一個對象(按址比較)。
equals:默認與"=="相同,重寫可自定義比較規則。
4),未重寫時結果如下:
 1 package com.zhi.java.course;
 2 class Game {
 3     private String name;
 4     private int age;
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11     public int getAge() {
12         return age;
13     }
14     public void setAge(int age) {
15         this.age = age;
16     }
17 }
18 public class EqualsJob {
19     public static void main(String[] args) {
20         Game g1 = new Game();
21         g1.setName("LOL");
22         g1.setAge(6);
23         Game g2 = new Game();
24         g2.setName("LOL");
25         g2.setAge(6);
26         System.out.println(g1.equals(g2));// 用equals直接比較兩個相同的引用類型,等同System.out.println(g1==g2);
27     }
28 }
運行結果:false
5),重寫equals()後如下:
 1 package com.zhi.java.course;
 2 class Game {
 3     private String name;
 4     private int age;
 5     public String getName() {
 6         return name;
 7     }
 8     public void setName(String name) {
 9         this.name = name;
10     }
11     public int getAge() {
12         return age;
13     }
14     public void setAge(int age) {
15         this.age = age;
16     }
17     @Override
18     public boolean equals(Object obj) {
19         if (this == obj) {
20             return true;
21         }
22         if (obj instanceof Game) {//向下轉型需要通過instanceof判斷obj和Game是否同一類型
23             Game g = (Game) obj;//類型一致則強轉類型,向下轉型
24             return g.getAge() == age && g.getName().equals(name);//自定義比較規則
25         }
26         return false;
27     }
28 }
29 public class EqualsJob {
30     public static void main(String[] args) {
31         Game g1 = new Game();
32         g1.setName("LOL");
33         g1.setAge(6);
34         Game g2 = new Game();
35         g2.setName("LOL");
36         g2.setAge(6);
37         System.out.println(g1.equals(g2));// 使用equals直接比較兩個相同的引用類型
38     }
39 }
運行結果:true
6),equals()重寫約定
a,自反性
b,對稱性
c,傳遞性
d,一致性
e,任何非空x,x.equals(null)總是false
f,重寫equals方法時永遠要重載hashCode方法
********************************************************************
16,向上轉型與向下轉型:
(1),向上轉型:子類的實例可以自動轉換為父類的類型
(2),向下轉型:父類型需要強制轉化為子類型,前提是該對象本身就是子類型的對象,使用instanceof做判斷
********************************************************************
17,抽象類:
(public abstract class shape{}就是一個抽象類)
(1),使用abstract聲明抽象類或抽象方法
(2),抽象類可以有抽象方法,也可以沒有抽象方法,但是抽象方法必須在抽象類中
(3),抽象類不能實例化
(4),抽象類可以有構造方法
抽象方法:(public sbstract void sss();就是一個抽象方法)
(1),沒有實現體
(2),不能被final,private,static修飾
(3),主要給子類來重寫的

如果抽象類的子類是一個具體的類,該具體類必須實現父類的所有抽象方法
如果子類也是抽象類,子類既可以實訓父類的抽象方法,也可以不實現
 ********************************************************************
18,接口
(1),概念:它是一個純粹的抽象類,其它的方法全部都是抽象方法。它是一種約定,一種能力
(2),聲明語法:使用interface關鍵字,eg:public interface Swimable{}
1),可以聲明屬性,該屬性默認是public static final修飾的,必須賦初始值
2),可以有方法,全部是抽象方法,
3),接口不能直接實例化(接口是一個純粹的抽象類)
(3),接口成員-常量屬性
1),接口中所有的屬性都是public static final修飾的
2),常量可以是基本數據類型,也可以是引用數據類型
(4),注意:1),常量的命名規范是全部字母大寫,eg:public static final int NUM=10;
2),接口的修飾符可能是包級訪問級別的,所以public常量有可能訪問不到
3),推薦使用枚舉保存一組相關的值(至少java5)
(5),繼承接口
1),接口可以使用extends關鍵字繼承另一個接口
2),可以繼承:抽象方法和默認方法,常量屬性,嵌套類型
3),不能繼承靜態方法
(6),實現接口
1),實現接口的具體類需要使用implements關鍵字,並且需要重寫接口中所有的抽象方法。eg:public class Fish implements Swimable{}
2),實現接口的抽象類可以重寫接口中的部分抽象方法。
3),一個類可以實現多個接口,但是只能繼承一個類,而且應先繼承後實現。
4),接口可以作為數據類型用來聲明變量。
5),接口也可以繼承接口。
********************************************************************
19,面向對象的三大特征:封裝,繼承,多態
(1),封裝:將實現的代碼或屬性放在一個類或方法中,不讓外部代碼隨意訪問。
好處:安全。
使用訪問控制修飾符 private
(2),繼承:子類會將父類的部分屬性或方法繼承下來。
好處:做到代碼重用,提高系統的維護性能
使用關鍵字:extends
(3),多態:在不同的場景下,類或方法有不同的指向。
好處:代碼量可以減少
體現:1),方法上的多態:重寫和重載
2),類的多態:類作為方法的參數或返回值類型
********************************************************************
20,接口與抽象類的區別?
1),語法上,接口是使用interface聲明,使用implements實現,
抽象類是使用abstract聲明,使用extends繼承。
2),特定,接口不能有具體的方法,屬性都是靜態常量,
抽象類可以有構造方法、抽象方法、普通方法,還有屬性。
3),設計上,表達某種能力使用接口,

********************************************************************
21,方法重寫與重載的區別?
方法重寫是在子類中對父類的方法重新實現一遍,即在子類中對父類中某方法的默認邏輯進行修改。方法名和參數列表都相同。
方法重載是在一個類中,具有相同的方法名,但是參數列表不同的方法。
                                                  
   為了這個東西,從早上10點弄到現在,除了中午下午吃飯時間,一直沒間斷,好累...
                                                   A_zhi
							                2016/8/28/22/50
******************** 持 續 修 改、補 充... ***************************
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved