java面向?qū)ο缶幊?/h1>

1.1.1 類與對象

一個(gè)問題器罐?[Demo107.java]

張老太養(yǎng)了兩只貓貓:一只名字叫小白,今年3歲渐行,白色轰坊。還有一只叫小花,今年100歲祟印,花色肴沫。請編寫一個(gè)程序,當(dāng)用戶輸入小貓的名字時(shí)蕴忆,就顯示該貓的名字颤芬,年齡,顏色套鹅。如果用戶輸入的小貓名錯(cuò)誤站蝠,則顯示張老太沒有這只貓貓。

//用前面學(xué)習(xí)過的知識寫出代碼
public class Demo107{
    public static void main(String []args){
        int a=49;//輸入的名字49卓鹿,50
        int cat1age=3; //第一只貓
        String cat1name="小白";
        String cat1color="白色";
        int cat2age=100; //第二只貓
        String cat2name="小花";
        String cat2color="花色";
        switch(a){
        case '1':
            System.out.println(cat1age+cat1color);
            break;
        case '2':
            System.out.println(cat2age+cat2color);
            break;
        default:
            System.out.println("張老太沒有這只貓!");
        }
    }
}

java語言是面向?qū)ο蟮?/p>

計(jì)算機(jī)語言的發(fā)展向接近人的思維方式演變

匯編語言 [面向機(jī)器]

c語言 [面向過程]

java語言 [面向?qū)ο骫

類和對象的關(guān)系

把貓的特性提取出來-->貓類-->對象(實(shí)例)-->對象(實(shí)例)-->...

注意:從貓類到對象菱魔,目前有幾種說法:
1、創(chuàng)建一個(gè)對象减牺;
2豌习、實(shí)例化一個(gè)對象存谎;
3拔疚、對類實(shí)例化...以后大家聽到這些說法,不要模糊既荚。( 對象就是實(shí)例稚失,實(shí)例就是對象)java最大的特點(diǎn)就是面向?qū)ο蟆?/strong>

//定義貓類
public class Demo105{
    public static void main(String []args){
        //創(chuàng)建一個(gè)貓對象
        Cat cat1=new Cat();//Cat是定義的一個(gè)數(shù)據(jù)類型
        //Cat cat1;
        //cat1=new Cat();// 等同于 Cat cat1=new Cat();
        //訪問屬性的 對象名.屬性名字
        cat1.age=3;
        cat1.name="小白";
        cat1.color="白色";

        //創(chuàng)建第二只貓
        Cat cat2=new Cat();
        cat2.age=100;
        cat2.name="小花";
        cat2.color="花色";  
    }
}

//java中如何定義一個(gè)類?[類名的首寫字母大寫]可根據(jù)程序的需要定義類
class Cat{
    //下面的就是類的成員變量/屬性
    int agr;
    String name;
    String color;
    Master myMaster;
}

//引用類型恰聘,比如建個(gè)主人類
class Master{
    int age;
    String name;
    String address;
}

類和對象的區(qū)別和聯(lián)系

1句各、類是抽象的吸占,概念的,代表一類事物凿宾,比如人類矾屯,貓類..

2、對象是具體的初厚,實(shí)際的件蚕,代表一個(gè)具體事物

3、類對象的模板产禾,對象是類的一個(gè)個(gè)體排作,實(shí)例

-- 如何定義類

一個(gè)全面的類定義比較復(fù)雜,如:

package 包名;
class 類名 extends 父類 implements
接口名{
 成員變量;
 構(gòu)造方法;
 成員方法;
}

要透徹的掌握類亚情,必須要了解類的構(gòu)成

class 類名{ ----> 待定...

  成員變量;

}

1. -- 類的成員變量 :

成員變量是類的一個(gè)組成部分妄痪,一般是基本數(shù)據(jù)類型,也可是引用類型楞件。比如我們前面定義貓類的int age 就是成員變量衫生。

2. 對象 -- 如何創(chuàng)建對象 :

創(chuàng)建一個(gè)對象有兩種方法

1、先聲明再創(chuàng)建

1 履因、對象聲明:類名 對象名

2 障簿、對象創(chuàng)建:對象名=new 類名()

2、一步到位法

類名 對象名=new 類名()

對象--如何訪問(使用)對象的成員變量

對象名 . 變量名; // 簡單先這樣理解栅迄,以后加下控制符此表達(dá)就不準(zhǔn)確了站故。

  • 對象總是存在內(nèi)存中的

一個(gè)小思考題[Demo.105.java]

為了讓大家加深印象,我們定義一個(gè)人類(Person)(包括名字毅舆、年齡)西篓。用一步到位法去創(chuàng)建一個(gè)對象

我們看看下面一段代碼:

System.out.printlin(b.age);

Person a=new Person(); →  請問:b.age究竟是多少?

a.age=10;

a.name="小明";

Person b;

b=a;
  • 對象總是存在內(nèi)存中的

一個(gè)小思考題[Demo106.java]

在明白對象是如何在內(nèi)存中存在后憋活,請大家再看看下面的思考題岂津,請問會(huì)輸出什么信息吮成?

Person1 a=new Person1();

a.age=10;

a.name="小明";

Person1 b;

b=a;

System.out.println(b.name);//輸出“小明”

b.age=200;

System.out.println(a.age);//輸出a.age為200
  • 重點(diǎn)也是難點(diǎn)

類--成員方法的初步介紹

在某些情況下辜梳,我們要需要定義成員方法粱甫。比如人類:除了有一些屬性外(成員變量表示的年齡、姓名...)作瞄,我們?nèi)祟愡€有一些行為比如:可以說話茶宵、跑步..宗挥,通過學(xué)習(xí),我們?nèi)祟愡€可以做算術(shù)題螃征。這時(shí)就要用成員方法才能完成。現(xiàn)在要求對Person類完善:

1透敌、添加speak成員方法会傲,輸入出:我是一個(gè)好人

2、添加jisuan成員方法退渗,可以計(jì)算從1+..+1000的結(jié)果

3沟涨、修改jisuan成員方法,該方法可以接收一個(gè)數(shù)n,計(jì)算從1+..+n的結(jié)果

4从铲、添加add成員方法瘪校,可以計(jì)算兩個(gè)數(shù)的和

3. -- 類的成員方法 ( 成員函數(shù) ) 定義 :

成員方法也叫成員函數(shù)澄暮,這里希望大家不要被兩個(gè)名詞搞暈了名段。

public 返回?cái)?shù)據(jù)類型 方法名(參數(shù)列表)
    {
        語句;//方法(函數(shù))主體
    }

1阱扬、參數(shù)列表:表示成員函數(shù)輸入

2、數(shù)據(jù)類型(返回類型):表示成員函數(shù)輸出

3伸辟、函數(shù)主體:表示為了實(shí)現(xiàn)某一功能代碼塊

