java筆記3
對象的特征:狀態(state)和行為(behabior)
人 身高,體重 吃飯,睡覺
現實世界對象的狀態保存在軟件對象的變量中,先是世界對象的行為通過軟件對象的方法(函數)來實現、。
類和對象
把相似的對象歸成一個類。
類就是模版定義了通用與一個特定種類的所有對象的狀態(變量)和行為(方法)
類是創建對象的模版,對象是類的實例。
掌握面向對象的難點在于思路的轉換,我們通常考慮解決問題的方法。而不是考慮將問題抽象成對象再去解決它。
編寫一個駕駛汽車的方法
面向過程的程序設計: 編寫一個方法,void drivercar();
面向對象的程序設計: 將一輛汽車看成一個對象,將所有汽車對象的共性抽取出來,設計一個類Car,
類中有一個方法void drive(),用Car這個類實例化一個具體的對象car,調用:car.drive().
new關鍵字的作用。
為對象分配內存空間,引起對象構造方法的調用。為對象返回一個引用。
構造方法的名字和類名相同,并且沒有返回值。
構造方法主要用于為類的對象定義初始化狀態。
我們不能直接調用構造方法,必須通過new關鍵字來自動調用,從而創建類的實例。
java的類都要求有構造方法,如果沒有定義構造方法,java編譯器會為我們提供一個缺省的構造方法,也就是不帶參數的構造方法。
缺省構造方法默認值:數值 0
booeean false
char ”\0"
對象 null
方法的重載:重載構成的條件:方法的名稱相同,但是參數類型或參數個數不同,才能構成方法的重載。
特殊變量this
this變量代表對象本身。
當類中有兩個同名變量,一個屬于類(類的成員變量),而另一個屬于某個特定的方法(方法的局部變量),
使用this區分成員變量和局部變量
使用this簡化構造函數的調用。可以通過不帶參數的構造方法調用帶參數的構造方法。
Point(int a,int b)
{
x=a;
y=b;
}
Point()
{
this(1,2);
}
一個類所有的實力(對象)調用的成員方法在內存中只有一份拷貝,盡管在內存中可能有多個對象,
而數據成員在類的每個對象所在內存中都存在這一份拷貝。this變量允許相同的實例方法為不同的對象工作。
每當調用一個實例方法時,this變量將被設置成引用改實例方法的特定的類對象。方法的代碼接著會與this所代表的特定數據建立關聯。
內存模型 的概念
靜態方法和靜態變量時屬于某一個類,而不屬于類的對象。
靜態方法和靜態變量的引用直接通過類名引用。
在靜態方法中不能調用非靜態的方法和引用非靜態的成員變量。反之,則可以。
可以用類的對象obj去調用靜態的方法method(),如 obj。method()。
final定義的變量要在定義時初始化也可以放在構造函數中實現
常量通常定義為靜態的,是為了節省內存。這時就要在定義時初始化。
final定義的常量一般默認用大寫。
繼承
繼承是面向對象的關鍵
在java中,通過關鍵字extends繼承一個已有的類,被繼承的稱為父類(超類,基類),新的類稱為子類(派生類)。
在java中,不允許多繼承。
方法的覆蓋
在子類中定義一個與父類同名、返回類型、參數類型均相同的一個方法,稱為方法的覆蓋。覆蓋發生在子類與父類之間。
class Animal
{
int height,weight;
void eat()
{
System.out.println("animal eat");
}
void breathe()
{
System.out.println("animal breathe");
}
void sleep()
{
System.out.println("animal sleep");
}
}
class Fish extends Animal
{
void breathe()
{
System.out.println("fish bubble");
}
}
class Integration
{
public static void main(String[] args)
{
Animal an=new Animal();
Fish fh= new Fish();
an.breathe();
fh.height=30;
fh.breathe();
}
}
特殊變量super,提供了對父類的訪問。
可以使用super訪問父類被子類隱藏的變量或覆蓋的方法。
每個子類構造方法的第一條語句,都是隱含的調用super(),如果父類沒有這種形勢的構造函數,那么在編譯的時候就會報錯。
class Animal
{
int height,weight;
void eat()
{
System.out.println("animal eat");
}
void breathe()
{
System.out.println("animal breathe");
}
void sleep()
{
System.out.println("animal sleep");
}
}
class Fish extends Animal
{
void breathe()
{
super.breathe();
super.height=40;
System.out.println("fish bubble");
}
}
class Integration
{
public static void main(String[] args)
{
//Animal an=new Animal();
Fish fh= new Fish();
//an.breathe();
fh.height=30;
fh.breathe();
}
}
多態性,子類有就調用子類的。沒有就調用父類的
instanceof
比較一個實例是否是一個類的實例