Java學習第14天

接口

  • (英文:Interface)公你,在JAVA編程語言中是一個抽象類型洗做,是抽象方法的集合,接口通常以interface來聲明璃弄。一個類通過實現(xiàn)接口的方式,從而來繼承接口的抽象方法构回。

  • 接口是方法聲明的集合夏块。接口里的方法是自動公開的而且都是抽象的疏咐,編譯器會自動加上public abstract

  • 接口里的方法都是抽象的,不能再接口中實現(xiàn)脐供。但是Java 8 以后凳鬓,接口中的方法可以通過default來默認實現(xiàn)。實現(xiàn)接口的類在實現(xiàn)接口(implements)的方法中可以重寫這些方法患民,若不重寫缩举,這些方法會使用默認的實現(xiàn)方法(default)

  • 一個類只能繼承一個抽象類,而一個類卻可以實現(xiàn)多個接口匹颤,通過逗號連接

  • 接口沒有構(gòu)造方法

  • 接口可以多重繼承(可以繼承其他接口)

  • 類和類之間簡單的說有三種關(guān)系:

  1. is-a 關(guān)系 - 繼承 - 學生和人
  2. has-a關(guān)系 - 關(guān)聯(lián)(聚合/合成) - 撲克和一張牌
  3. use-a關(guān)系 - 依賴 - 人和房子
  • 類和它實現(xiàn)的接口之間的關(guān)系:
    play-a / like-a - 實現(xiàn)

#######接口案例:

  • 爸爸類
package org.mobiletrain;

public class Father {

    protected String name;
    
    public Father(String name) {
        this.name = name;
    }
    
    public void gamble(){
        System.out.println(name + "正在賭博");
    }
}
  • 和尚類
package org.mobiletrain;


public interface Monk {

    public default void chant(){
        System.out.println("hello");
    }
    
    public void eatVegetable();
    
    public void knockTheBell();
}
  • 音樂家類
package org.mobiletrain;

public interface Musician {

    void playPiano();
    
    void playViolin();
}
  • son類繼承了father類仅孩,同時實現(xiàn)了monk和musician接口
package org.mobiletrain;

public class Son extends Father implements Monk,Musician {

    public Son(String name) {
        super(name);
        
    }

    public void somke(){
        System.out.println(name + "正在抽煙");
    }

    @Override
    public void chant() {       
         System.out.println(name + "正在念《大悲咒》");
    }

    @Override
    public void eatVegetable() {
        System.out.println(name + "正在念吃齋");
    }

    @Override
    public void knockTheBell() {
        System.out.println(name + "正在敲鐘");
    }

    @Override
    public void playPiano() {       
        System.out.println(name + "正在彈鋼琴");
    }

    @Override
    public void playViolin() {
        System.out.println(name + "正在拉小提琴");
    }
    
    
}

Java 8 出現(xiàn)的適配器(Adapter)

  • 使用適配器,可以選擇性地實現(xiàn)一個接口中的某些方法印蓖;

####### 鼠標點擊辽慕,出現(xiàn)隨機顏色隨機大小的圓,且不會移動出邊框

  • 先創(chuàng)建一個ball類
package org.mobiletrain.ui;

import java.awt.Color;
import java.awt.Graphics;

/**
 * 小球
 * @author apple
 *
 */
public class Ball {

    protected Color color;//顏色
    protected int x;    //左上角橫坐標
    protected int y;    //左上角縱坐標
    protected int size; //尺寸
    protected int sx;   //速度在橫坐標上的分量
    protected int sy;   //速度在縱坐標上的分量
    
    public Ball(Color color,int x,int y,int size,int sx,int sy) {
        this.color = color;
        this.x = x;
        this.y = y;
        this.size = size;
        this.sx = sx;
        this.sy = sy;
    }

    public void move(){
        x += sx;
        y += sy;
        
        if (x <= 0 || x > 800 - size) {
            sx = -sx;
        }
        
        if (y <= 30 || y >= 600 - size) {
            sy = -sy;
        }
    }
    
    public void draw(Graphics g){
        g.setColor(color);
        g.fillOval(x - size / 2, y - size / 2, size, size);
    }
    
}
  • 再創(chuàng)建一個窗口(繼承JFrame)
package org.mobiletrain.ui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.Timer;

//動畫
@SuppressWarnings("serial")
public class Frame extends JFrame {
    private BufferedImage image = new BufferedImage(800, 600, 1);
    //private Ball ball = new Ball(Color.BLUE, 20, 30, 80, 4, 4);
    private Ball ballsArray[] = new Ball[100];
    private int total = 0;
    