//類的調(diào)用及方法調(diào)用[Demo108.java]
public class Demo108{
    public static void main(String []args){
    Person p1=new Person();
    p1.speak();//調(diào)用speak方法
    p1.jiSuan();//調(diào)用計(jì)算方法
    p1.jiSuan(200);//調(diào)用可以傳入?yún)?shù)的計(jì)算方法
    p1.add(12,10);//調(diào)用兩個(gè)數(shù)的和
    
    int res=p1.add2(23,34);//調(diào)用兩個(gè)數(shù)的和并返回值到res中
    System.out.println("res返回值是:"+res);
    System.out.println("num1+num2+num3="+p1.add3(2,2.3f,4.5f));//返回類型一定要一致否則報(bào)錯(cuò)麻惶。
}
}
//定義名字的幾個(gè)方法:
//1、駝峰法 如myCry信夫;2窃蹋、下劃線法my_cry
//方法名在有不同參數(shù)的情況下可以使用同一個(gè)方法名,即有參數(shù)和沒參數(shù)的方法可以同名
class Person{ //請注意類名首寫字母應(yīng)為大寫如Person為類名 
    int age;
    String name;
    //1静稻、可以輸出我是好人方法
    public void speak(){  //請注意方法名的首寫字母應(yīng)為小寫如speak為方法名
        System.out.println("我是一個(gè)好人");
    }
    //2警没、可以計(jì)算1+..+1000的方法
    public void jiSuan(){
        int result=0;
        for(int i=1;i<=1000;i++){
            result=result+i;
        }
    System.out.println("1+..+1000結(jié)果是"+result);
    }
    //3、帶參數(shù)的成員方法,可以輸入n值并計(jì)算1+..+n
    public void jiSuan(int n){
        int result=0;
        for(int i=1;i<=n;i++){
            result+=i;
        }
        System.out.println("1+..+n結(jié)果是"+result);
    }
    //4振湾、計(jì)算兩個(gè)數(shù)的和
    public void add(int num1,int num2){
        int result=0;   //與下面一句等同于return num1+num2;
        result=num1+num2;
        System.out.println("num1+num2="+result);
    }
    //5杀迹、計(jì)算兩個(gè)數(shù)的和,并將結(jié)果返回給主調(diào)(調(diào)用它的)函數(shù)
    //注意:返回類型和返回結(jié)果的類型要一致
    //注意:在調(diào)用某個(gè)成員方法的時(shí)候押搪,給出的具體數(shù)值的個(gè)數(shù)
    //和類型要相匹配树酪。
    public int add2(int num1,int num2){
        return num1+num2;
    }
    //6、計(jì)算兩個(gè)float數(shù)的和大州,并將結(jié)果返給主調(diào)函數(shù)
    public float add3(int num1,float num2,float num3){
        return num1+num2+num3;
    }
}

-- 類的成員方法(函數(shù))--如何理解

如何理解方法這個(gè)概念续语,給大家舉個(gè)通俗的示例:

程序員調(diào)用方法:給方法必要的輸入,方法返回結(jié)果厦画。

類的成員方法-- 聲明 :

public int test(int a);/*方法聲明*/

這句話的作用是聲明該方法疮茄,聲明的格式為:

訪問修飾符 數(shù)據(jù)類型 函數(shù)名(參數(shù)列表);

在給Person類添加add方法的例題中,我們看到的關(guān)鍵字return 根暑,它的功能是把表達(dá)式的值返回的值返回給主調(diào)函數(shù)的方法娃豹。

return 表達(dá)式;

類的成員方法(函數(shù))--特別說明

1、方法的參數(shù)列表可以是多個(gè)

案例:在Person類中編寫一個(gè)成員方法购裙,從鍵盤輸入三個(gè)數(shù)懂版,返回最大的那個(gè)數(shù)。

參數(shù)列表可以是多個(gè)躏率,并且數(shù)據(jù)類型可以是任意的類型int float double char..

    訪問修飾符 返回?cái)?shù)據(jù)類型 函數(shù)名(參數(shù)列表){
        語句; //函數(shù)主體
    }

2躯畴、方法可以沒有返回值

案例:編寫一個(gè)函數(shù),從控制臺輸入一個(gè)整數(shù)打印出對應(yīng)的金字塔薇芝。

返回類型可以是任意的數(shù)據(jù)類型(int,float,double,char..)也可以沒有返回值void表示沒有返回值

    訪問修飾符 返回?cái)?shù)據(jù)類型 函數(shù)名(形參列表){
        語句; //函數(shù)主體
    }

類的成員方法(函數(shù))--小練習(xí)

案例:編寫一個(gè)成員函數(shù)蓬抄,從鍵盤輸入一個(gè)整數(shù)(1-9),打印出對應(yīng)的乘法表[Demo110.java]

//實(shí)例鍵盤輸入打印乘法表[Demo110.java]
import java.io.*;
public class Demo110{
    public static void main(String []args){
        Cfb jiu=new Cfb();
            jiu.cf();
    }
}
class Cfb{
    public void cf(){
        try{
        //輸入流夯到,從鍵盤接收數(shù)
        InputStreamReader isr=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(isr);
        //給出提示
        System.out.println("請輸入1-9嚷缭,按0退出:");
        //從控制臺讀取一行數(shù)據(jù)
        String a1=br.readLine();
        //把String轉(zhuǎn)為int
        int num1=Integer.decode(a1);
            for(int i=1;i<=num1;i++){
                for(int j=1;j<=i;j++){
                    System.out.print(i+"×"+j+"="+(i*j)+"\t");
                }
                System.out.println();           
            }
        }catch(Exception e){
          e.printStackTrace();
         }
    }
}

案例:編寫函數(shù),使給定的一個(gè)二維數(shù)組(3×3)轉(zhuǎn)置

類定義的完善

在介紹了成員方法后,我們類的定義就可以完善一步:

class 類名{ class 類名{  待定

成員變量; →  成員變量; →        

}  成員方法;

   }

小結(jié):1.先設(shè)計(jì)類阅爽;2.然后根據(jù)類創(chuàng)建對象路幸。

小練習(xí):

1、設(shè)計(jì)計(jì)算機(jī)類付翁,要求如下:[Demo109.java]

屬性:品牌(Brand)简肴、顏色(Color)、cpu型號(CPU)百侧、內(nèi)存容量(Memory)砰识、硬盤大小(Harddisk)、價(jià)格(Price)佣渴、工作狀態(tài)(Work)

方法:打開(Open)辫狼、關(guān)閉(Close)、休眠(Sleep)

創(chuàng)建一個(gè)計(jì)算機(jī)對象辛润,調(diào)用打開予借,關(guān)閉方法

//計(jì)算機(jī)類與對象的代碼
import java.io.*;//加載IO流包
public class Demo109{
    public static void main(String []args){
        Computer Pc=new Computer();
            Pc.Brand="品牌";
            Pc.Color="顏色";
            Pc.Cpu="Cpu型號";
            Pc.Memory="內(nèi)存容量";
            Pc.Hd="硬盤容量";
            Pc.Price="價(jià)格";
            Pc.Work="工作狀態(tài)";
            try{
            //輸入流,從鍵盤接收數(shù)
            InputStreamReader isr=new InputStreamReader(System.in);
            BufferedReader br=new BufferedReader(isr);
            //給出提示
            System.out.println("請輸入0-9控制機(jī)器");
            //從控制臺讀取一行數(shù)據(jù)
            String a1=br.readLine();
            //把String轉(zhuǎn)為float
            float num1=Float.parseFloat(a1);
            if(num1==0){Pc.open();}
            else if(num1==1){Pc.close();}
            else if(num1==2){Pc.sleep();}
            else if(num1==3){System.out.println(Pc.Brand);}
            else if(num1==4){System.out.println(Pc.Color);}
            else if(num1==5){System.out.println(Pc.Cpu);}
            else if(num1==6){System.out.println(Pc.Memory);}
            else if(num1==7){System.out.println(Pc.Hd);}
            else if(num1==8){System.out.println(Pc.Price);}
            else if(num1==9){System.out.println(Pc.Work);}
            else {System.out.println("輸入錯(cuò)誤!");} 
            }catch(Exception e){ 
            e.printStackTrace();
            }
    }
}

class Computer{
    String Brand;
    String Color;
    String Cpu;
    String Memory;
    String Hd;
    String Price;
    String Work;
    public void open(){
        System.out.println("開機(jī)");
    }
    public void close(){
        System.out.println("關(guān)機(jī)");
    }
    public void sleep(){
        System.out.println("休眠");
    }
}

1频蛔、 采用面向?qū)ο笏枷朐O(shè)計(jì)超級馬里奧游戲人物


1.1.2 構(gòu)造方法(函數(shù))

類的構(gòu)造方法介紹

