Java面向對象(一)

面向對象(Object Oriented)java

面向過程:事物比較簡單。將問題分解爲若干個步驟。按照步驟依次執行。
面向對象:事物比較複雜。在解決面向對象的過程當中,最後的執行部分仍是面向過程方式,面向過程和麪向對象不是對立的,而是相輔相成的。
面向對象和麪向過程的總結:
一、都是解決問題的思惟方式
二、解決簡單問題使用面向過程
三、解決複雜問題:宏觀上使用面向對象把握,微觀上處理仍然是面向過程。
面向過程和麪向對象舉例子:大象裝冰箱
面向過程:
一、打開冰箱
二、存儲大象
三、關上冰箱
對於面向對過程的思想,強調的是過程(動做)【C語言】
面向對象:
一、冰箱打開
二、冰箱存儲
三、冰箱關閉
對於面下對象思想,強調的是對象(實體)【C++、Java、C#】
面向對象核心:對象和類
對象(Object,instance):具體的事物。類的一個具體實例
類(class):是對 對象的抽象. (抽象:在類中只是表達了對象有什麼屬性,和會什麼功能。屬性的值都不具體)
類和對象的關係:
用Java語言對現實生活中的事物進行描述;經過類的形式來體現
類:描述對象
對象:該類的實例(用關鍵字new來建立對象)
先有對象仍是先有類?
1:從現實的角度去考慮:先有對象,再有類。
2:從分析的角度:先分析問題中有幾個對象,而後再用類去描述對象。先有對象,後有類。
3:從編碼的角度:先定義類,而後經過類建立對象。先有類,後有對象。
例子:  類:高樓的圖紙       類:樹
        對象:蓋起的高樓      對象:大門口的法桐
定義類:(類的組成)
屬性  field
方法  method
構造方法 construtor
其餘:代碼塊 、靜態代碼塊、內部類
建立對象
類名  對象名 = new 類名();
Person p1 = new Person();
調用類的屬性和方法
對象名.成員變量
對象名.成員方法
java虛擬機內存可分爲三個區域:棧(stack)、堆(heap)、方法區(method area)

棧的特色
一、棧描述的是方法執行的內存模型。每一個方法被調用都會建立一個棧幀(操做數,局部變量,方法出口等)
二、JVM爲每一個線程建立一個棧,用於存放該線程執行方法的信息(實際參數,局部變量等)
三、棧屬於線程私有的,不能實現線程間的共享。
四、棧的存儲特性:先進後出(彈夾)
五、棧由系統自動分配一個連續的內存空間,速度快!數組

堆的特色
一、堆用於存儲建立好的對象和數組(數組也是對象)
二、JVM只有一個堆,被全部線程共享
三、堆是一個不連續的內存空間,分配靈活,速度慢!
四、堆的存儲特性:先進先出
dom

方法區(又叫靜態區)
一、JVM只有一個方法區,被全部線程共享。
二、方法區實際上也是堆,只是用於存儲類、常量相關的信息。
三、用來存放程序中永遠不變的內容(類的信息,靜態變量,字符串常量)
jvm

成員:成員變量 <=> 屬性,成員函數 <=> 行爲
成員變量與局部變量區別
一、成員變量定義在類中(整個類可訪問)

   局部變量定義在函數中、語句、局部代碼塊中(所屬的區域有效)
二、成員變量存在於堆內存的對象中
     局部變量存在於棧內存的方法中
三、成員變量隨着對象建立而存在,隨着對象的消失而消失
     局部變量隨着所屬區域的執行而存在,隨着所屬區域的結束而釋放
四、成員變量都有默認初始化值(int類型 0;String 類型:null)
     局部變量沒有默認初始化值(編譯會報錯)
五、成員變量與局部變量同名時,優先訪問局部變量
構造器【構造方法】(Constructor)
構造器:一、構造器的方法名必須和類名一致!
    二、經過new關鍵字調用
    三、在建立對象時被自動調用的特殊方法。做用:爲屬性進行初始化
       默認的構造方法:類中若沒有定義構造方法,該類有一個默認的空參數的構造方法。
       類中定義了指定的構造方法,默認的空參數構造方法就不存在。
    四、與普通方法同樣,構造方法也能夠重載
