后端入門---面向?qū)ο蠡纠斫猓ǖ诙糠郑?/h1>

11.多態(tài)

1.多態(tài):同一個對象擁有不同的形態(tài)隘弊。
2.先引出一個例子噪珊。
package com.itppf.dao;

public class Noodle {
    public void cook(){
        System.out.println("做一碗面條!");
    }
}

package com.itppf.dao;

public class Rice {
    public void cook(){
        System.out.println("做一碗米飯饰豺!");

    }
    }
package com.itppf.dao;

public class Cookier {
    public void cook(Noodle n){
        n.cook();
    }
    public void cook(Rice r){
        r.cook();
    }
}

然后創(chuàng)建做飯的場景亿鲜。

package com.itppf.dao;

public class Client {
    public static void main(String[] args) {
        Noodle n=new Noodle();
        Rice r=new Rice();

        Cookier c=new Cookier();//new一個廚師
        c.cook(n);//讓廚師做面條
        c.cook(r);//讓廚師做米飯
    }
}
3.由上面的例子可知,無論是做米飯還是做面條都需要創(chuàng)建不同的方法,這樣以來就十分繁瑣蒿柳,那么我們有沒有方法能簡化這一步操作呢饶套?

答案是可以的,我們可以定義一個食物類垒探,面條和米飯同屬于食物妓蛮。

為了更直觀體現(xiàn),再新建一個soup類

package com.itppf.dao;

public class Noodle extends  Food{
    public void cook(){
        System.out.println("做一碗面條圾叼!");
    }
}
package com.itppf.dao;

public class Rice extends Food{
    public void cook(){
        System.out.println("做一碗米飯蛤克!");
    }
    }
package com.itppf.dao;

public class Soup extends Food {
    public void cook(){
        System.out.println("做一碗湯!");
    }
}

然后創(chuàng)建食物類

package com.itppf.dao;

public class Food {
public void cook(){
    System.out.println("烹飪食物");//主要使用cook方法夷蚊,這里寫不寫都行
}
}

創(chuàng)建廚師類

package com.itppf.dao;

public class Cookier{
//    public void cook(Noodle n){
//        n.cook();
//    }
//    public void cook(Rice r){
//        r.cook();
//    }
public void cook(Food food){     //接收傳進來的食物類型构挤,也就是接收實例化的食物值,然后讓不同的食物去實現(xiàn)各自的方法惕鼓。
    food.cook();
}
}

創(chuàng)建做飯的場景

package com.itppf.dao;

public class Client {
    public static void main(String[] args) {
//        Noodle n=new Noodle();
//        Rice r=new Rice();
//
//        Cookier c=new Cookier();//new一個廚師
//        c.cook(n);//讓廚師做面條
//        c.cook(r);//讓廚師做米飯
        Food food1=new Noodle();   //把面條筋现、米飯、湯當做食物來看箱歧,把子類的對象賦值給父類的引用矾飞,向上轉(zhuǎn)型。向下轉(zhuǎn)型
                                     //Noodle noodle=(Noodle)food1 強制轉(zhuǎn)型呀邢、
        Food food2=new Rice();
        Food food3=new Soup();

        Cookier cookier=new Cookier();     
        cookier.cook(food1);
        cookier.cook(food2);
        cookier.cook(food3);

    }
}

練習:


4.根據(jù)類圖洒沦,寫游戲代練,其實和上面的例子一樣价淌,就是看你方法里面寫什么申眼。
//先根據(jù)UML圖寫出Game類
package com.itppf.entity;

public class Game {
    public void start(){
        System.out.println("開始游戲");
    }
    public void play(){
        System.out.println("開始進入游戲");
    }
    public void end(){
        System.out.println("結(jié)束游戲");
    }
}


//LOL
package com.itppf.entity;

public class LOL extends Game {
    public void play(){
        System.out.println("開始玩LOL!");
    }
}


//DNF
package com.itppf.entity;

public class DNF extends Game {
    public void play(){
        System.out.println("開始玩DNF输钩!");

    }
}


//CS
package com.itppf.entity;

public class CS extends Game {
    public void play(){
        System.out.println("開始玩CS豺型!");

    }
}



//玩家
package com.itppf.entity;

public class Player{
    public void happy(Game game){
        game.play();
    }
}


//游戲場景
package com.itppf.entity;