什么是構(gòu)造方法呢灵迫?在回答這個(gè)問題之前,我們來看一個(gè)需求:前面我們在創(chuàng)建人類的對象時(shí)晦溪,是先把一個(gè)對象創(chuàng)建好后瀑粥,再給他的年齡和姓名屬性賦值,如果現(xiàn)在我要求三圆,在創(chuàng)建人類的對象時(shí)狞换,就直接指定這個(gè)對象的年齡和姓名,該怎么做舟肉?

你可以在定義類的時(shí)候修噪,定義一個(gè)構(gòu)造方法即可。

構(gòu)造方法是類的一種特殊的方法路媚,它的主要作用是完成對新對象的初始化黄琼。它有幾個(gè)特點(diǎn):

1、方法名和類名相同

2整慎、沒有返回值

3脏款、在創(chuàng)建一個(gè)類的新對象時(shí),系統(tǒng)會(huì)自動(dòng)的調(diào)用該類的構(gòu)造方法完成對新對象的初始化裤园。

特別說明:

一個(gè)類可以定義多個(gè)不同的構(gòu)造方法撤师。

//例人類構(gòu)造方法[Demo111.java]
public class Demo111{
    public static void main(String []args){
        Person p1=new Person(12,"順平");//給予不同的初始值,調(diào)用的構(gòu)造方法不同拧揽,構(gòu)造方法雖同名剃盾,但系統(tǒng)會(huì)根據(jù)初始值來選定構(gòu)造方法腺占。
    }
}
//定義一個(gè)人類
class Person{
    int age;
    String name;
    //默認(rèn)構(gòu)造方法
    public Person(){
    }
    //構(gòu)造方法的主要用處是:初始化你的成員屬性(變量)
    //構(gòu)造方法
    public Person(int age,String name){
        System.out.println("我是構(gòu)造1");
        age=age;
        name=name;
    }
    //構(gòu)造方法2
    public Person(String name){
        System.out.println("我是構(gòu)造2");
        name=name;
    }
}

類的默認(rèn)構(gòu)造方法

有些同志可能會(huì)問?親愛的老師痒谴,我們在沒有學(xué)習(xí)構(gòu)造函數(shù)前不是也可以創(chuàng)建對象嗎衰伯?

是這樣的,如果程序員沒有定義構(gòu)造方法闰歪,系統(tǒng)會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造方法。比如Person類Person (){};

當(dāng)創(chuàng)建一個(gè)Person對象時(shí)Person per1=new Person();默認(rèn)的構(gòu)造函數(shù)就會(huì)被自動(dòng)調(diào)用蓖墅。

類的構(gòu)造方法小結(jié):

1 库倘、構(gòu)造方法名和類名相同;

2 论矾、構(gòu)造方法沒有返回值教翩;

3 、主要作用是完成對新對象的初始化贪壳;

4 饱亿、在創(chuàng)建新對象時(shí),系統(tǒng)自動(dòng)的調(diào)用該類的構(gòu)造方法闰靴;

5 彪笼、一個(gè)類可以有多個(gè)構(gòu)造方法;

6 蚂且、每個(gè)類都有一個(gè)默認(rèn)的構(gòu)造方法配猫。

類定義的改進(jìn)

在提出構(gòu)造方法后,我們類的定義就應(yīng)該更加完善了:

class 類名{ class 類名{ class 類名{

成員變量; 成員變量; 成員變量;

} →  成員方法; →  構(gòu)造方法; →  待定..

 } 成員方法

 }

1.1.3 this

一個(gè)問題杏死?

請大家看一段代碼:(Demo112.java)

重點(diǎn):this是屬于一個(gè)對象泵肄,不屬于類的。

java虛擬機(jī)會(huì)給每個(gè)對象分配this,代表當(dāng)前對象淑翼。坦白的講腐巢,要明白this不是件容易的事

注意事項(xiàng):this不能在類定義的外部使用,只能在類定義的方法中使用

/*
    this的必要性
*/
public class Demo112{
    public static void main(String []args){
        Dog dog1=new Dog(2,"大黃");
        Person p1=new Person(dog1,23,"郭德綱");
        Person p2=new Person(dog1,24,"劉謙");
        p1.showInfo();  
        p1.dog.showInfo();
    }
}
//定義一個(gè)人類
class Person{
    //成員變量
    int age;
    String name;
    Dog dog;//引用類型
    public Person(Dog dog,int age,String name){
        //可讀性不好
        //age=age;
        //name=name;
        this.age=age; //this.age指this代詞指定是成員變量age
        this.name=name; //this.name指this代詞指定是成員變量name
        this.dog=dog;
    }
    //顯示人名字
    public void showInfo(){
        System.out.println("人名是:"+this.name);
    }
}

class Dog{
    int age;
    String name;
    public Dog(int age,String name){
        this.age=age;
        this.name=name;
    }
    //顯示狗名
    public void showInfo(){
        System.out.println("狗名叫"+this.name);
    }
}

類變量--提出問題玄括?

提出問題的主要目的就是讓大家思考解決之道冯丙。

public class Demo113{
    public static void main(String []args){
    /*  int total=0;
        Child ch1=new Child(3,"妞妞");
        ch1.joinGame();
        total++;
        Child ch2=new Child(4,"小小");
        ch2.joinGame();
        total++; 
    */
        Child ch1=new Child(3,"妞妞");
        ch1.joinGame();
        Child ch2=new Child(4,"小小");
        ch2.joinGame();
        Child ch3=new Child(5,"大大");
        ch3.joinGame();
        System.out.println("共有="+Child.total);
    }
}
//定義小孩類
class Child{
    int age;
    String name;
    //static公共函數(shù),total是靜態(tài)變量,因此它可以被任何一個(gè)對象訪問
    static int total=0; 
    public Child(int age,String name){
        this.age=age;
        this.name=name;
    }
    public void joinGame(){
        total++;
        System.out.println("有一個(gè)小孩加入了");
    }
}


1.1.4 類變量遭京、類方法

什么是類變量银还?

類變量是該類的所有對象共享的變量,任何一個(gè)該類的對象去訪問它時(shí)洁墙,取到的都是相同的值蛹疯,同樣任何一個(gè)該類的對象去修改它時(shí),修改的也是同一個(gè)變量热监。

如何定義類變量捺弦?

定義語法:

訪問修飾符 static 數(shù)據(jù)類型 變量名;

如何訪問類變量?

類名 . 類變量名 或者 對象名 . 類變量名

//類變量的程序演示[Demo114.java]
public class Demo114{
    static int i=1;
    static{
        //該靜態(tài)區(qū)域塊只被執(zhí)行一次
        i++;
        System.out.println("執(zhí)行一次");
    }
    public Demo114(){  //建立Demo114()構(gòu)造函數(shù)
        System.out.println("執(zhí)行二次");
        i++;
    }
    public static void main(String []args){
        Demo114 t1=new Demo114();  //創(chuàng)建t1對象實(shí)例并調(diào)用Demo114函數(shù)
        System.out.println(t1.i);

        Demo114 t2=new Demo114();
        System.out.println(t2.i);
    }
}

什么是類方法,為什么有類方法列吼?

類方法是屬于所有對象實(shí)例的幽崩,其形式如下:

訪問修飾符 static 數(shù)據(jù)返回類型 方法名(){}

注意:類方法中不能訪問非靜態(tài)變量(類變量)。

使用:類名 . 類方法名 或者 對象名 . 類方法名

重點(diǎn)static靜態(tài)的方法可以訪問static靜態(tài)變量寞钥,不能訪問非靜態(tài)變量(類變量)

非靜態(tài)方法可以訪問非靜態(tài)變量(類變量)同時(shí)也可以訪問static靜態(tài)變量慌申。