    public Frame(){
        this.setSize(800,600);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e){
                if (total < ballsArray.length) {
                    int x = e.getX();
                    int y = e.getY();
                    int size = (int) (Math.random() * 81 + 20);
                    int sx = (int) (Math.random() * 20 - 10);
                    int sy = (int) (Math.random() * 20 - 10);
                    Color color = getRandmColor();
                        Ball ball = new Ball(color, x, y, size, sx, sy);
                        ballsArray[total++] = ball;             
                }
            }
        });
        
        
        Timer timer = new Timer(40, e -> {
            //ball.move();
            for (int i = 0; i < total; i++) {
                ballsArray[i].move();
            }
            repaint();
        });
        timer.start();
    }
    
    public Color getRandmColor(){
        int r = (int) (Math.random() * 256);
        int g = (int) (Math.random() * 256);
        int b = (int) (Math.random() * 256);
        return new Color(r, g, b);
    }
    
    @Override
    public void paint(Graphics g) {
        Graphics otherGraphics = image.getGraphics();
        super.paint(otherGraphics);
        //ball.draw(otherGraphics);
        for(int i = 0;i < total;i++){
            ballsArray[i].draw(otherGraphics);
        }
        g.drawImage(image,0,0,null);
    }
    
    
    public static void main(String[] args) {
        new Frame().setVisible(true);
    }
}

lambda表達式

  • Java 8+ ---> lambda表達式(匿名函數(shù))
    僅限于接口中只有一個方法赦肃,而且沒有默認實現(xiàn)

#######在窗口設(shè)置一個按鈕溅蛉,點擊按鈕,窗口背景顏色更改

package org.mobiletrain.ui;

import java.awt.Color;
//import java.awt.event.ActionEvent;
//import java.awt.event.ActionListener;


import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class MyFrame extends JFrame {

    public MyFrame(){
        this.setSize(300,200);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLayout(null);
        
        JButton okButton = new JButton("確定");
        okButton.setBounds(120, 100, 60, 30);
//      ActionListener listener = new ActionListener() {
//          
//          //只有一個方法的接口(函數(shù)接口)他宛,里面的方法通常都是回調(diào)方法
//          //接口的回調(diào)(callback)方法
//          @Override
//          public void actionPerformed(ActionEvent e) {
//              changeBgColor();
//              
//          }
//      }
        
        //Java 8+ ---> lambda表達式(匿名函數(shù))
        //僅限于接口中只有一個方法船侧,而且沒有默認實現(xiàn)
        okButton.addActionListener(e -> {
            changeBgColor();
        });
        //okButton.addActionListener(listener);//動作監(jiān)聽器,監(jiān)聽按鈕的點擊事件
        this.add(okButton);
    }
    
    public void changeBgColor(){
        int r = (int) (Math.random() * 256);
        int g = (int) (Math.random() * 256);
        int b = (int) (Math.random() * 256);
        this.getContentPane().setBackground(new Color(r, g, b));
    }
    
    public static void main(String[] args) {
        new MyFrame().setVisible(true);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厅各,一起剝皮案震驚了整個濱河市镜撩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌队塘,老刑警劉巖袁梗,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異憔古,居然都是意外死亡遮怜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門鸿市,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锯梁,“玉大人,你說我怎么就攤上這事灸芳±晕Γ” “怎么了拜姿?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵烙样,是天一觀的道長。 經(jīng)常有香客問我蕊肥,道長谒获,這世上最難降的妖魔是什么蛤肌? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮批狱,結(jié)果婚禮上裸准,老公的妹妹穿的比我還像新娘。我一直安慰自己赔硫,他們只是感情好炒俱,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爪膊,像睡著了一般权悟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上推盛,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天峦阁,我揣著相機與錄音,去河邊找鬼耘成。 笑死榔昔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的瘪菌。 我是一名探鬼主播撒会,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼师妙!你這毒婦竟也來了茧彤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疆栏,失蹤者是張志新(化名)和其女友劉穎曾掂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壁顶,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡珠洗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了若专。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片许蓖。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖调衰,靈堂內(nèi)的尸體忽然破棺而出膊爪,到底是詐尸還是另有隱情,我是刑警寧澤嚎莉,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布米酬,位于F島的核電站,受9級特大地震影響趋箩,放射性物質(zhì)發(fā)生泄漏赃额。R本人自食惡果不足惜加派,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跳芳。 院中可真熱鬧芍锦,春花似錦、人聲如沸飞盆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吓歇。三九已至车胡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間照瘾,已是汗流浹背匈棘。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留析命,地道東北人主卫。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像鹃愤,于是被迫代替她去往敵國和親簇搅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法软吐,類相關(guān)的語法瘩将,內(nèi)部類的語法,繼承相關(guān)的語法凹耙,異常的語法姿现,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,522評論 3 93
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • 沒有 到更南的地方看一看 認定北方的天更清 漫雪 是天地的盛裝舞會 墨發(fā)低垂的女孩揚眉起舞 足尖右點 左邊足印又淹...
    W_li閱讀 232評論 2 3
  • 認識我的人絕不相信,我也曾安靜過肖抱。 我原本是一個極其安靜的小姑娘备典。一早背著書包來,放學背著書包走意述;下午...
    西哈哈閱讀 224評論 0 1