public class GameClient {
    public static void main(String[] args) {
        Game game1=new DNF();
        Game game2=new LOL();
        Game game3=new CS();


        Player player=new Player();
        player.happy(game1);
        player.happy(game2);
        player.happy(game3);

    }
}

12.final關鍵字

1.final:被final修飾的變量不可以被改變(無論是成員變量還是局部變量都不可改變),最終的买乃,最后的姻氨,不可以被改變的。
2.被final修飾的方法不能夠重寫剪验。
3.被final修飾的類不可以被繼承肴焊。

舉個例子

package com.itppf.entity;

public class Car {
    
    public final void type(){

        System.out.println("你的車是什么類型啊功戚!");
    }
    
}

13.抽象

1.在java中:只聲明娶眷,不實現(xiàn)。
2.abstract修飾方法啸臀,這個方法就是一個抽象方法届宠,抽象方法沒有方法體烁落。
3.類中如果有個抽象方法,這個類必須是一個抽象類豌注,否則會報錯伤塌。
4.抽象類的特點:
5.不可以創(chuàng)建對象,沒有實例轧铁,不存在的東西每聪。
6.抽象類的子類,必須重寫父類中的抽象方法齿风。
7.簡單說明一下药薯,抽象類繼承父類的時候,由于父類中的方法是抽象方法救斑,所以子類中的方法也是抽象方法童本,這時要求子類重寫父類的方法才能夠?qū)崿F(xiàn)實例化。
注:父類是抽象類系谐,子類不一定是抽象類巾陕。

如何讓它不報錯讨跟?

必須重寫父類的方法纪他。

重寫之后不報錯。
8.作用:通過抽象類可以強制要求子類中必須有哪些方法晾匠。

添加一個抽象方法shape()后茶袒,子類必須重寫這個方法,否則會報錯凉馆。



重寫之后薪寓。



抽象類更多的是規(guī)范化的作用,在父類中定義抽象方法澜共,然后在子類中必須去重寫這些方法向叉,然后利用多態(tài)性進行操作。

EG:1.抽象化的父類
package com.itppf.entity;

public abstract class Fruit {
    public abstract void type();
    public abstract  void color();
}
2.兩個子類繼承父類并且重寫方法嗦董。
package com.itppf.entity;

public class Peach extends Fruit{
    public void type(){
        System.out.println("這個水果的名字叫桃子母谎!");
    }
    public void color(){
        System.out.println("這個蘋果的顏色是紅色的!");
    }
}
package com.itppf.entity;

public class Apple extends Fruit{
    public void type(){
        System.out.println("這個水果的名字叫蘋果京革!");
    }
    public void color(){
        System.out.println("這個蘋果的顏色是紅色的奇唤!");
    }
}
3.售賣者
package com.itppf.entity;

public class Saler {
    public void sale(Fruit fruit){          //這里接收參數(shù),并且調(diào)用各自類中的方法匹摇。
       fruit.type();          
       fruit.color();
    }
}
4.售賣場景
package com.itppf.entity;

public class FruitClient {
    public static void main(String[] args) {
        Fruit fruit1=new Apple();
        Fruit fruit2=new Peach();

        Saler saler1=new Saler();
        saler1.sale(fruit1);        //這里將蘋果的參數(shù)傳到售賣者那里咬扇。
        System.out.println("*******************");
        saler1.sale(fruit2);               //這里將桃子的參數(shù)傳到售賣者那里。
    }
}

8.注意:抽象類中可以添加別的方法,類似于
package com.itppf.entity;

public abstract class Fruit {
    public abstract void type();
    public abstract  void color();
    public void weight(){
        System.out.println("這個水果很重廊勃!");
    }
}

14.接口

1.接口是一種特殊的抽象類懈贺。
2.接口中所有的方法都是抽象方法,省略掉abstract。
3.接口使用interface來聲明梭灿。
4.接口中的方法都是公開的钠至,公共的。
5.能繼承接口的只能是接口胎源。
6.接口和類只能是實現(xiàn)關系棉钧。

筆記記到這里,學了抽象類之后突然明白了接口存在的意義涕蚤∠芮洌總結(jié)一下,就是標準化万栅、規(guī)范化地定義一個東西佑钾,人人都能拿到接口去做自己的東西。

package com.itppf.dao;

public interface place {
    public abstract void point();
}
package com.itppf.dao;

public class home implements place {
    public void point(){                 //必須要實現(xiàn)接口方法烦粒,其實就是重寫休溶。

    }
}