//統(tǒng)計(jì)總學(xué)費(fèi)的程序代碼,加深static靜態(tài)的方法由靜態(tài)變量的訪問[Demo115.java]
public class Demo115{
    public static void main(String []args){
        //創(chuàng)建一個(gè)學(xué)生
        Stu stu1=new Stu(29,"aa",340);
        Stu stu2=new Stu(29,"aa",240);
        System.out.println(Stu.getTotalFee());
    }
}

//學(xué)生類
class Stu{
    int age;
    String name;
    int fee;
    static int totalFee;
    public Stu(int age,String name,int fee){
        this.age=age;
        this.name=name;
        totalFee+=fee;
    }
    //返回總學(xué)費(fèi)[這是一個(gè)類方法(靜態(tài)方法)]
    //java中規(guī)則:類變量原則上用類方法去訪問或操作
    public static int getTotalFee(){
        return totalFee;
    }
}

類變量小結(jié)

1理郑、什么時(shí)候需要用類變量

案例[Demo115.java]:定義學(xué)生類蹄溉,統(tǒng)計(jì)學(xué)生共交多少錢?

用類變量您炉,屬于公共的屬性

2柒爵、類變量與實(shí)例變量區(qū)別:

加上static稱為類變量或靜態(tài)變量,否則稱為實(shí)例變量

類變量是與類相關(guān)的赚爵,公共的屬性

實(shí)例變量屬于每個(gè)對象個(gè)體的屬性

類變量可以通過 [類名 . 類變量名] 直接訪問

類方法小結(jié)

1棉胀、什么時(shí)候需要用類方法

案例[Demo115.java]:定義學(xué)生類,統(tǒng)計(jì)學(xué)生共交多少錢冀膝?

類方法屬于與類相關(guān)的唁奢,公共的方法

實(shí)例方法屬于每個(gè)對象個(gè)體的方法

類方法可以通過 [類名 . 類方法名] 直接訪問


java 面向?qū)ο缶幊痰乃拇筇卣?/strong>

抽象/封裝/繼承/多態(tài)

1 抽象 :

1、簡單理解

我們在前面去定義一個(gè)類時(shí)候窝剖,實(shí)際上就是把一類事物的共有的屬性和行為提取出來驮瞧,形成一個(gè)物理模型(模版)。這種研究問題的方法稱為抽象枯芬。

封裝--什么是封裝

封裝就是把抽象出來的數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起论笔,數(shù)據(jù)被保護(hù)在內(nèi)部,程序的其它部分只有通過被授權(quán)的操作(成員方法)千所,才能對數(shù)據(jù)進(jìn)行操作狂魔。

封裝--訪問控制修飾符

電視機(jī)的開關(guān),對音量淫痰,顏色最楷,頻道的控制是公開的,誰都可以操作待错,但是對機(jī)箱后蓋籽孙,主機(jī)板的操作卻不是公開的,一般是由專業(yè)維修人員來玩火俄。那么java中如何實(shí)現(xiàn)這種類似的控制呢犯建?不能隨便查看人的年齡,工資等隱私[Demo116.java]

//封裝案例[Demo116.java]
public class Demo116{
    public static void main(String []args){
        //創(chuàng)建一個(gè)職員
        Clerk clerk1=new Clerk("小花",24,4567.6f);
        System.out.println("名字是"+clerk1.name+"薪水"+clerk1.getSal());
    }
}
//職員
class Clerk{
    public String name;
    //private私有的瓜客,public公有的
    private int age;
    private float salary;

    public Clerk(String name,int age,float sal){
        this.name=name;
        this.age=age;
        this.salary=sal;
    }
    //通過一個(gè)成員方法去控制和訪問私有的屬性
    public float getSal(){
        return this.salary;
    }
}

2. 封裝 -- 訪問控制修飾符 :

java提供四種訪問控制修飾符號控制方法和變量的訪問權(quán)限:

1 适瓦、公開級別:用public修飾竿开,對外公開

2 、受保護(hù)級別:用protected修飾玻熙,對子類和同一個(gè)包中的類公開

3 否彩、默認(rèn)級別:沒有修飾符號,向同一個(gè)包的類公開

4 嗦随、私有級別:用private修飾列荔,只有類本身可以訪問,不對外公開

包--必要性

問題的提出枚尼,請看下面的一個(gè)場景[eclipse]

現(xiàn)在有兩個(gè)程序員共同開發(fā)一個(gè)java項(xiàng)目贴浙,程序員xiaoming希望定義一個(gè)類取名Dog,程序員xiaoqiang也想定義一個(gè)類也叫Dog姑原。兩個(gè)程序員為此還吵了起來悬而,怎么辦呜舒?

-- 三大作用

1锭汛、區(qū)分相同名字的類

2、當(dāng)類很多時(shí)袭蝗,可以很好的管理類

3唤殴、控制訪問范圍

-- 換包命令

package com. 自定義名字;

注意:打包命令一般放在文件開始處。

包--命名規(guī)范

小寫字母 比如 com.sina.shunping

包--常用的包

一個(gè)包下到腥,包含很多的類朵逝,java中常用的包有:

java.lang.* 包 自動(dòng)引入 java.util.* 工具包

java.net.* 包 網(wǎng)絡(luò)開發(fā)包 java.awt.* 包 窗口工具包

包--如何引入包

語法:import 包;

比如import java.awt.*;

我們引入一個(gè)包的主要目的要使用該包下的類

定義類的改進(jìn)

在提出包后,我們類的定義就更加完善了:

class 類名{ class 類名{ class類名{ package包名; 待定..

成員變量; →  成員變量; →  成員變量; →  class 類名{  →

} 成員方法; 構(gòu)造方法; 成員變量;

 } 成員方法; 構(gòu)造方法;

 } 成員方法;

 }

3繼承--為什么有乡范?

//功能:說明繼承的重要性
package com.abc;//包名
public class Demo117 {
    public static void main(String[] args) {
        Pupil p1=new Pupil();
        p1.printName();
    }
}

//將學(xué)生的共有屬性提取配名,做一個(gè)父類
class Stu{
    //定義成員屬性
    protected int age;
    public String name;
    public float fee;
    private String job;//私有將不被繼承
    
    //編程中,如果你不希望子類繼承某個(gè)屬性或方法
    //則將其聲明為private即可
    public void printName(){
        System.out.println("名字"+this.name);
    }
}

//小學(xué)生類
class Pupil extends Stu{
    //交學(xué)費(fèi)
    public void pay(float fee){
        this.fee=fee;
    }
}
//幼兒
class Pre extends Pupil{
    //交學(xué)費(fèi)
    public void pay(float fee){
        this.fee=fee*1.5f;
    }
}
//中學(xué)生類
class MiddleStu extends Stu{
    //交學(xué)費(fèi)
    public void pay(float fee){
        this.fee=fee*0.8f;
    }
}
//大學(xué)生類
class ColStu extends Stu{
    //交學(xué)費(fèi)
    public void pay(float fee){
        this.fee=fee*0.1f;
    }
}

繼承 -- 解決之道

繼承可以解決代碼復(fù)用晋辆,讓我們的編程更加靠近人類思維渠脉。當(dāng)多個(gè)類存在相同的屬性(變量)和方法時(shí),可以從這些類中抽象出父類(比如剛才的Student)瓶佳,在父類中定義這些相同的屬性和方法芋膘,所有的子類不需要重新定義這些屬性和方法,只需要通過extends語句來聲明繼承父類:

語法:class 子類 extends 父類

這樣霸饲,子類就會(huì)自動(dòng)擁有父類定義的某些屬性和方法为朋。

繼承--深入討論

1、父類的哪些屬性(變量)厚脉、方法被子類繼承了习寸?并不是父類的所有屬性、方法都可以被子類繼承

父類 子類

public 屬性; public 屬性;

protected 屬性; 繼承 protected 屬性;

private 屬性; → 屬性;

