文檔版本 | 開發(fā)工具 | 測(cè)試平臺(tái) | 工程名字 | 日期 | 作者 | 備注 |
---|---|---|---|---|---|---|
V1.0 | 2016.02.26 | lutianfei | none |
[TOC]
成員變量與局部變量
- 成員變量與局部變量區(qū)別:
- A:在類中的位置不同
- 成員變量:在類中,方法外
- 局部變量:在方法定義中或者方法聲明上。
- B:在內(nèi)存中的位置不同:
- 成員變量:在堆內(nèi)存
- 局部變量:在棧內(nèi)存
- C:生命周期不同
- 成員變量:隨著對(duì)象的創(chuàng)建而存在文兑,隨著對(duì)象的消失而消失
- 局部變量:隨著方法的調(diào)用而存在夕膀,隨著方法的調(diào)用完畢而存在
- D:初始化值不同
- 成員變量:有默認(rèn)初始值
- 局部變量:沒有默認(rèn)初始值瓜饥,必須定義,賦值戴质,然后才能使用。
- A:在類中的位置不同
- 注:局部變量名稱可以和成員變量名稱一致踢匣,在方法中使用的時(shí)候告匠,采用就近原則。
形式參數(shù)問(wèn)題
- 一個(gè)方法的形式參數(shù)是一個(gè)類類型(引用類型)离唬,這里其實(shí)需要的是該類的對(duì)象后专。
//形式參數(shù)是 基本類型
class Demo {
public int sum(int a,int b) {
return a + b;
}
}
//形式參數(shù)是 引用類型
class Student {
public void show() {
System.out.println("我愛學(xué)習(xí)");
}
}
class StudentDemo {
//如果你看到了一個(gè)方法的形式參數(shù)是一個(gè)類類型(引用類型),這里其實(shí)需要的是該類的對(duì)象输莺。
public void method(Student s) {
//調(diào)用的時(shí)候戚哎,把main方法中的s的地址傳遞到了這里 Student s = new Student();
s.show();
}
}
class ArgsTest {
public static void main(String[] args) {
//形式參數(shù)是基本類型的調(diào)用
Demo d = new Demo();
int result = d.sum(10,20);
System.out.println("result:"+result);
System.out.println("--------------");
//形式參數(shù)是引用類型的調(diào)用
//需求:我要調(diào)用StudentDemo類中的method()方法
StudentDemo sd = new StudentDemo();
//創(chuàng)建學(xué)生對(duì)象
Student s = new Student();
sd.method(s); //把s的地址給到了這里
}
}
匿名對(duì)象
- 匿名對(duì)象:就是沒有名字的對(duì)象。
- 是對(duì)象的一種簡(jiǎn)化表示形式
- 匿名對(duì)象的兩種使用情況
- 對(duì)象調(diào)用方法僅僅一次的時(shí)候
- 作為實(shí)際參數(shù)傳遞
- 匿名調(diào)用好處
- 匿名對(duì)象調(diào)用完畢就是垃圾嫂用⌒偷剩可以被垃圾回收器回收。
class Student {
public void show() {
System.out.println("我愛學(xué)習(xí)");
}
}
class StudentDemo {
public void method(Student s) {
s.show();
}
}
class NoNameDemo {
public static void main(String[] args) {
//帶名字的調(diào)用
Student s = new Student();
s.show();
s.show();
System.out.println("--------------");
//匿名對(duì)象
//new Student();
//匿名對(duì)象調(diào)用方法
new Student().show();
new Student().show(); //這里其實(shí)是重新創(chuàng)建了一個(gè)新的對(duì)象
System.out.println("--------------");
//匿名對(duì)象作為實(shí)際參數(shù)傳遞
StudentDemo sd = new StudentDemo();
//匿名對(duì)象
sd.method(new Student());
//再來(lái)一個(gè)
new StudentDemo().method(new Student());
}
}
封裝概述
- 封裝概述
- 是指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié)嘱函,僅對(duì)外提供公共訪問(wèn)方式甘畅。
- 好處:
- 隱藏實(shí)現(xiàn)細(xì)節(jié),提供公共的訪問(wèn)方式
- 提高了代碼的復(fù)用性
- 提高安全性往弓。
- 封裝原則:
- 將不需要對(duì)外提供的內(nèi)容都隱藏起來(lái)橄浓。
- 把屬性隱藏,提供公共方法對(duì)其訪問(wèn)亮航。
- 注:
- 測(cè)試類一般只創(chuàng)建對(duì)象荸实,調(diào)用方法。
private關(guān)鍵字
-
private關(guān)鍵字:
- 是一個(gè)權(quán)限修飾符,是封裝的一種體現(xiàn)缴淋。
- 可以修飾成員(成員變量和成員方法)
- 被private修飾的成員只在本類中才能訪問(wèn)准给。
-
private最常見的應(yīng)用:
- 把成員變量用
private
修飾 - 提供對(duì)應(yīng)的getXxx()/setXxx()方法
- 一個(gè)標(biāo)準(zhǔn)的案例的使用
- 把成員變量用
this關(guān)鍵字
-
this
:代表所在類的對(duì)象引用 - 記仔⒘琛:
- 方法被哪個(gè)對(duì)象調(diào)用供搀,this就代表那個(gè)對(duì)象
class Student {
//姓名
private String name;
//年齡
private int age;
//姓名獲取值
public String getName() {
return name;
}
//姓名設(shè)置值
public void setName(String name) { //name = "林青霞";
//Student.name = name;
this.name = name;
}
//年齡獲取值
public int getAge() {
return age;
}
//年齡賦值
public void setAge(int age) {
this.age = age;
}
}
//測(cè)試類
class StudentTest {
public static void main(String[] args) {
//創(chuàng)建學(xué)生對(duì)象
Student s = new Student();
//給成員變量賦值
s.setName("林青霞");
s.setAge(27);
//獲取數(shù)據(jù)
System.out.println(s.getName()+"---"+s.getAge());
}
}
構(gòu)造方法
- 構(gòu)造方法作用概述
- 給對(duì)象的數(shù)據(jù)進(jìn)行初始化
- 構(gòu)造方法格式
- 方法名與類名相同
- 沒有返回值類型,連void都沒有
- 沒有具體的返回值含长。(可以有return钟沛;這一語(yǔ)句畔规,表示方法到這里結(jié)束)
- 構(gòu)造方法注意事項(xiàng)
- 如果你不提供構(gòu)造方法,系統(tǒng)會(huì)給出默認(rèn)無(wú)參構(gòu)造方法
- 如果你提供了構(gòu)造方法恨统,系統(tǒng)將不再提供默認(rèn)的無(wú)參構(gòu)造方法叁扫。必須自己給出三妈。(建議永遠(yuǎn)自己給出無(wú)參構(gòu)造方法!)
- 構(gòu)造方法也是可以重載的
class Student {
private String name;
private int age;
public Student() {
System.out.println("這是無(wú)參構(gòu)造方法");
}
//構(gòu)造方法的重載格式
public Student(String name) {
System.out.println("這是帶一個(gè)String類型的構(gòu)造方法");
this.name = name;
}
public Student(int age) {
System.out.println("這是帶一個(gè)int類型的構(gòu)造方法");
this.age = age;
}
public Student(String name,int age) {
System.out.println("這是一個(gè)帶多個(gè)參數(shù)的構(gòu)造方法");
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name+"---"+age);
}
}
class ConstructDemo2 {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Student s = new Student();
s.show();
System.out.println("-------------");
//創(chuàng)建對(duì)象2
Student s2 = new Student("林青霞");
s2.show();
System.out.println("-------------");
//創(chuàng)建對(duì)象3
Student s3 = new Student(27);
s3.show();
System.out.println("-------------");
//創(chuàng)建對(duì)象4
Student s4 = new Student("林青霞",27);
s4.show();
}
}
一個(gè)基本類的標(biāo)準(zhǔn)代碼寫法
- 類
- 成員變量
- 構(gòu)造方法
- 無(wú)參構(gòu)造方法
- 帶參構(gòu)造方法
- 成員方法
- getXxx()
- setXxx()
- 給成員變量賦值的方式
- 無(wú)參構(gòu)造方法+setXxx()
- 帶參構(gòu)造方法
/*
一個(gè)標(biāo)準(zhǔn)代碼的最終版莫绣。
學(xué)生類:
成員變量:
name畴蒲,age
構(gòu)造方法:
無(wú)參,帶兩個(gè)參
成員方法:
getXxx()/setXxx()
show():輸出該類的所有成員變量值
給成員變量賦值:
A:setXxx()方法
B:構(gòu)造方法
輸出成員變量值的方式:
A:通過(guò)getXxx()分別獲取然后拼接
B:通過(guò)調(diào)用show()方法搞定
*/
class Student {
//姓名
private String name;
//年齡
private int age;
//構(gòu)造方法
public Student() {
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//輸出所有的成員變量值
public void show() {
System.out.println(name+"---"+age);
}
}
//測(cè)試類
class StudentTest {
public static void main(String[] args) {
//方式1給成員變量賦值
//無(wú)參構(gòu)造+setXxx()
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(27);
//輸出值
System.out.println(s1.getName()+"---"+s1.getAge());
s1.show();
System.out.println("----------------------------");
//方式2給成員變量賦值
Student s2 = new Student("劉意",30);
System.out.println(s2.getName()+"---"+s2.getAge());
s2.show();
}
}
Student s = new Student();在內(nèi)存中做了哪些事情?
- 加載Student.class文件進(jìn)內(nèi)存
- 在棧內(nèi)存為s開辟空間
- 在堆內(nèi)存為學(xué)生對(duì)象開辟空間
- 對(duì)學(xué)生對(duì)象的成員變量進(jìn)行默認(rèn)初始化
- 對(duì)學(xué)生對(duì)象的成員變量進(jìn)行顯示初始化
- 通過(guò)構(gòu)造方法對(duì)學(xué)生對(duì)象的成員變量賦值
- 學(xué)生對(duì)象初始化完畢对室,把對(duì)象地址賦值給s變量
static關(guān)鍵字
- 可以修飾成員變量和成員方法
-
static
關(guān)鍵字特點(diǎn)- 隨著類的加載而加載
- 優(yōu)先于對(duì)象存在
- 被類的所有對(duì)象共享
- 這也是我們判斷是否使用靜態(tài)關(guān)鍵字的條件
- 可以通過(guò)類名調(diào)用,也可以通過(guò)對(duì)象調(diào)用模燥。
- static關(guān)鍵字注意事項(xiàng)
- 在靜態(tài)方法中是<font color = red>沒有this關(guān)鍵字</font>的(無(wú)法從靜態(tài)上下文引用非靜態(tài) 變量 xxx)
- 因?yàn)殪o態(tài)時(shí)隨著類的加載而加載,
this
是隨著對(duì)象的創(chuàng)建而存在掩宜。 - 靜態(tài)比對(duì)象先存在蔫骂。
- 因?yàn)殪o態(tài)時(shí)隨著類的加載而加載,
-
靜態(tài)方法
只能訪問(wèn)靜態(tài)的成員變量
和靜態(tài)的成員方法
,非靜態(tài)方法可以隨意訪問(wèn)牺汤。
- 在靜態(tài)方法中是<font color = red>沒有this關(guān)鍵字</font>的(無(wú)法從靜態(tài)上下文引用非靜態(tài) 變量 xxx)
class Teacher {
public int num = 10;
public static int num2 = 20;
public void show() {
System.out.println(num); //隱含的告訴你訪問(wèn)的是成員變量
System.out.println(this.num); //明確的告訴你訪問(wèn)的是成員變量
System.out.println(num2);
}
public static void method() {
//無(wú)法從靜態(tài)上下文中引用非靜態(tài) 變量 num
//System.out.println(num);
System.out.println(num2);
//無(wú)法從靜態(tài)上下文中引用非靜態(tài) 方法 function()
//function();
function2();
}
public void function() {
}
public static void function2() {
}
}
class TeacherDemo {
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Teacher t = new Teacher();
t.show();
System.out.println("------------");
t.method();
}
}
靜態(tài)變量和成員變量的區(qū)別
- 所屬不同
- 靜態(tài)變量屬于類纠吴,所以也稱為為類變量
- 成員變量屬于對(duì)象,所以也稱為實(shí)例變量(對(duì)象變量)
- 內(nèi)存中位置不同
- 靜態(tài)變量存儲(chǔ)于方法區(qū)的靜態(tài)區(qū)
- 成員變量存儲(chǔ)于堆內(nèi)存
- 內(nèi)存出現(xiàn)時(shí)間不同
- 靜態(tài)變量隨著類的加載而加載慧瘤,隨著類的消失而消失
- 成員變量隨著對(duì)象的創(chuàng)建而存在戴已,隨著對(duì)象的消失而消失
- 調(diào)用不同
- 靜態(tài)變量可以通過(guò)類名調(diào)用,也可以通過(guò)對(duì)象調(diào)用
- 成員變量只能通過(guò)對(duì)象名調(diào)用
main方法是靜態(tài)的
-
public static void main(String[] args) {}
- public 公共的锅减,訪問(wèn)權(quán)限最大糖儡,因?yàn)楸籮vm調(diào)用,需要訪問(wèn)權(quán)限足夠大怔匣。
- static 靜態(tài)的握联,不需要?jiǎng)?chuàng)建對(duì)象,被jvm調(diào)用每瞒,不用創(chuàng)建對(duì)象金闽,直接類名訪問(wèn)
- void被jvm調(diào)用,不需要給jvm返回值
- main 一個(gè)通用的名稱剿骨,雖然不是關(guān)鍵字代芜,但是被jvm識(shí)別
- String[] args 以前用于接收鍵盤錄入的
- eg:java MainDemo hello world java