繼承和接口用法幾乎差不多,接口也具有多態(tài)性扰她。

接口可以把不相關的東西進行整合兽掰。

注:類只能單繼承,但接口可以多實現(xiàn)徒役。
注:接口里面的變量都是全局靜態(tài)變量孽尽。
在接口里面定義了面積,然后去調(diào)用會報錯忧勿。

在HomeTest中調(diào)用會報錯杉女。



因為被隱藏到的是

    public static final int area=100;

這樣可以打印出來

   System.out.println(home1.area);
這個例子可以比較形象地展現(xiàn)接口。
package com.itppf.dao;

public interface Country {
    public abstract void specificcountry();
}
package com.itppf.dao;

public  interface Province {
    public abstract void specificprovince();
}
package com.itppf.dao;

public interface Area {

    public abstract void specificsize();
}
package com.itppf.dao;

public interface Type {
    public abstract void specifictype();
}
package com.itppf.dao;

public class Place {
    public  void specificplace(){
        System.out.println("你家具體在哪個地方鸳吸?");
    }
}
package com.itppf.dao;
//單繼承熏挎,多實現(xiàn)。
public class Home extends Place implements Country,Province,Area,Type{  
//類可以實現(xiàn)多個接口晌砾,而接口也可以被多個接口繼承羽历。
//這里要講甩恼,你的家不僅僅在這個國家里面工秩,而且在這個城市里面涵妥,或者定義大小,你家有多大乖寒?多態(tài)性的體現(xiàn)猴蹂。
//重寫了一個繼承的父類和三個接口,一個是展示你居住地的省份楣嘁,一個是國家磅轻,還有一個是居住面積珍逸。
    @Override        //表示這個方法是重寫的
    public void specificplace() {
//        super.specificplace(); //super調(diào)用的是父類的方法。
        System.out.println("你家居住的具體位置在哪里聋溜?");
    }

    @Override
    public void specificsize() {
        System.out.println("你家的居住面積多大谆膳?");
    }

    @Override
    public void specificprovince() {
        System.out.println("你家居住在哪個省份?");
    }

    @Override
    public void specificcountry() {
        System.out.println("你家居住在哪個國家撮躁?");
    }
    @Override
    public void specifictype() {
        System.out.println("你家是什么建筑風格漱病?");
    }

}
package com.itppf.dao;

public class HomeTest {
    public static void main(String[] args) {
//        Home home1=new Home();
//        home1.specificpoint();

         Home home1=new Home(); //從家的方面去看我家,創(chuàng)建對象“hom1”把曼;
         Type home2=new Home(); //從件筑風格的方面去看我家杨帽,創(chuàng)建對象“hom2”;(向上轉(zhuǎn)型)
         Area home3=new Home();  //從建筑面積的方面去看我家嗤军,創(chuàng)建對象“hom3”注盈; (向上轉(zhuǎn)型)
        Province home4=new Home();  //從哪個省的方面去看我家,創(chuàng)建對象“hom4”叙赚; (向上轉(zhuǎn)型)
        Country home5=new Home(); //從哪個國家的方面去看我家老客,創(chuàng)建對象“hom1”;(向上轉(zhuǎn)型)

        //以上很好地展現(xiàn)出了java的多態(tài)性震叮。

        System.out.println("-----從家的方面去調(diào)用home1具體實例-----");
        home1.specificplace();
        home1.specifictype();
        home1.specificsize();
        home1.specificprovince();
        home1.specificcountry();
        System.out.println("*******");

        System.out.println("-----從建筑風格的方面去調(diào)用home2具體實例-----");
//        home2.specificplace();
        home2.specifictype();
//        home2.specificsize();
//        home2.specificprovince();
//        home2.specificcountry();
//    由上可知胧砰,在建筑風格的角度去調(diào)用,只能看到家里建筑風格冤荆,大小朴则,國家,省份看不到
        System.out.println("*******");


        System.out.println("-----從建筑大小的方面去調(diào)用home3具體實例-----");
//        home3.specificplace();
//        home3.specifictype();
        home3.specificsize();
//        home3.specificprovince();
//        home3.specificcountry();
//    由上可知钓简,在建筑大小的角度去調(diào)用,只能看到家里建筑大小汹想,風格外邓,國家,省份看不到
        System.out.println("*******");


        System.out.println("-----從居住省份的方面去調(diào)用home4具體實例-----");
//        home4.specificplace();
//        home4.specifictype();
//        home4.specificsize();
       home4.specificprovince();
//        home4.specificcountry();
//    由上可知古掏,在居住省份的角度去調(diào)用损话,只能看到家里居住的省份,大小槽唾,國家丧枪,建筑風格看不到
        System.out.println("*******");
        System.out.println("*     *");
        System.out.println("*     *");
        System.out.println("*******");


        System.out.println("-----從居住國家的方面去調(diào)用home5具體實例-----");
//        home5.specificplace();
//        home5.specifictype();
//        home5.specificsize();
//        home5.specificprovince();
        home5.specificcountry();
//    由上可知,在居住國家的角度去調(diào)用庞萍,只能看到家里居住的國家拧烦,大小,風格钝计,省份看不到
        System.out.println("*******");




    }
}