屬性;

public 方法; public 方法;

protected 方法; protected 方法;

private 方法; 方法;

方法;

2傻工、結(jié)論

從圖可以看出融涣,父類的public修飾符的屬性和方法童番;protected修飾符的屬性和方法;默認(rèn)修飾符屬性和方法被子類繼承了威鹿,父類的private修飾符的屬性和方法不能被子類繼承剃斧。

繼承--注意事項(xiàng)

1、子類最多只能繼承一個(gè)父類(指直接繼承)

2忽你、java所有類都是Object類的子類 (所有的子類都可以逐級繼承幼东,例:爺->父->子->孫)

3、JDK6中有202個(gè)包3777個(gè)類科雳、接口根蟹、異常、枚舉糟秘、注釋和錯(cuò)誤

4简逮、在做開發(fā)的時(shí)候,強(qiáng)烈建議大家多查jdk幫助文檔

5尿赚、在使用類時(shí)散庶,實(shí)在不知道怎么辦,多使用搜索引擎

4. 定義類的改進(jìn) :

在提出包后凌净,我們類的定義就更加完善了:

class 類名{ class 類名{ class類名{ package包名;   

成員變量; →  成員變量; →  成員變量; →  class 類名{ 

} 成員方法; 構(gòu)造方法; 成員變量;

 } 成員方法; 構(gòu)造方法;

 } 成員方法;

 }  ↓

↓←←←←←←←←←←←←←←←←←←←←←←←←←

package 包名;

class 類名 extends 父類{ 待定

  成員變量; → ....

  構(gòu)造方法;

  成員方法;

}

1.1.5 方法重載(overload)和方法覆蓋(override)

1 方法重載 (overload)

按順序悲龟,我們應(yīng)該講解多態(tài),但是在講解多態(tài)前冰寻,我們必須講解方法重載和方法覆蓋(override)须教。

請編寫一個(gè)類(Abc),編寫方法可以接收兩個(gè)整數(shù)斩芭,返回兩個(gè)數(shù)中較大的數(shù)[Demo119.java]

//方法重載(overload)getMax
public class Demo119{
    public static void main(String []args){
        Abc2 abc1=new Abc2();
        System.out.println(abc1.getMax(12,14));
        System.out.println(abc1.getMax(24f,20f));
    }
}

class Abc2{
    //返回較大的整數(shù)
    public int getMax(int i,int j){
        if(i>j){
            return i;
        }else{
            return j;
         }
    }
    public float getMax(float a,float b){
        if(a>b){
            return a;
        }else{
            return b;
         }
    }
    //如果只是返回類型不一樣轻腺,能否構(gòu)成重載?不能夠構(gòu)成重載
/*  public double getMax(float d,double c){
        if(c>d){
            return c;
        }else{
            return d;
         }
    }
    //如果只是控制訪問修飾符不同划乖,能否構(gòu)成重載贬养?不能夠構(gòu)成重載
    protected float getMax(float c,float d){
        if(c>d){
            return c;
        }else{
            return d;
         }
    }*/
}

方法重載(overload) 概念

簡單的說:方法重載就是在類的同一種功能的多種實(shí)現(xiàn)方式,到底采用哪種方式迁筛,取決于調(diào)用者給出的參數(shù)煤蚌。

注意事項(xiàng):

1、方法名相同

2细卧、方法的參數(shù)類型尉桩,個(gè)數(shù),順序至少有一項(xiàng)不同

3贪庙、方法返回類型可以不同(只是返回類型不一樣蜘犁,不能構(gòu)成重載)

4、方法的修飾符可以不同(只是控制訪問修飾符不同止邮,不能構(gòu)成重載)

2 方法覆蓋 (override)

既然子類可以繼承父類的屬性和方法这橙,這樣可以提高代碼的復(fù)用性奏窑,這個(gè)很好,可是問題來了屈扎,假設(shè)現(xiàn)在我要求大家寫三個(gè)類貓貓埃唯,狗狗,豬豬鹰晨。我們知道這三個(gè)東東都是動(dòng)物墨叛,動(dòng)物必然存在相同的特點(diǎn)。根據(jù)類的抽象特征模蜡,我們可以把它們的相同點(diǎn)提取出來漠趁,形成一個(gè)父類,然后繼承忍疾。

//子類方法覆蓋父類方法[Demo120.java]
public class Demo120{
    public static void main(String []args){
        //創(chuàng)建一只貓
        Cat cat1=new Cat();
            cat1.cry();
        Dog dog1=new Dog();
            dog1.cry();
    }
}
//動(dòng)物類
class Animal{
    int age;
    String name;
    //都會(huì)叫
    public void cry(){
        System.out.println("我是動(dòng)物闯传,不知道怎么叫");
    }

}
//貓貓類
class Cat extends Animal{
    //覆蓋父類方法
    public void cry(){
        System.out.println("貓貓叫!");
    }
}
//狗狗類
class Dog extends Animal{
    //覆蓋父類方法
    public void cry(){
        System.out.println("汪汪叫!");
    }
}

方法覆蓋(override)概念

簡單的說:方法覆蓋就是子類有一個(gè)方法,和父類的某個(gè)方法的名稱卤妒、返回類型甥绿、參數(shù)一樣,那么我們就說子類的這個(gè)方法覆蓋了父類的那個(gè)方法荚孵。比如上個(gè)案例的Cat類中的cry方法就覆蓋了Animal類的cry方法妹窖。

注意事項(xiàng):

方法覆蓋有很多條件纬朝,有些書上說的比較細(xì)收叶,總的講有兩點(diǎn)一定注意:

1、子類的方法的返回類型共苛,參數(shù)判没,方法名稱,要和父類的返回類型隅茎,參數(shù)澄峰,方法名稱完全一樣,否則編譯出錯(cuò)辟犀。

2俏竞、子類方法不能縮小父類方法的訪問權(quán)限。

===============================================================================

作業(yè):上機(jī)實(shí)習(xí)題目

1堂竟、Josephu問題(丟手帕問題)

Josephu問題為:設(shè)編號為1,2,...n的n個(gè)人圍坐一圈魂毁,約定編號為k(1<=k<=n)的人從1開始報(bào)數(shù),數(shù)到m的那個(gè)人出列出嘹,它的下一位又從1開始報(bào)數(shù)席楚,數(shù)到m的那個(gè)人又出列,依次類推税稼,直到所有人出列為止烦秩,由此產(chǎn)生一個(gè)出隊(duì)編號的序列垮斯。

提示:用一個(gè)不帶頭結(jié)點(diǎn)的循環(huán)鏈表來處理Josephu問題:先構(gòu)成一個(gè)有n個(gè)結(jié)點(diǎn)的單循環(huán)鏈表,然后由k結(jié)點(diǎn)起從1開始計(jì)數(shù)只祠,計(jì)到m時(shí)兜蠕,對應(yīng)結(jié)點(diǎn)的人從鏈表中刪除,然后再從被刪除結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)又從1開始計(jì)數(shù)抛寝,直到最后一個(gè)結(jié)點(diǎn)從鏈表中刪除算法結(jié)束牺氨。

//Josephu問題(丟手帕問題)
//使用單向鏈表
public class Demo121 {
    public static void main(String[] args) {
        CycLink cyclink=new CycLink();
        cyclink.setLen(5);//鏈表長度
        cyclink.createLink();
        cyclink.setK(2);//從第幾個(gè)人開始數(shù)
        cyclink.setM(2);//數(shù)幾下
        cyclink.show();
        cyclink.play();
    }
}

class Child{
    int no;
    Child nextChild=null;
    public Child(int no){
        //給一個(gè)編號
        this.no=no;
    }
}

