java基礎——面向對象2

1.定義變量的語法
數據類型 變量名 = 值;
-------------------------------------------------------------------
變量根據在類中定義的位置不同,分成兩大類:
成員變量:全局變量/字段(field),不要稱之爲屬性直接定義在類中(方法外面);
(1)類成員變量static修飾的字段
(2)實例成員變量,沒有使用static修飾的字段
局部變量:變量除了成員變量都是局部變量
1.方法的內部變量
2.方法的形參
3.代碼塊中的變量{}
---------------------------------------------------------------------
變量的初始值:(初始化才能開闢內存空間)
成員變量:默認是有初始值的
局部變量:沒有初始值,所以必須先初始化才能使用
-----------------------------------------------------------------------
變量的作用域:
變量根據定義的位置不同,也決定了各自的作用域是不同的,看變量所在的{}
成員變量:在整個類中都有效
局部變量:在開始定義的位置開始,到緊跟着結束的花括號爲止.

-----------------------------------------------------------------------



2.變量的生命週期
變量的作用域決定變量的生命週期,作用域不同,生命週期就不同
變量的生命週期指的是一個變量被創建分配內存開始,到變量被清除
存在位置
生命週期開始
生命週期結束
在內存中的位置
類變量
字段,static修飾
字節碼加載進JVM
當JVM結束工作
方法區
實例變量
字段,沒有使用static修飾
當創建所在類的對象時
當該對象被GC回收的時候
堆中
局部變量
方法形參,代碼塊,方法內
當代碼執行到初始化變量的時候
所在的方法或者代碼塊結束的時候
當前方法的棧幀中

開發中應該儘量縮小變量的作用範圍,如此在內存中停留的時間越短,性能也就越高
不要輕易使用static修飾,一般定義方法的時候,static方法需要訪問的變量,該變量屬於類,此時才用static修飾字段
不要輕易使用成員變量,存在着線程不安全的問題,能使用局部變量就儘量使用局部變量.
靜態導入:
語法格式:import static 類的全限定名.該類中的static

Import static 類的全限定名.*;此時的*表示當前類的任意使用的靜態類型
Arrays.toString(arr);----------------> toString(arr);
通過反編譯工具,其實所謂的靜態導入也是一個語法糖/編譯器級別的新特性.

在實際開發中,我們不使用靜態導入,因爲如此,分不清某一個靜態方法或者字段源於哪一個類.


3.Package語句
我們在開發中存在幾百上千個java文件,如果所有的java文件都在一個目錄中,管理起來也很痛苦.此時我們可以使用生活中的解決方案,不過在java中,我們把這個特殊的文件稱爲package
關鍵字:package.專門用來給當前的java文件設置包名.
語法格式:package包名(.子包的名稱);必須把該語句作爲java文件中,並且是第一行
此時編譯命令: javac -d . Hello.java
如果此時Hello.java文件中沒有使用package語句,表示當前目錄中生成字節碼文件.
如果此時Hello.java文件中使用了package語句,表示當前目錄中先生成包名,再在包中生成字節碼文件
運行命令:java 包名.類名
Package的最佳實踐:
包名如何定義,自定義的包名不能以java.打頭
包名必須遵循標識符規範/全部小寫
包名採用公司域名倒寫,例如
alibaba.com-----------> com.alibaba
格式: package 域名倒寫.模塊名稱.組件名稱;
Package com.alibaba.pss.util;
1.類的名稱:
類的簡單名稱: Package
類的全限名稱: abc.Package
2.在開發中,都是先有package而後在package中定義類

當A類和B類不再同一個包中,若A類需要使用到B類,此時就得讓A類去引入B類.
使用import語句直接把某個包下的類導入到當前類中
語法格式:import 需要導入來的全限定名稱
此後在java文件中,只需要使用類的簡單名稱即可
class ImportDemo{
	public static void main(String[] args) {
		int[] arr = new int[] {1,54,66,7,1,-2};
		String ret = Arrays.toString(arr);
		System.out.println(ret);
		Arrays.sort(arr);
		ret = Arrays.toString(arr);
		System.out.println(ret);
	}
}


編譯會自動去java.lang中尋找使用到的類,比如String,System
所以他們不需要導入
推論:非java.lang中的類,都需要導入
import java.util.Set;
import java.util.List;

如果還需要引入java.util的其他包,我們還得提供多個import語句,不爽
解決方法:使用通配符(*);
Import 類的全限定名; 只能導入某一個類;
Import 包名.子包名.*; 表示映入該包下的所有的當前文件中使用的類;
importjava.util.*;


4.封裝
保存聯繫人功能:
Void save (String name, int age, String phoneNumber, String email, String address);
因爲保持聯繫人時,可以保持多個信息,那麼保持方法就必須設置爲具有N 個參數的
發現問題:方法的參數列表屬性爆炸式增長
把聯繫人的多個信息看成是一個整體.
{
	//查詢聯繫人信息
	Linkman get(String n)
	{
	...
	}
	String name;
	int age;
 	String phoneNumber;
 	String email;
 	String address;
	...
}


上述保存聯繫人方法:
Void save(Linkman man){}
什麼是封裝:
1.把對象的狀態和行爲看成是一個統一的整體,將二者存放在一個獨立的模塊中(類);
2.信息隱藏,把不需要外界知道信息隱藏起來,儘可能隱藏對象功能實現細節,向外暴露方法,保證外界安全訪問功能;
把所有字段使用private私有化,不被外界訪問,public允許外界訪問
把所有數據信息隱藏起來,儘可能隱藏多的功能,只向外暴露邊界的方法,以供調用.
封裝的好處:
1.使調用者正確,方便的使用系統功能,防止調用者隨意修改系統屬性
2.提高組件的重用性
3.達到組件直接的低耦合(當某一個模塊實現發送變化時,只要對外暴露的接口不變就不會影響到其他的模塊)
----------------------------------------------------------------------------------------------------
高內聚:該模塊的內部數據,功能細節隱藏在模塊內部,不允許外界直接干預