接口練習



綜合以上恋博,方案二比較好齐佳,類如果都實現(xiàn)了接口方法,則是實現(xiàn)類债沮,否則都是抽象類炼吴。

方案一:
package com.itppf.dao;

public interface IDAO {
    public abstract void connect();
    public abstract void add();
    public abstract void del();
    public abstract  void upd();
    public abstract void sel();

}
package com.itppf.dao;

public class MysqlDAO implements IDAO{

    @Override
    public void connect() {
        System.out.println("連接mysql");
    }

    @Override
    public void add() {
        System.out.println("增加數(shù)據(jù)");
    }

    @Override
    public void del() {
        System.out.println("刪除數(shù)據(jù)");
    }

    @Override
    public void upd() {
        System.out.println("更新數(shù)據(jù)");
    }

    @Override
    public void sel() {
        System.out.println("查詢數(shù)據(jù)");
    }
}

package com.itppf.dao;

public class OrcaleDAO implements IDAO{
    @Override
    public void connect() {
        System.out.println("連接Orcale");
    }

    @Override
    public void add() {
        System.out.println("增加數(shù)據(jù)");
    }

    @Override
    public void del() {
        System.out.println("刪除數(shù)據(jù)");
    }

    @Override
    public void upd() {
        System.out.println("更新數(shù)據(jù)");
    }

    @Override
    public void sel() {
        System.out.println("查詢數(shù)據(jù)");
    }
}
package com.itppf.dao;

import com.sun.org.apache.xpath.internal.operations.Or;

import java.util.Scanner;

public class FirstClient {
    public static void main(String[] args) {
        System.out.println("你想要連接哪一個數(shù)據(jù)庫");
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        if(n==1){
           IDAO idao=new MysqlDAO();
           idao.connect();
           idao.add();
           idao.del();
           idao.upd();
           idao.sel();
        }else if(n==2){
            IDAO idao=new OrcaleDAO();
            idao.connect();
            idao.add();
            idao.del();
            idao.upd();
            idao.sel();
        }


    }
}

以上方案一可以看得出程序代碼的復用性很差。

方案二:
package com.itppf.entity;

public interface IDAO {
    public abstract void connect();
    public abstract void  add();
    public  abstract  void  del();
    public  abstract  void upd();
    public  abstract  void sel();
}
package com.itppf.entity;

public  abstract class AbstractDAO implements IDAO {
    @Override
    public void add() {
        System.out.println("增加數(shù)據(jù)");
    }

    @Override
    public void del() {
        System.out.println("刪除數(shù)據(jù)");
    }

    @Override
    public void upd() {
        System.out.println("更新數(shù)據(jù)");
    }

    @Override
    public void sel() {
        System.out.println("查詢數(shù)據(jù)");
    }
}
package com.itppf.entity;

public class MysqlDAO extends AbstractDAO {
    @Override
    public void connect(){
        System.out.println("連接mysql數(shù)據(jù)庫疫衩!");
    }
}
package com.itppf.entity;

public class OrcaleDAO extends AbstractDAO{
    @Override
    public void connect() {
        System.out.println("連接orcale數(shù)據(jù)庫硅蹦!");
    }
}
package com.itppf.entity;

import com.sun.xml.internal.bind.v2.model.core.ID;

import java.util.Scanner;