//單向環(huán)形鏈表
class CycLink{
    //先定義一個(gè)指向鏈表第一個(gè)小孩的引用
    //指向第一個(gè)小孩的引用,不能動(dòng)
    Child firstChild=null;
    Child temp=null;
    int len=0;//表示共有多少個(gè)小孩
    int k=0;
    int m=0;
    //設(shè)置m數(shù)幾下
    public void setM(int m){
        this.m=m;
    }
    //設(shè)置環(huán)形鏈表大小
    public void setLen(int len){
        this.len=len;
    }
    //設(shè)置從第幾個(gè)人開始數(shù)數(shù)
    public void setK(int k){
        this.k=k;
    }
    //開始play
    public void play(){
        Child temp=this.firstChild;
        //1.先找到開始數(shù)數(shù)的人
        for(int i=1;i<k;i++){
            temp=temp.nextChild;
        }
        while(this.len!=1){
            //2.數(shù)m下
            for(int j=1;j<m;j++){
                temp=temp.nextChild;
            }
            //找到要出圈的前一個(gè)小孩
            Child temp2=temp;
            while(temp2.nextChild!=temp){
                temp2=temp2.nextChild;
            }
            //3.將數(shù)到m的小孩墩剖,退出圈
            temp2.nextChild=temp.nextChild;
            //讓temp指向下一個(gè)數(shù)數(shù)的小孩
            temp=temp.nextChild;
            this.len--;
        }
        //最后一個(gè)小孩
        System.out.println("最后出圈的小孩:"+temp.no);
    }
    
    //初始化單向環(huán)形鏈表
    public void createLink(){
        for(int i=1;i<=len;i++){
            if(i==1){
                //創(chuàng)建第一個(gè)小孩
                Child ch=new Child(i);
                this.firstChild=ch;
                this.temp=ch;
            }else{
                //創(chuàng)建最后一個(gè)小孩
                if(i==len){
                    Child ch=new Child(i);
                    temp.nextChild=ch;
                    temp=ch;
                    temp.nextChild=this.firstChild;
                }else{
                    //繼續(xù)創(chuàng)建小孩
                    Child ch=new Child(i);
                    temp.nextChild=ch;
                    temp=ch;    
                }
            }
        }
    }
    //打印該環(huán)形鏈表
    public void show(){
        //定義一個(gè)跑龍?zhí)?        Child temp=this.firstChild;
        do{
            System.out.print(temp.no+" ");
            temp=temp.nextChild;
        }while(temp!=this.firstChild);
    }
}

1.1.6 四大特征

1多態(tài)-- 概念

所謂多態(tài)猴凹,就是指一個(gè)引用(類型)在不同情況下的多種狀態(tài)。也可以理解成:多態(tài)是指通過指向父類的指針岭皂,來調(diào)用在不同子類中實(shí)現(xiàn)的方法郊霎。

實(shí)現(xiàn)多態(tài)有兩種方式:1、繼承爷绘;2书劝、接口

多態(tài)演示[Dome122.java]

//演示繼承、方法覆蓋土至、多態(tài)
public class Demo122 {
    public static void main(String[] args) {
        //非多態(tài)演示
        Cat cat=new Cat();
        cat.cry();
        Dog dog=new Dog();
        dog.cry();
        //多態(tài)演示
        Animal an=new Cat();
        an.cry();
        an=new Dog();
        an.cry();
    }
}
//動(dòng)物類
class Animal{
    String name;
    int 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;
    }
    //動(dòng)物會(huì)叫
    public void cry(){
        System.out.println("不知道怎么叫");
    }
}
//創(chuàng)建Dog子類并繼承Animal父類及覆蓋cry方法
class Dog extends Animal{
    //狗叫
    public void cry(){
        System.out.println("汪汪叫");
    }
}
class Cat extends Animal{
    //貓自己叫
    public void cry(){
        System.out.println("貓貓叫");
    }
}

2 多重多態(tài)演示[Dome123.java]

//演示子類繼承父類购对、方法覆蓋、多態(tài)方法
public class Demo123 {
    public static void main(String[] args) {
        //非多態(tài)演示
        System.out.println("非多態(tài)演示:");
        Cat cat=new Cat();
        cat.cry();
        Dog dog=new Dog();
        dog.cry();
        System.out.println();       
        //多態(tài)演示
        System.out.println("多態(tài)演示:");
        Animal an=new Cat();
        an.cry();
        an=new Dog();
        an.cry();
        System.out.println();   
        //多重多態(tài)演示
        System.out.println("多重多態(tài)演示:");
        Master master=new Master();
        master.feed(new Dog(),new Bone());
        master.feed(new Cat(),new Fish());
    }
}
//主人類
class Master{
    //給動(dòng)物喂食物陶因,使用多態(tài)骡苞,只要寫一個(gè)方法
    public void feed(Animal an,Food f){
        an.eat();
        f.showName();
    }
}
//食物父類
class Food{
    String name;
    public void showName(){
        System.out.println("食物");
    }
}
//食物魚子類
class Fish extends Food{
    public void showName(){
        System.out.println("魚");
    }
}
//食物骨頭子類
class Bone extends Food{
    public void showName(){
        System.out.println("骨頭");
    }
}
//動(dòng)物類Animal父類
class Animal{
    String name;
    int 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;
    }
    //動(dòng)物會(huì)叫
    public void cry(){
        System.out.println("不知道怎么叫");
    }
    //動(dòng)物吃東西
    public void eat(){
        System.out.println("不知道吃什么");
    }
}
//創(chuàng)建Dog子類并extends繼承Animal父類及覆蓋cry方法
class Dog extends Animal{
    //狗叫
    public void cry(){
        System.out.println("汪汪叫");
    }
    //狗吃東西
    public void eat(){
        System.out.println("狗愛吃骨頭");
    }
}
class Cat extends Animal{
    //貓自己叫
    public void cry(){
        System.out.println("貓貓叫");
    }
    //貓吃東西
    public void eat(){
        System.out.println("貓愛吃魚");
    }
}

3 多態(tài) -- 注意事項(xiàng):

1、java允許父類的引用變量引用它的子類的實(shí)例(對象)

Animal an=new Cat();//這種轉(zhuǎn)換時(shí)自動(dòng)完成的

2楷扬、關(guān)于類型轉(zhuǎn)換還有一些具體的細(xì)節(jié)要求解幽,我們在后面還要提,比如子類能不能轉(zhuǎn)換成父類烘苹,有什么要求等等...


1.1.7 抽象類

1 抽象類 -- 解決之道

當(dāng)父類的一些方法不能確定時(shí)躲株,可以用abstract關(guān)鍵字來修飾該方法[抽象方法],用abstract來修飾該類[抽象類]镣衡。

//抽象類的必要性[Demo124.java]
public class Demo124 {
    public static void main(String[] args) {
        //Animal an=new Animal();抽象類不允許實(shí)例化
        Animal an=new Cat();
        an.cry();
        an=new Dog();
        an.cry();
    }
}
//抽象類abstract關(guān)鍵詞
abstract class Animal{
    String name;
    int age;
    //動(dòng)物會(huì)叫霜定,使用了abstract抽象方法
    abstract public void cry();//抽象類中可以沒有abstract抽象方法
    //抽象類內(nèi)可以有實(shí)現(xiàn)方法
    public void sx(){
        System.out.println("實(shí)現(xiàn)方法");
    }
}
//當(dāng)一個(gè)子類繼承的父類是abstract抽象類的話,需要程序員把抽象類的抽象方法全部實(shí)現(xiàn)廊鸥。
class Cat extends Animal{
    //實(shí)現(xiàn)父類的cry望浩,其實(shí)類似上節(jié)學(xué)習(xí)中的子類覆蓋父類
    public void cry(){
        System.out.println("貓貓叫");
    }
}
class Dog extends Animal{
    //實(shí)現(xiàn)父類的cry,其實(shí)類似上節(jié)學(xué)習(xí)中的子類覆蓋父類
    public void cry(){
        System.out.println("汪汪叫");
    }
}