低耦合:該模塊只需要給外界暴露少量的功能方法


訪問權限控制:
Private:表示私有的,表示類訪問權限.只能在本類中訪問,離開本類之後不能訪問
缺省:表示包私有,表示包訪問權限,訪問者的包必須和當前定義類的包相同才能訪問
(a在主包,b在子包,a也不能訪問B)
Protected: 表示子類訪問權限,同包中的可以訪問,即使不同包,但是有繼承關係,也可以訪問
Public : 表示公共的
一般的字段都是用private修飾,表達隱藏,爲了安全性
用於實現細節的方法,一般使用private修飾,不希望外界,看到該方法的實現細節
一般的,訪問我們使用public修飾,共外界直接調用
Public void doWork()
{
	MethodA();
	MethodB();
	MethodC();
}
//僅僅是完成了部分操作,不需要調用者調用
Private MethodA();
Private MethodB();
Private MethodC();


javaBean規範(額外提一下)
javaBean是一種java寫成的可重用性組件(類):
必須遵循一定的規範:
1.類必須使用public修飾
2.必須保證有公共的無參數構造器
3.包含了屬性的操作手段(給屬性賦值,獲取屬性值)
分類:
1.複雜ui,例如button,panel,windows
2.簡單domain,service組件
成員:
1.方法:Method
2.事件:event
3.屬性:property
---------------------------------------------------------------------------------------------
屬性區別:
attitude:表示狀態,java中沒有該概念,很多人把字段(feild)稱之爲屬性(java中沒有屬性),不要把成員變量叫做屬性
Property:表示狀態,但是不是自選,是屬性的操作方法(getter/setter)決定的,框架中使用的大多是屬性

封裝之後,私有字段成員只能在本類中訪問了,但是其他方法調用的時候,可能需要獲取私有字段成員

爲了能讓外界(其他類)訪問到本類中的私有字段成員,我們專門提供getter/setter方法

Public class Person
{
	//對象的字段是用來存儲對象的數據的
	Private String name;
	Private Int age;
}

Getter方法:用於獲取某個字段存儲的值

Public 數據類型 get字段

public  String  getName()
{
	Return name;//返回name字段存儲的值
}

如果操作的字段是boolean類型的,此時不應該叫做getter方法,,而是is方法
getName變成isName

Setter方法:僅僅給某個字段設置需要存儲的值

public 數據類型  set字段

public String setName()
{
	name = n;//把傳過來的n參數的值,存儲到name字段中
}

每個字段都得提供一堆getter/setter,但是在eclipse工具可以自動ctrl+alt+s生成
所以上面封裝就得這麼寫

Public class Person
{
	//對象的字段是用來存儲對象的數據的
	Private String name;
	Private Int age;

	Public String getName()
	{
		Return name;
	}
	Public void setName(String n)
	{
		Name = n;
	}
}


5.this方法
需求:定義一個user類,提供name,age字段,以及相應的getter/setter方法
並創建對象,設置name和age的數據,再打印對象的name和age
什麼是this:
表示當前對象,什麼是當前 對象
This主要存在於兩個位置:
構造器中:就表示當前創建的對象
方法中:哪一個對象調用this所在的方法,此時this就表示哪一個對象
當一個對象創建成後,java虛擬機會分配一個引用自身的引用
使用this
1.解決參數和成員變量的二義性
2.同類中實例的互調(此時可以省略this,但是不建議)
3.將this作爲參數傳遞給另一個方法;
4.將this作爲放到返回值(鏈式編程)
5.Static 和this 不能一起使用
當字節被加載JVM,Static成員已經存在,但是此時對象沒創建
沒有對象就沒有this
6.構造器重載的相互調用問題
User(){	
}
//創建對象,初始化name
User(String name){
	this.name = name;
}
//創建對象,初始化name和age
User(String name,int age){
	this.name = name;
	this.age = age;
}


上述代碼沒有問題:
但是存在一些缺陷:
1.代碼功能重複,this.name = name;
2.重複會導致代碼維護性差
---------------------------------------------------------
項目經理說,將name改爲usersname
代碼重複得多改幾次
解決方案:

在構造器中重載中,this(name)-----------------表示調用用上面的構造器
this()必須作爲構造器的第一句話
推論:構造器中只能調用一個重載的構造器
當多個構造器重載時,或者多個方法重載時,一般的我們是少參數調用多參數的
也就是說功能更強大.

這樣的話,如果需要更改初始化邏輯,只需要改最後一個構造器內代碼即可。這種情況下,其他的構造器其實僅僅是提供給用戶的接口而已。從後期維護的方面考慮,這種方法顯然是最理想的~

User(String name){
	this(name,0);//調用User(String name,int age) 少調多
}
//創建對象,初始化name和age
User(String name,int age){
	this.name = name;
	this.age = age;
}

創建對象並給對象設置初始值的兩種方式:
方式1:先通過無參數構造器創出一各對象,再通過對象調用相應的setter方法
方式2:直接調用帶參數的構造器,創建出來的對象就有了初始值
-------------------------------
通過構造器和通過setter方法都可以完成相同的功能
1.setter(屬性注入)
2.構造注入
如何選擇
1:如果存在帶參數的構造器,方式2是比較簡潔的
2:如果構建對象的時候需要初始化多個數據,如果使用方式2,那麼構造器得提供n個參數,參數過大,不直觀,使用方法1

 說明:本文乃學習整理參考而來.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章