public class ScondClient  {
    public static void main(String[] args) {
        System.out.println("你想連接哪個數(shù)據(jù)庫?1-mysql 2-orcale");
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        //全局聲明
        IDAO idao=null;
        if(n==1){
             idao=new MysqlDAO();
        }else if(n==2){
              idao=new OrcaleDAO();
        }
        idao.connect();
        idao.add();
        idao.del();
        idao.upd();
        idao.sel();
    }
}

方案二則是將公有的方法從接口里面抽出來闷煤,形成一個抽象類提针,然后子類繼承父類并且將不同的部分進行重寫。

注:java接口可以被繼承,而且是多繼承,但是只能是接口繼承接口,類只能實現(xiàn)接口曹傀。一個接口可以繼承另一個接口或多個,一個普通類可以實現(xiàn)多個接口辐脖。

15.成員變量初始值

1.java中的變量必須先聲明,再賦值皆愉,最后才能使用嗜价。
2.java中的成員變量,在創(chuàng)建對象的時候幕庐,都會執(zhí)行一次初始化的操作久锥,默認一個初始值。
3.基本數(shù)據(jù)類型默認值都是0异剥,引用數(shù)據(jù)類型默認值都是null瑟由,null表示的是占位符。
public class InitialValue {
    byte b;
    float f;
    double d;
    int i;
    char c;
    boolean bool;
    short s;
    long l;

    String str;
    InitialValue inital;
}
public class InitialTest {
    public static void main(String[] args) {
        InitialValue i=new InitialValue();
        System.out.println("byte="+i.b);
        System.out.println("float="+i.f);
        System.out.println("double="+i.d);
        System.out.println("int="+i.i);
        System.out.println("char="+i.c);
        System.out.println("boolean="+i.bool);
        System.out.println("short="+i.s);
        System.out.println("long="+i.l);
        System.out.println("String="+i.str);
        System.out.println("InitialValue="+i.inital);
    }
}

16.object

1.object是基類冤寿,任何類都要繼承自它歹苦。
2.我們寫的類,即使不繼承自父類督怜,也會繼承自它殴瘦。繼承的父類也是object的子類。

17.equals和==

1.==判斷左右的數(shù)據(jù)是否相等号杠。
2.object類提供的一種方法蚪腋,判斷兩個對象是否相等。
public class Cow {
    String name;
    String color;
    int age;
    public Cow(String name,String color,int age){
        this.name=name;
        this.color=color;
        this.age=age;
    }

    public static void main(String[] args) {
        Cow cow1=new Cow("小黃","黃色",12);
        Cow cow2=new Cow("小黃","黃色",12);


        System.out.println(cow1==cow2);
        System.out.println(cow1.equals(cow2));
    }
}

輸出:
false
false
3."=="一般默認基本數(shù)據(jù)類型是否相等姨蟋,判斷兩個內(nèi)存的地址是否一致屉凯,這里new開辟了新空間,所以肯定不一致眼溶。
4."equals"默認是object提供的方法悠砚。
public class Cow {
    String name;
    String color;
    int age;
    public Cow(String name,String color,int age){
        this.name=name;
        this.color=color;
        this.age=age;
    }
     public boolean equals(Cow cow){
     if(this.name==cow.name && this.color==cow.color){
         return true;
     }else{
         return false;
     }
}
    public static void main(String[] args) {
        Cow cow1=new Cow("小黃","黃色",12);
        Cow cow2=new Cow("小黃","黃色",12);


//        System.out.println(cow1==cow2);
        System.out.println(cow1.equals(cow2));
    }
}