2 抽象類 -- 深入討論

抽象類是java中一個(gè)比較重要的類黍图。

1 曾雕、用abstract關(guān)鍵字來修飾一個(gè)類時(shí),這個(gè)類就是抽象類助被。

2 剖张、用abstract關(guān)鍵字來修飾一個(gè)方法時(shí)切诀,這個(gè)方法就是抽象方法。

3 搔弄、abstract抽象類中的abstract抽象方法是不允許在抽象類中實(shí)現(xiàn)的幅虑,一旦實(shí)現(xiàn)就不是抽象方法和抽象類了。abstract抽象方法只能在子類中實(shí)現(xiàn)顾犹。

4 倒庵、抽象類中可以擁有實(shí)現(xiàn)方法。

5炫刷、抽象方法在編程中用的不是很多擎宝,但是在公司筆試時(shí),卻是考官比較愛問的知識點(diǎn)浑玛。

3 抽象類****--****注意事項(xiàng)

1 绍申、抽象類不能被實(shí)例化

2 、抽象類不一定要包含abstract方法顾彰。也就是說极阅,抽象類可以沒有abstract抽象方法。

3 涨享、一旦類包含了abstract抽象方法筋搏,則這個(gè)類必須聲明為abstract抽象類。

4 厕隧、抽象方法不能有主體奔脐。

正確的抽象方法例:abstract void abc();

錯(cuò)語的抽象方法例:abstract void abc(){}

1.1.8 接口

1 接口 -- 為什么有?

USB插槽就是現(xiàn)實(shí)中的接口栏账。

什么是接口帖族?

接口就是給出一些沒有內(nèi)容的方法栈源,封裝到一起挡爵,到某個(gè)類要使用的時(shí)候,在根據(jù)具體情況把這些方法寫出來甚垦。

接口的建立語法:interface 接口名 { 方法;}

語法:class 類名 implements 接口 {

方法;

變量;

}

小結(jié):接口是更加抽象的抽象的類茶鹃,抽象類里的方法可以有方法體,接口里的所有方法都沒有方法體艰亮。接口體現(xiàn)了程序設(shè)計(jì)的多態(tài)和高內(nèi)聚低偶合的設(shè)計(jì)思想闭翩。

2 接口 -- 注意事項(xiàng)

1、接口不能被實(shí)例化

2迄埃、接口中所有的方法都不能有主體疗韵。錯(cuò)誤語法例:void aaa(){}←(注意不能有花括號)

接口可以看作更加抽象的抽象類。

3侄非、一個(gè)類可以實(shí)現(xiàn)多個(gè)接口

4蕉汪、接口中可以有變量[但變量不能用private和protected修飾]

a流译、接口中的變量,本質(zhì)上都是static的而且是final類型的者疤,不管你加不加static修飾

b福澡、在java開發(fā)中,我們經(jīng)常把常用的變量驹马,定義在接口中革砸,作為全局變量使用

訪問形式:接口名 . 變量名

5、一個(gè)接口不能繼承其它的類糯累,但是可以繼承別的接口

//接口的實(shí)現(xiàn)[Demo125.java]
//電腦算利,相機(jī),u盤泳姐,手機(jī)

//usb接口
interface Usb{
    int a=1;//加不加static都是靜態(tài)的笔时,不能用private和protected修飾
    //聲明了兩個(gè)方法
    public void start();//接口開始工作
    public void stop();//接口停止工作
}
//編寫了一個(gè)相機(jī)類,并實(shí)現(xiàn)了usb接口
//一個(gè)重要的原則:當(dāng)一個(gè)類實(shí)現(xiàn)了一個(gè)接口仗岸,要求該類把這個(gè)接口的所有方法全部實(shí)現(xiàn)
class Camera implements Usb{
    public void start(){
        System.out.println("我是相機(jī)允耿,開始工作了..");
    }
    public void stop(){
        System.out.println("我是相機(jī),停止工作了..");
    }
}
//接口繼承別的接口
class Base{
}
interface Tt{
}
interface Son extends Tt{
}
//編寫了一個(gè)手機(jī)扒怖,并實(shí)現(xiàn)了usb接口
class Phone implements Usb{
    public void start(){
        System.out.println("我是手機(jī)较锡,開始工作了..");
    }
    public void stop(){
        System.out.println("我是手機(jī),停止工作了..");
    }
}
//計(jì)算機(jī)
class Computer{
    //開始使用usb接口
    public void useUsb(Usb usb){
        usb.start();
        usb.stop();
    }
}
public class Demo125 {
    public static void main(String[] args) {
        System.out.println(Usb.a);
        //創(chuàng)建 Computer
        Computer computer=new Computer();
        //創(chuàng)建Camera
        Camera camera1=new Camera();
        //創(chuàng)建Phone
        Phone phone1=new Phone();
        computer.useUsb(camera1);
        computer.useUsb(phone1);
    }
}

3 定義類的改進(jìn)

有了接口盗痒,我們類的定義就更加完善了:

class 類名{ class 類名{ class類名{ package包名;   

成員變量; →  成員變量; →  成員變量; →  class 類名{ 

} 成員方法; 構(gòu)造方法; 成員變量;

 } 成員方法; 構(gòu)造方法;

 } 成員方法;

 }  ↓

↓←←←←←←←←←←←←←←←←←←←←←←←←←

package 包名; package 包名;

class 類名 extends 父類{ class 類名 extends 父類 implements 接口名{

  成員變量;    →  成員變量;

  構(gòu)造方法; 構(gòu)造方法;

  成員方法; 成員方法;

} }

4 實(shí)現(xiàn)接口VS繼承類

java的繼承是單繼承蚂蕴,也就是一個(gè)類最多只能有一個(gè)父類,這種單繼承的機(jī)制可保證類的純潔性俯邓,比C++中的多繼承機(jī)制簡潔骡楼。但是不可否認(rèn),對子類功能的擴(kuò)展有一定影響稽鞭。所以:

1鸟整、實(shí)現(xiàn)接口可以看作是對繼承的一種補(bǔ)充。(繼承是層級式的朦蕴,不太靈活篮条。修改某個(gè)類就會(huì)打破繼承的平衡,而接口就沒有這樣的麻煩吩抓,因?yàn)樗会槍?shí)現(xiàn)接口的類才起作用)

2掉分、實(shí)現(xiàn)接口可在不打破繼承關(guān)系的前提下传趾,對某個(gè)類功能擴(kuò)展狂打,非常靈活牡借。

//實(shí)例:建立子類并繼承了父類且連接多個(gè)接口[Demo126.java]
public class Demo126 {
    public static void main(String[] args) {
        System.out.println("繼承了Monkey父類");
        Monkey mo=new Monkey();
        mo.jump();
        LittleMonkey li=new LittleMonkey();
        li.swimming();
        li.fly();
    }
}
//接口Fish
interface Fish{
    public void swimming();
}
//接口Bird
interface Bird{
    public void fly();
}
//建立Monkey類
class Monkey{
    int name;
    //猴子可以跳
    public void jump(){
        System.out.println("猴子會(huì)跳!");
    }
}
//建立LittleMonkey子類并繼承了Monkey父類并連接了Fish和Bird接口
class LittleMonkey extends Monkey implements Fish,Bird{
    public void swimming() {
        System.out.println("連接了Fish接口!");
    }
    public void fly() {
        System.out.println("連接了Bird接口!");
    }
}

5 用接口實(shí)現(xiàn)多態(tài)--案例[Demo127.java]

java中多態(tài)是個(gè)難以理解的概念,但同時(shí)又是一個(gè)非常重要的概念。java三大特性之一(繼承钳垮,封裝除师,多態(tài)),我們可以從字面上簡單理解:就是一種類型的多種狀態(tài)扔枫,以下通過賣小汽車的例子說明什么是多態(tài)汛聚。