構造器的重載:方法名相同,參數列表不一樣。一個類中出現多個構造方法是以重載的形式體現,可給不一樣的對象進行不一樣初始化屬性值。
&& example
 1 package com.boom0827;
 2 
 3 /**
 4  * 練習: 定義一個學生類:描述學生,屬性,年齡,age,分數score,名字 String name,性別 String gender
 5  * 而後定義默認無參的構造方法,並對全部的屬性 進行初始化 而後定義帶參數的構造方法,四個參數,對全部的屬性經過參數賦值。 而後定義 一個成員方法 show
 6  * 展現學生的屬性的。 定義測試類,生成兩個學生對象,一個調用默認無參的構造方法,一個調用 帶參數的構造方法 而後分別調用 show 方法。
 7  * 
 8  * @author Administrator
 9  *
10  */
11 
12 public class Test02 {
13 
14     public static void main(String[] args) {
15         Student student = new Student();
16         System.out.println("------無參的構造方法------");
17         student.show();
18         System.out.println("------有參的構造方法------");
19         Student student2 = new Student("小紅", "女", 18, 60);
20         student2.show();
21     }
22 
23 }
24 
25 // 建立一個學生類
26 class Student {
27     String name;
28     String gender;
29     int age;
30     int score;
31 
32     // 學生類的無參構造方法 初始化成員變量
33     public Student() {
34         name = "小明";
35         gender = "男";
36         age = 18;
37         score = 60;
38     }
39 
40     // 定義有參的構造方法
41     public Student(String setNname, String setGender, int setAge, int setScore) {
42         name = setNname;
43         gender = setGender;
44         age = setAge;
45         score = setScore;
46     }
47 
48     void show() {
49         System.out.println("姓名:" + name + "\n性別:" + gender + "\n年齡:" + age + "\n分數:" + score);
50     }
51 }
View Code

對象數組ide

 1 /**
 2  * 對象數組隨機賦值初始化
 3  * 
 4  * @author Administrator
 5  *
 6  */
 7 public class Test03 {
 8     public static void main(String[] args) {
 9         // 建立5個學生
10         Student[] students = new Student[5];
11 
12         // 打印,空數據的信息
13         for (Student student : students) {
14             System.out.println(student);// null
15         }
16 
17         // 初始化隨機數組分配姓名
18         String[] names = { "小紅", "小黑", "小青", "小紫", "小綠", "小橙", "小藍", "小黃", "小剛" };
19         // 對五個學生逐一進行初始化
20         for (int i = 0; i < students.length; i++) {
21             // 隨機初始化姓名
22             int index = getRandomNumber(0, names.length);
23             String name = names[index];
24             // 隨機初始化性別
25             String sex = getRandomNumber(0, 2) == 0 ? "男" : "女";
26             // 隨機年齡
27             int age = getRandomNumber(18, 25);
28             // 隨機分數
29             int score = getRandomNumber(60, 101);
30 
31             // 賦值
32             students[i] = new Student(name, sex, age, score);
33             students[i].show();
34         }
35 
36     }
37 
38     // 獲取隨機數
39     public static int getRandomNumber(int min, int max) {
40         return (int) (Math.random() * (max - min) + min);
41     }
42 }
43 
44 class Student {
45     String name;
46     String sex;
47     int age;
48     int score;
49 
50     // 建立構造方法初始化屬性值
51     public Student(String name, String sex, int age, int score) {
52         this.name = name;
53         this.sex = sex;
54         this.age = age;
55         this.score = score;
56     }
57 
58     // 顯示學生的基本信息
59     void show() {
60         System.out.println("姓名 = " + name + "\t年齡 = " + age + "\t性別 = " + sex + "\t成績:" + score);
61     }
62 }
View Code

this關鍵字
this關鍵字:當成員和局部變量重名,this關鍵字區分
this表明對象(當前對象),表明當前對象的一個引用
this關鍵字必須放在第一行(Java虛擬機先初始化值)
this不能用和static關鍵字共存
函數

static關鍵字
static特色:
1, static是一個修飾符,用於修飾成員變量和成員方法;不能修飾局部變量
2, static修飾的成員被全部的對象所共享;
3, static優先於對象存在,static的成員隨着類的加載就已存在;
4, static修飾的成員可直接被類名所調用【類名.靜態成員】;
5, static修飾的數據是共享數據,對象中存儲的是特有數據;
測試

成員變量跟靜態變量的區別:
1,生命週期不一樣
成員變量隨着對象建立而存在,隨着對象的回收而釋放;
靜態變量隨着類的加載而存在,隨着類的消失而釋放。(虛擬機消失)
2,調用方式不一樣
成員變量只能被對象調用;
靜態變量能夠被對象調用,也可被直接被類名調用。
3,別名不一樣
成員變量也稱實例變量;
靜態變量也稱類變量
4,數據的存儲位置不一樣
成員變量數據存儲在堆內存的對象中,也叫對象的特有數據;
靜態變量數據存儲在方法區(靜態區),也叫對象的共享數據。
Static使用注意事項:
1, 靜態方法只能訪問靜態成員;
2, 靜態方法中不可使用this或者super關鍵字(this和super是賴於某個對象的);
3, 主函數是靜態的 (由jvm 負責調用執行。不須要建立所在類的對象就能夠直接運行)
this

  

靜態代碼塊
特色:在類加載的時候,執行,而且僅執行一次。對類的靜態成員變量初始化,並執行靜態代碼塊。
做用:若是某些代碼但願僅執行一次,能夠在這裏面進行,還有對靜態成員變量初始化。


編碼

相關文章
相關標籤/搜索