輸出:
true
5.上面代碼中的"equals"是子類對于父類object方法的不滿,然后行的擴展偷仿,然后進行重寫哩簿。
  if(this.name==cow.name && this.color==cow.color){   //這句中的條件可以寫一個兩個或者全部宵蕉。
EG:舉個例子,cow1和cow2只有名字一樣其余都不一樣节榜,然后根據(jù)name判斷是否相等羡玛?
public class Cow {
    String name;
    String color;
    int age;
    public Cow(String name,String color,int age){
        this.name=name;
        this.color=color;
        this.age=age;
    }
     public boolean equals(Cow cow){
     if(this.name==cow.name){
         return true;
     }else{
         return false;
     }
}
    public static void main(String[] args) {
        Cow cow1=new Cow("小黃","黑色",11);
        Cow cow2=new Cow("小黃","黃色",12);


//        System.out.println(cow1==cow2);
        System.out.println(cow1.equals(cow2));
    }
}

輸出:
true
6.說明equals很靈活,縱使顏色和年齡都不同宗苍,然后根據(jù)name相等依然可以得出兩者相同稼稿。
7.同理,只有年齡不同讳窟,依然可根據(jù)name&&color得出相同让歼。
經(jīng)典案例一:
package com.itppf;

public class Tiger {
    public static void main(String[] args) {
        String str1="老虎";
        String str2="老虎";
        System.out.println(str1==str2);
        System.out.println(str1.equals(str2));

    }
}

輸出:
true;
true;

這里str1開辟了內(nèi)存地址,str2發(fā)現(xiàn)一樣后也指向了“老虎”丽啡。

經(jīng)典案例二:
package com.itppf;

public class Tiger {
    public static void main(String[] args) {
       String str3=new String("老虎");
        String str4=new String("老虎");

        System.out.println(str3==str4);
        System.out.println(str3.equals(str4));
    }
}

輸出:
false谋右;//new String來引入(”老虎“),是不同的對象补箍。
true改执;//兩個字符串的內(nèi)容是一致的。
練習模擬登陸坑雅。
import java.util.Scanner;

public class Login {

    public static void main(String[] args) {
        String username="admin";
        String userpassword="admin";
        Scanner scanner=new Scanner(System.in);
        System.out.println("請輸入用戶名:");

        String uname=scanner.nextLine();
        System.out.println("請輸入密碼:");

        String upassword=scanner.nextLine();

        if (uname.equals(username) && userpassword.equals(upassword) ){
            System.out.println("登陸成功");
        }else{
            System.out.println("登錄失敗");
        }

    }
}

這里涉及到一個問題辈挂,掃描儀調(diào)用的next()、nextInt()裹粤、nextLine()到底有什么區(qū)別终蒂?

1.他們的區(qū)別在于對于空格的處理方式不同,以及返回值不同遥诉。

2.使用nextLine()方法時拇泣,不將空格看做是兩個字符串的間隔,而是看作字符串的一部分突那,返回時挫酿,它作為String類型一并返回。

3.使用next()方法時愕难,將空格看作是兩個字符串的間隔。

4.使用nextInt()方法時惫霸,與next()方法類似猫缭,只是它的返回值是int類型的,依舊將空格看作是兩個輸入的數(shù)據(jù)的間隔壹店。

18.toString

1.toString()對一個對象字符串的表現(xiàn)形式猜丹。
2.java中建議對toString()方法進行重寫,原本默認是方法是包名+類名+內(nèi)存地址硅卢。
直接賦值:
package com.itppf.entity;

public class Dog {
    String name="小黃";        
    String color="綠色";
    int age=13;

    public static void main(String[] args) {
        Dog dog1=new Dog();
        System.out.println(dog1);
        System.out.println(dog1.toString());
    }
}
突然我在這里意識到了一個問題射窒,那就是:
直接賦值和使用構(gòu)造方法有什么區(qū)別藏杖?
直接賦值內(nèi)存地址和值都相同,構(gòu)造方法賦值脉顿,內(nèi)存地址不同蝌麸,值同。直接賦值比較耗費內(nèi)存艾疟,而使用構(gòu)造方法可以起到懶加載的作用来吩,創(chuàng)建對象后開始賦值。
使用構(gòu)造方法:
package com.itppf.entity;

public class Dog {
 String name;
    String cllor;
    int age;

    public Dog(String name,String color,int age){
        this.name=name;
        this.cllor=color;
        this.age=age;
    }

    @Override
    public String toString() {                      //這是idea提供的自動重寫方法蔽莱。
        return "Dog{" +
                "name='" + name + '\'' +
                ", cllor='" + color + '\'' +
                ", age=" + age +
                '}';
    }

  //public String toString(){                       這是我重寫的構(gòu)造方法弟疆。
   //    return "我的狗的名字叫:"+this.name+"我的狗的顏色是:"+this.color+"年齡:"+this.age;
    //}

    public static void main(String[] args) {
        Dog dog2=new Dog("小黃","黃色",13);
        System.out.println(dog2.toString());
    }
            }
這是idea提供的自動重寫方法。

這是我重寫的構(gòu)造方法盗冷。

19.instanceof關鍵字

1.主要判斷對象屬于哪種類型的怠苔。
package com.itppf.entity;

public class Mouse extends Animal {
    public static void main(String[] args) {
 Animal animal=new Mouse();
//Animal animal=new Animal();這不是老鼠。
 if(animal instanceof Mouse){
     System.out.println("這是一只老鼠");
        }else{
     System.out.println("這不是老鼠");
 }

    }
}

20.參數(shù)傳遞的問題

1.值傳遞(java中就是值傳遞)仪糖。
2.引用傳遞柑司。
package com.itppf.entity;

public class ChairTest {
    public static void chang(Chair chair){
       chair=new Chair("長椅子");
    }

    public static void main(String[] args) {
        Chair chair=new Chair("短椅子");
        chang(chair);
        System.out.println(chair.name);
    }
}
輸出:
短椅子

package com.itppf.entity;

public class ChairTest {
    public static void chang(Chair chair){
        chair.name="長椅子";
    }

    public static void main(String[] args) {
        Chair chair=new Chair("短椅子");
        chang(chair);
        System.out.println(chair.name);
    }
}
輸出:
短椅子
這里使用到了內(nèi)存分析,需要畫圖分析乓诽。

總結(jié):面向?qū)ο笾难颍系垡暯牵芽厝帧?/h4>