//用接口實(shí)現(xiàn)多態(tài)
public class Demo127 {
    public static void main(String []args){
        CarShop aShop=new CarShop();
        //賣出一輛寶馬
        aShop.sellCar(new BMW());
        //賣出一輛奇瑞QQ
        aShop.sellCar(new CheryQQ());
        //賣出一輛桑塔納
        aShop.sellCar(new Santana());
        System.out.println("總收入:"+aShop.getMoney());
    }
}
//汽車接口
interface Car{
    //汽車名稱
    String getName();
    //獲得汽車售價(jià)
    int getPrice();
}
//寶馬
class BMW implements Car{
    public String getName(){
        return "BMW";
    }
    public int getPrice(){
        return 300000;
    }
}
//奇瑞QQ
class CheryQQ implements Car{
    public String getName(){
        return "CheryQQ";
    }
    public int getPrice(){
        return 20000;
    }
}
//桑塔納汽車
class Santana implements Car{
    public String getName(){
        return "Santana";
    }
    public int getPrice(){
        return 80000;
    }
}
//汽車出售店
class CarShop{
    //售車收入
    private int money=0;        
    //賣出一部車
    public void sellCar(Car car){
        System.out.println("車型:"+car.getName()+"單價(jià):"+car.getPrice

());
        //增加賣出車售價(jià)的收入
        money+=car.getPrice();
    }
    //售車總收入
    public int getMoney(){
        return money;
    }
}

運(yùn)行結(jié)果:

車型:BMW 單價(jià):300000

車型:CheryQQ 單價(jià):20000

總收入:320000

繼承是多態(tài)得以實(shí)現(xiàn)的基礎(chǔ)。從字面上理解短荐,多態(tài)就是一種類型(都是Car類型)表現(xiàn)出多種狀態(tài)(寶馬汽車的名稱是BMW倚舀,售價(jià)是300000;奇瑞汽車的名稱是CheryQQ忍宋,售價(jià)是2000)痕貌。將一個(gè)方法調(diào)用同這個(gè)方法所屬的主體(也就是對象或類)關(guān)聯(lián)起來叫做綁定,分前期綁這下和后期綁定兩種糠排。下面解釋一下它們的定義:

1 舵稠、前期綁定:在程序運(yùn)行之前進(jìn)行綁定,由編譯器和連接程序?qū)崿F(xiàn)入宦,又叫做靜態(tài)綁定哺徊。比如static方法和final方法,注意乾闰,這里也包括private方法落追,因?yàn)樗请[式final的。

2 涯肩、后期綁定:在運(yùn)行時(shí)根據(jù)對象的類型進(jìn)行綁定轿钠,由方法調(diào)用機(jī)制實(shí)現(xiàn),因此又叫做動(dòng)態(tài)綁定病苗,或者運(yùn)行時(shí)綁定疗垛。除了前期綁定外的所有方法都屬于后期綁定。

多態(tài)就是在后期綁定這種機(jī)制上實(shí)現(xiàn)的硫朦。多態(tài)給我們帶來的好處是消除了類之間的偶合關(guān)系贷腕,使程序更容易擴(kuò)展。比如在上例中阵幸,新增加一種類型汽車的銷售花履。只需要讓新定義的類實(shí)現(xiàn)Car類并實(shí)現(xiàn)它的所有方法,而無需對原有代碼做任何修改挚赊,CarShop類的sellCar(Car

car)方法就可以處理新的車型了。

新增代碼如下:

java代碼

//桑塔納汽車
class Santana implements Car{
    public String getName(){
        return "Santana";
    }
    public int getPrice(){
        return 80000;
    }
}

1.1.9 final

final概念

final中文意思:最后的济瓢,最終的荠割。

final可以修飾變量或者方法。

在某些情況下,程序員可能有以下需求:

1 蔑鹦、當(dāng)不希望父類的某個(gè)方法被子類覆蓋(override)時(shí)夺克,可以用final關(guān)鍵字修飾。

2 嚎朽、當(dāng)不希望類的某個(gè)變量的值被修改铺纽,可以用final修飾。如果一個(gè)變量是final哟忍,則必須賦初值狡门,否則編譯出錯(cuò)。

3 锅很、當(dāng)不希望類被繼承時(shí)其馏,可以用final修飾。

//final方法的使用[Demo128.java]
public class Demo128 {
    public static void main(String[] args) {
        Aaa aaa=new Aaa();
        aaa.show();
        Bbb bbb=new Bbb();
        bbb.show();
    }
}
class Aaa{ 
    int a=0;//如果a不賦初值,a是0爆安。定義類型后應(yīng)賦值
    //圓周率不讓修改
    //帶有final修飾的變量命名時(shí)應(yīng)有_下劃線來區(qū)分表示叛复。這是java程序員的標(biāo)準(zhǔn)。
    final float reate_1=3.1415926f;//使用final可以保證扔仓,需要強(qiáng)制不被修改的數(shù)據(jù)一定要用final鎖定
    //final int b;  //使用final定義變量時(shí)一定要賦初值否則報(bào)錯(cuò)褐奥。
    //b=1;
    final public void sendMes(){//給成員方法用final來修飾則表示不可以被修改,不可被覆蓋翘簇。
        System.out.println("發(fā)送消息");
    }
    public void show(){
        System.out.println("a="+a);
    }
}
final class Bbb extends Aaa{//定義類前加final表示該類不允許被繼承
    public Bbb(){
        a++;
        //reate_1=reate+1;
    }
    /*public void sendMes(){
        System.out.println("發(fā)送消息")
    }*/
}

final-- 注意事項(xiàng)

1抖僵、final修飾的變量又叫常量,一般用XX_XX_XX來命名缘揪。(帶下劃線)

2耍群、final修飾的變量在定義時(shí),必須賦值找筝,并且以后不能再賦值蹈垢。

final-- 什么時(shí)候用

1、因?yàn)榘咐目紤]袖裕,類的某個(gè)方法不允許修改曹抬。

2、類不會(huì)被其它的類繼承急鳄。

3谤民、某些變量值是固定不變的,比如圓周率3.1415926

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末疾宏,一起剝皮案震驚了整個(gè)濱河市张足,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坎藐,老刑警劉巖为牍,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哼绑,死亡現(xiàn)場離奇詭異,居然都是意外死亡碉咆,警方通過查閱死者的電腦和手機(jī)抖韩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疫铜,“玉大人茂浮,你說我怎么就攤上這事】枪荆” “怎么了席揽?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長囱井。 經(jīng)常有香客問我驹尼,道長,這世上最難降的妖魔是什么庞呕? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任新翎,我火速辦了婚禮,結(jié)果婚禮上住练,老公的妹妹穿的比我還像新娘地啰。我一直安慰自己,他們只是感情好讲逛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布亏吝。 她就那樣靜靜地躺著,像睡著了一般盏混。 火紅的嫁衣襯著肌膚如雪蔚鸥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天许赃,我揣著相機(jī)與錄音止喷,去河邊找鬼。 笑死混聊,一個(gè)胖子當(dāng)著我的面吹牛弹谁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播句喜,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼预愤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咳胃?” 一聲冷哼從身側(cè)響起植康,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拙绊,沒想到半個(gè)月后向图,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泳秀,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡标沪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年榄攀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片金句。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡檩赢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出违寞,到底是詐尸還是另有隱情贞瞒,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布趁曼,位于F島的核電站军浆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挡闰。R本人自食惡果不足惜乒融,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摄悯。 院中可真熱鬧赞季,春花似錦、人聲如沸奢驯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘪阁。三九已至撒遣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間管跺,已是汗流浹背义黎。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伙菜,地道東北人轩缤。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像贩绕,于是被迫代替她去往敵國和親火的。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容