一概荷、類與對象
類:類是一個模板攒射,描述一類對象的狀態(tài)和行為;
對象:對象為類的一個實例猎唁,具有自己的屬性(狀態(tài))和方法(行為)咒劲;
java是一種面向?qū)ο蟮恼Z言,類的基本特征有:
繼承胖秒、多態(tài)缎患、抽象、封裝阎肝;
類是對象的描述挤渔,對象是類的實例;
類的聲明
[public] [abstract|final] class 類名 [extends 超類名] [implements 接口名]{
成員變量风题;
方法判导;
}
public class clock{
int hour;
int minute;
public int gethour(){
return hour;
}
}
對象引用的聲明
類名 引用名 = new 類名();
new 動態(tài)分配內(nèi)存空間;
clock c= new clock();
數(shù)據(jù)成員:
數(shù)據(jù)類型 變量名 [= 初始值]沛硅;
方法成員:
[public|private|protected|default] [static] [final] 返回類型 方法名字 (參數(shù)列表){
函數(shù)體;
}
實例變量
1眼刃、未使用static 修飾的成員變量;
2摇肌、調(diào)用只能為: 變量名.實例變量擂红;
類(靜態(tài))變量
1、使用 static 修飾的變量围小;
2昵骤、調(diào)用可以為: 變量名.類變量 或者 類.類變量;
3肯适、在整個類中只有一個值变秦,初始化時被賦值;
4框舔、其使用的情況為:
a蹦玫、類中所有對象都相同的屬性赎婚;
b、經(jīng)常要共享的數(shù)據(jù)樱溉;
public class CD {
int publictime;
double price;
static String sex = new String("male"); //靜態(tài)變量
public static void main(String[] args) {
CD c=new CD();
CD d=new CD();
System.out.println(c.sex+' '+d.sex+' '+CD.sex);
d.sex="female";
System.out.println(c.sex+' '+d.sex+' '+CD.sex);
}
}
// output //
male male
female female
同理挣输,還有實例方法以及類(靜態(tài))方法;
對象的初始化
采用構(gòu)造方法:
1饺窿、方法與類名相同歧焦;
2、不定義返回類型肚医;
3绢馍、通常為public修飾符;
4肠套、未顯式聲明時舰涌,生成默認的構(gòu)造方法;
5你稚、子類無法繼承超類的構(gòu)造器瓷耙;
備注:默認的構(gòu)造方法為:數(shù)值類定義為 0,字符型定義為 null刁赖;
布爾型默認為 false;
對于繼承而已搁痛,子類會默認調(diào)用父類的構(gòu)造器,但是如果沒有默認的父類構(gòu)造器宇弛,子類必須要顯示的指定父類的構(gòu)造器鸡典,而且必須是在子類構(gòu)造器中做的第一件事(第一行代碼)。
public class CD {
int publictime; // 隱式賦值枪芒;
double price;
final int nums=12; //希望該屬性為常量,則采用 final 修飾彻况;
// 初始化必須為 屬性定義時或者構(gòu)造函數(shù)內(nèi)部;
static String sex = new String("male");
public CD(double price){ //構(gòu)造函數(shù)
this.price=price; //當參數(shù)與成員變量同名時舅踪,采用this纽甘;
// this 是指當前對象;
}
public static void main(String[] args) {
CD c=new CD(2.0);
System.out.println("c.price="+c.price+" "+"c.publictime="+c.publictime);
}
c.price=2.0 c.publictime=0
可變長參數(shù)
利用一個數(shù)組來包裹要傳遞的實參;
二抽碌、包(package)
包是一組類的集合悍赢,可以包含多個類,也可以包含多個子包货徙;
包的作用:
1泽裳、將相關(guān)源代碼文件組織在一起;
2破婆、命名空間的管理,劃分命名空間胸囱;
3祷舀、提供包的分裝和提取;
編譯單元:一個java源文件稱為一個編譯單元裳扯;
包的引入 : import packagename. . .
一個編譯單元只能有一個public類抛丽;
包的聲明
package 名字
未命名的包,默認包:所有未聲明包的編譯單元都放在一個默認包內(nèi)饰豺;
類的訪問控制權(quán)限亿鲜,與修飾符有關(guān):
三、類的重用
1冤吨、 類的繼承
類的繼承:
1蒿柳、從已包含類中生成新的類;
2漩蟆、java只支持單繼承垒探,即一個子類只能有一個超類;
3怠李、新類擁有超類所有的屬性和方法(跟修飾符有關(guān))圾叼;
4、提升的代碼的重用捺癞,提高抽象程度夷蚊;
5、從外部看髓介,子類擁有和超類相同的接口惕鼓;
繼承的語法為:
[public] class 子類名 extends 父類名 {}
class SuperClass {
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n) {
System.out.println("SuperClass(int n)");
this.n = n;
}
}
class SubClass extends SuperClass{
private int n;
SubClass(){
super(300);
System.out.println("SubClass");
}
public SubClass(int n){
System.out.println("SubClass(int n):"+n);
this.n = n;
}
}
public class TestSuperSub{
public static void main (String args[]){
SubClass sc = new SubClass();
SubClass sc2 = new SubClass(200);
}
SuperClass(int n)
SubClass
SuperClass()
SubClass(int n):200
2、隱藏和覆蓋
隱藏:子類對于超類繼承過來的屬性和方法版保,如果子類定義了和超類相同的成員變量呜笑,則超類被子類隱藏;
此時訪問超類的成員變量彻犁,采用關(guān)鍵字 super;
方法的覆蓋:
要求覆蓋方法的訪問權(quán)限可以比被覆蓋權(quán)限的訪問權(quán)限廣叫胁,但不能更加嚴格;
派生類汞幢,必須覆蓋超類中的抽象方法驼鹅,超類中聲明的final (終結(jié)方法)不能被覆蓋,static方法不能被覆蓋森篷;
同時输钩,java中所有類,直接或者間接的繼承自 Object 類仲智;
Object 類
”== " and “ equals "
Object 類的 equals 定義為:
public boolean equals(Object x){
return this == x;
}
”equals“ 表示:
兩個對象永遠相同的數(shù)據(jù)類型以及相同的屬性值 买乃;
equals 需要重寫;
final 類 和 final 方法
1钓辆、final修飾的類和方法剪验;
2肴焊、終結(jié)類或方法不能被繼承;
3功戚、終結(jié)類或者方法不能被覆蓋娶眷;
如String 類為終結(jié)類,終結(jié)類或者方法對系統(tǒng)運行較為重要啸臀,故無法被繼承和覆蓋届宠;
抽象類
1、類名前加 abstract 抽象符乘粒;
2豌注、無法進行實例化;
3谓厘、只有子類實現(xiàn)了超類的所有抽象屬性和方法幌羞,子類才能被實例化;
結(jié)構(gòu)為:
abstract class 類名{
public abstract 返回體 命名{
}
}
其優(yōu)點為:
隱藏具體的細節(jié)信息竟稳,所有子類使用都含有相同的行為属桦;
接口
1、類設(shè)計的多繼承他爸;
2聂宾、建立類與類之間的關(guān)系;
3诊笤、將類根據(jù)其實現(xiàn)的功能分組用作接口系谐;
定義為:
[接口修飾符] interfce 接口名稱 [extends 父接口]{
}
1、接口數(shù)據(jù)成員一點要有初值讨跟,且其值無法改變纪他;
2、接口方法必須為抽象方法晾匠;
3茶袒、final 及 abstract 可以省凉馆;
4薪寓、接口無法實例化;
5澜共、可以通過多繼承接口向叉,實現(xiàn)多繼承;
集成接口的語法為
public class 類名 implements 接口名稱1 接口名2{
抽象方法體的實現(xiàn)嗦董;
聲明更多的屬性及方法母谎;
}
類的多態(tài)
類的多態(tài):
多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運行期間才確定京革,即一個引用變量倒底會指向哪個類的實例對象销睁,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法供璧,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類冻记,這樣,不用修改源程序代碼来惧,就可以讓引用變量綁定到各種不同的類實現(xiàn)上冗栗,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼供搀,讓程序可以選擇多個運行狀態(tài)隅居,這就是多態(tài)性。
理解多態(tài)必須理解向上轉(zhuǎn)型:
public class meida {
int publictime;
double price;
static String sex = new String("male");
public meida(){
//price=21; // 類型的隱式轉(zhuǎn)換
this(0,21.00);
}
public meida(int publictime,double price){
this.publictime=publictime;
this.price=price;
this.sex="female";
}
public double getprice(){
return price;
}
}
public class CD extends meida{
int like;
public CD(int a,double b){
super(a,b);
like=12;
}
public int getlike(){
return like;
}
public static void main(String[] args) {
meida c=new CD(5,21.0);
//System.out.println(c.getlike); //c為meida類葛虐,沒有g(shù)etlike方法
}
}
public class Wine {
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}
public void fun2(){
System.out.println("Wine 的Fun2...");
}
}
public class JNC extends Wine{
/**
* @desc 子類重載父類方法
* 父類中不存在該方法胎源,向上轉(zhuǎn)型后,父類是不能引用該方法的
* @param a
* @return void
*/
public void fun1(String a){
System.out.println("JNC 的 Fun1...");
fun2();
}
/**
* 子類重寫父類方法
* 指向子類的父類引用調(diào)用fun2時屿脐,必定是調(diào)用該方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}
public class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
-------------------------------------------------
Output:
Wine 的Fun.....
JNC 的Fun2...
指向子類的父類引用由于向上轉(zhuǎn)型了涕蚤,它只能訪問父類中擁有的方法和屬性,而對于子類中存在而父類中不存在的方法的诵,該引用是不能使用的万栅,盡管是重載該方法。若子類重寫了父類中的某些方法西疤,在調(diào)用該些方法的時候烦粒,必定是使用子類中定義的這些方法(動態(tài)連接、動態(tài)調(diào)用)代赁。
對于面向?qū)ο蠖匀潘鄳B(tài)分為編譯時多態(tài)和運行時多態(tài)。其中編輯時多態(tài)是靜態(tài)的芭碍,主要是指方法的重載徒役,它是根據(jù)參數(shù)列表的不同來區(qū)分不同的函數(shù),通過編輯之后會變成兩個不同的函數(shù)豁跑,在運行時談不上多態(tài)廉涕。而運行時多態(tài)是動態(tài)的,它是通過動態(tài)綁定來實現(xiàn)的艇拍,也就是我們所說的多態(tài)性狐蜕。
當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法卸夕,但是這個被調(diào)用的方法必須是在超類中定義過的层释,也就是說被子類覆蓋的方法,但是它仍然要根據(jù)繼承鏈中方法調(diào)用的優(yōu)先級來確認方法快集,該優(yōu)先級為:this.show(O)贡羔、super.show(O)廉白、this.show((super)O)、super.show((super)O)乖寒。