1.類與對象:對象操作程序鸠天,類創(chuàng)建對象讼育,類與對象就是對數(shù)據(jù)的封裝。
2.構(gòu)造:給對象設置屬性值稠集,出廠化的設置奶段、(this表示當前類的對象,拿到這個對象內(nèi)容剥纷、訪問構(gòu)造方法痹籍。super 調(diào)用自己類中父類的內(nèi)容,子類和父類中重名的內(nèi)容可以區(qū)分晦鞋,調(diào)用父類的構(gòu)造方法)蹲缠。
3.訪問權限:
4.繼承:父類有的功能,子類可以進行擴展悠垛,簡化開發(fā)线定。
5.多態(tài):同一個對象有不同的形態(tài),你可以是兒子确买,可以是爸爸斤讥,可以是弟弟。
6.抽象:abstract湾趾,抽象方法可以不寫方法體芭商,抽象類可以寫抽象方法也可以寫正常的方法派草,對子類的約束,必須重寫抽象類中的抽象方法铛楣。
7.接口:特殊的抽象類近迁,interface。能繼承接口的必須是接口蛉艾。類可實現(xiàn)接口钳踊,一個類可以實現(xiàn)多個接口,為了彌補java不能多繼承勿侯,java可以多實現(xiàn)拓瞪。
8.內(nèi)存分析:

21.異常處理

編譯異常:語法錯誤,編碼錯誤助琐。
1.運行異常:編譯的時候是沒有錯誤的祭埂,語法方面是絕對正確的,找的就是運行時候的錯誤兵钮。
2.拋異常:發(fā)現(xiàn)錯誤的時候蛆橡,會創(chuàng)建一個錯誤的對象對錯誤進行收集,丟出錯誤對象的過程叫拋異常掘譬。
3.捕獲異常:默認由JVM來捕獲異常泰演,對錯誤信息進行打印,JVM會終止程序的進行葱轩。
1.異常的分類:
Throwable是所有異常的根睦焕,所有的異常都繼承自Throwable,類似于Object靴拱。
Error:系統(tǒng)級的錯誤垃喊。
RuntimeExpection:運行異常,不手動處理袜炕,出問題了處理本谜,例子(車爆胎)。
其他Exception:必須要經(jīng)過手動處理偎窘,例子(路障)乌助。
2.異常處理try...catch
語法:
try{
嘗試執(zhí)行的代碼;
}catch(Exception e){                      //catch抓住,Exception類型的e來接收異常。
處理異常的代碼;
}finally                                 //無論是否出錯陌知,都要finally  
舉個例子
package com.itppf.entity;

public class YcTest {
    public static void main(String[] args) {
     try{
         System.out.println(1/0);
     }catch (Exception e){
         e.printStackTrace();   //打印出錯誤眷茁,面向程序員。
         System.out.println("程序出錯了纵诞!"); //面向用戶
     }finally{
         System.out.println("執(zhí)行finally");
     }
    }
}

如果程序是對的呢?


