類
成員變量和局部變量的區(qū)別?
-
在類中的位置不同
成員變量:在類中方法外
局部變量:在方法定義中或者方法聲明上
-
在內(nèi)存中的位置不同
成員變量:在堆內(nèi)存
局部變量:在棧內(nèi)存
-
生命周期不同
成員變量:隨著對象的創(chuàng)建而存在,隨著對象的消失而消失
局部變量:隨著方法的調(diào)用而存在,隨著方法的調(diào)用完畢而消失
-
初始化值不同
成員變量:有默認初始化值
局部變量:沒有默認初始化值,必須定義,賦值,然后才能使用。
-
注意事項:
- 局部變量名稱可以和成員變量名稱一樣,在方法中使用的時候,采用的是就近原則。
方法
方法就是函數(shù),function,是為了完成特定功能的代碼塊
修飾符 返回值類型 方法名(參數(shù)類型 參數(shù)名1,參數(shù)類型 參數(shù)名2…) {
函數(shù)體;
return 返回值;
}
- 定義函數(shù)可以將功能代碼進行封裝
- 便于對該功能進行復用
- 函數(shù)只有被調(diào)用才會被執(zhí)行
(當函數(shù)被調(diào)用的時候,jvm虛擬機會在內(nèi)存中給該函數(shù)分配一塊內(nèi)存空間,該內(nèi)存空間里面可以定義該函數(shù)所用到的一些變量,當方法執(zhí)行完畢之后,該內(nèi)存空間會被釋放掉。)調(diào)用完成,函數(shù)執(zhí)行完畢。 - 函數(shù)的出現(xiàn)提高了代碼的復用性
- 對于函數(shù)沒有具體返回值的情況,返回值類型用關鍵字void表示,那么該函數(shù)中的return語句如果在最后一行可以省略不寫。
注意:
- 調(diào)用方法時可以不接受方法返回的值,且不會報錯
- 函數(shù)中只能調(diào)用函數(shù),不可以在函數(shù)內(nèi)部定義函數(shù)。
方法重載
- 同一個類中,允許存在一個以上的同名的方法,參數(shù)個數(shù),參數(shù)類型不同
- 與返回值類型無關,只看方法名和參數(shù)列表
- 虛擬機通過參數(shù)列表的不同來區(qū)分同名方法
public void repeatName () { } public void repeatName (int i) { } public void repeatName (double i) { }
形參
基本類型:形式參數(shù)的改變不影響實際參數(shù)
-
引用類型:傳入一個類的對象,形參是該對象的一個引用,形式參數(shù)的改變直接影響實際參數(shù)
- 類名:需要的是該類的對象
- 抽象類:需要的是該抽象的類子類對象,用具體子類實現(xiàn)
- 接口:需要的是該接口的實現(xiàn)類對象,用具體子類實現(xiàn)
String是引用類型,但不能進行地址傳遞
//抽象類
abstract class Person {
public abstract void study();
}
class PersonDemo {
public void method(Person p) {//p; p = new Student(); Person p = new Student(); //多態(tài)
p.study();
}
}
//定義一個具體的學生類
class Student extends Person {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
class PersonTest {
public static void main(String[] args) {
//目前是沒有辦法的使用的
//因為抽象類沒有對應的具體類
//那么,我們就應該先定義一個具體類
//需求:我要使用PersonDemo類中的method()方法
PersonDemo pd = new PersonDemo();
Person p = new Student();
pd.method(p);
}
}
//接口
//定義一個愛好的接口
interface Love {
public abstract void love();
}
class LoveDemo {
public void method(Love l) { //l; l = new Teacher(); Love l = new Teacher(); 多態(tài)
l.love();
}
}
//定義具體類實現(xiàn)接口
class Teacher implements Love {
public void love() {
System.out.println("老師愛學生,愛Java,愛林青霞");
}
}
class TeacherTest {
public static void main(String[] args) {
//需求:我要測試LoveDemo類中的love()方法
LoveDemo ld = new LoveDemo();
Love l = new Teacher();
ld.method(l);
}
}
返回值
引用類型:
- 類:返回的是該類的對象
- 抽象類:返回的是該抽象類的子類對象
- 接口:返回的是該接口的實現(xiàn)類的對象
- 類
class Student {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
class StudentDemo {
public Student getStudent() {
return new Student();
}
}
- 抽象類
abstract class Person {
public abstract void study();
}
class PersonDemo {
public Person getPerson() {
//Person p = new Student();
//return p;
return new Student();
}
}
class Student extends Person {
public void study() {
System.out.println("Good Good Study,Day Day Up");
}
}
- 接口
interface Love {
public abstract void love();
}
class LoveDemo {
public Love getLove() {
//Love l = new Teacher();
//return l;
return new Teacher();
}
}
//定義具體類實現(xiàn)接口
class Teacher implements Love {
public void love() {
System.out.println("老師愛學生,愛Java,愛林青霞");
}
}
構(gòu)造方法
給對象的屬性賦初值
- 構(gòu)造方法格式
方法名與類名相同
沒有返回值類型,連void都沒有
-
沒有具體的返回值
public Student(){ } public Student(String name1, int sge) { //構(gòu)造函數(shù)可以重載 this.name1 = name1; this.sge = sge; }
- 默認構(gòu)造:建議自己給出無參構(gòu)造
- 如果你不提供構(gòu)造方法,系統(tǒng)會給出默認構(gòu)造方法
- 如果你提供了構(gòu)造方法,系統(tǒng)將不再提供
創(chuàng)建對象
Student s = new Student();
加載過程
- 加載Student.class文件進內(nèi)存
- 在棧內(nèi)存為s開辟空間
- 在堆內(nèi)存為學生對象開辟空間
- 對學生對象的成員變量進行默認初始化
- 對學生對象的成員變量進行顯示初始化
- 通過構(gòu)造方法對學生對象的成員變量賦值
- 學生對象初始化完畢,把對象地址賦值給s變量
匿名對象
匿名對象:就是沒有名字的對象。
匿名對象的應用場景:
- 調(diào)用方法,僅僅只調(diào)用一次的時候。
- 好處:匿名對象調(diào)用完畢就是垃圾。可以被垃圾回收器回收。
- 匿名對象可以作為實際參數(shù)傳遞
Class s = new Class();
s.method();
new Class().method();
new Class().method(new Class());