finally:很有用培遵,代碼沒有錯浙芙,可以使用finally看到登刺。
使用finally關閉文件,否則文件始終處于打開狀態(tài)嗡呼。
3.異常處理throws和throw
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class FileTest {
   public static void read(){
       InputStream inputStream=new FileInputStream(new File("hello,world!"));
   }
}
第一種:try...catch
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class FileTest {
   public static void read(){
       try{
           InputStream inputStream=new FileInputStream(new File("hello,world!"));
       }catch (Exception e){
           System.out.println("出錯");
       }finally{
           System.out.println("結(jié)束");
       }
   }
}
第二種方法:代表當前異常不處理這個錯誤纸俭,扔出去,有人調(diào)用這個方法南窗,誰調(diào)用誰處理揍很。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class FileTest {
   public static void read() throws Exception{    //代表當前異常不處理這個錯誤,扔出去万伤,有人調(diào)用這個方法窒悔,誰調(diào)用誰處理。敌买。
       InputStream inputStream=new FileInputStream(new File("hello,world!"));

   }

    public static void main(String[] args) {
        try {
            read();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

或者繼續(xù)拋出简珠。

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class FileTest {
   public static void read() throws Exception{    //代表當前異常不處理這個錯誤,扔出去虹钮,有人調(diào)用這個方法聋庵,誰調(diào)用誰處理。芙粱。
       InputStream inputStream=new FileInputStream(new File("hello,world!"));


   }

    public static void main(String[] args) throws Exception{
        read();
        }
    }
這樣一直拋祭玉,等于會拋給用戶。
盡量能處理的問題不要拋給用戶
4.自定義異常

直接繼承Exception或者RuntimeException來實現(xiàn)自定義異常春畔。

public class Person {
    String name;
    String gender;
    public  Person(String name,String gender){
        this.name=name;
        this.gender=gender;

    }
}
public class Bathhouse {
    public void  manBathhouse(Person person) throws GenderException{
        if(person.gender.equals("男")){
            System.out.println("歡迎來到男浴室");  //如果是男脱货,歡迎來到男浴室。
        }else {       //否則拋出異常
            throw new GenderException("走錯了");
        }
    }
}
//自己定義的必須繼承Exception或者RuntimeException
public class GenderException extends Exception {
    public GenderException(String msg){
        super(msg);        //調(diào)用父類的構(gòu)造方法

    }
}
public class GenderTest {
    public static void main(String[] args) throws GenderException{
        Person person1=new Person("張三","男");
        Person person2=new Person("李四","女");

        Bathhouse bathhouse=new Bathhouse();
//        bathhouse. manBathhouse(person1);
        bathhouse.manBathhouse(person2);
    }
}

以上就是我跟這IT老男孩學習的面向?qū)ο蟮墓P記拐迁,大多是我自己感悟蹭劈,有的也不一定正確,希望大家批評指正线召。我覺得經(jīng)過學習后基本了解了面向?qū)ο笃倘停院笮枰獙W習的還有很多,數(shù)據(jù)結(jié)構(gòu)以及數(shù)組缓淹,對接口哈打,繼承,封裝讯壶,多態(tài)的深入了解料仗,以及java的二十三種設計模式,加油吧伏蚊。

筆記和代碼已放到github上面:
筆記:https://github.com/FSDWNS/theory.git
代碼:https://github.com/FSDWNS/java.git

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

  • 序言:七十年代末立轧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氛改,老刑警劉巖帐萎,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胜卤,居然都是意外死亡疆导,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門葛躏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澈段,“玉大人,你說我怎么就攤上這事舰攒“芨唬” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵芒率,是天一觀的道長囤耳。 經(jīng)常有香客問我,道長偶芍,這世上最難降的妖魔是什么充择? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮匪蟀,結(jié)果婚禮上椎麦,老公的妹妹穿的比我還像新娘。我一直安慰自己材彪,他們只是感情好观挎,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著段化,像睡著了一般嘁捷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上显熏,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天雄嚣,我揣著相機與錄音,去河邊找鬼喘蟆。 笑死缓升,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蕴轨。 我是一名探鬼主播港谊,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橙弱!你這毒婦竟也來了歧寺?” 一聲冷哼從身側(cè)響起燥狰,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎成福,沒想到半個月后碾局,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡奴艾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡兼丰,死狀恐怖尖阔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庶诡,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站此疹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏遮婶。R本人自食惡果不足惜蝗碎,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旗扑。 院中可真熱鬧蹦骑,春花似錦、人聲如沸臀防。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袱衷。三九已至捎废,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間致燥,已是汗流浹背登疗。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篡悟,地道東北人谜叹。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像搬葬,于是被迫代替她去往敵國和親荷腊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355