能夠理解爲特殊的抽象類java
關鍵字interface -->接口安全
接口是功能體的集合ide
是一個引用數據類型函數
可以解耦測試
規定開發規範this
屬性:atom
必須是公共的靜態的常量 public static finalspa
public staic final 能夠選擇性省略(默認)線程
方法:必須是公共的抽象的方法設計
public abstract 返回值類型 方法名();
public absract 能夠選擇性省略
注意:
接口的實現與類的繼承很是像,可是不同在:
子類繼承父類就能夠直接使用父類的內容
實現類實現接口,也擁有接口中的能力,可是須要實現列本身去實現這個功能
接口實現的關鍵字是implement,繼承的關鍵字是extends
類只能單繼承,接口能夠多實現,一個類須要繼承父類後實現接口.
若是先接口後繼承,會形成系統沒法判斷接口的個數.
接口也不能實例化
接口的使用只能經過類去實現接口
具體的實現類:重寫了全部的抽象方法+按需新增
抽象類的實現:按需重寫了抽象方法+按需新增,具體的子類才能使用
在抽象類中,能夠所有實現,也能夠部分實現
//抽象實現類
abstract class Demo02 implements InterfaceDemo02{
// @Override
// public void demo2() {
// // TODO Auto-generated method stub
//
// }
}
繼承和實現的幾種狀況
接口和接口之間是能夠繼承的
類和接口之間只能實現
接口之間能夠多繼承
類和接口之間能夠多實現
//定義一個接口InterfaceDemo02
interface InterfaceDemo02{
public void demo1();
}
//定義一個接口InterfaceDemo03
interface InterfaceDemo03{
public void demo2();
}
//定義一個接口InterfaceDemo04 並繼承InterfaceDemo02及InterfaceDemo03
interface InterfaceDemo04 extends InterfaceDemo02,InterfaceDemo03{
}
實現了接口
public class Demo implements InterfaceDemo02, InterfaceDemo03 {//與只實現InterfaceDemo04做用相同
public void demo2() {
System.out.println("實現了接口02");
}
public void demo1() {
System.err.println("實現了接口03");
}
}
在接口中能夠定義方法體的方法
默認方法:default關鍵字修飾(必須是顯式的)
使用:經過實現類使用
靜態方法
使用:接口名使用
public interface InterfaceDemo05 {
//默認方法
public default void moren(){
System.out.println("我是默認方法");
}
//靜態方法
public static void test(){
System.out.println("我是靜態方法");
}
}
//實現類
class Impl implements InterfaceDemo05{
}
測試
public class Test {
public static void main(String[] args) {
//默認方法經過類實現
Impl i=new Impl();
i.moren();
//靜態方法經過接口名.方法調用
InterfaceDemo05.test();
}
}
保證一個類只能有一個對象,這個特色形式的類成爲單例模式,可是不影響類中原有功能.
構造器私有化
私有的 靜態的該類引用,存儲建立惟一的對象
公共的 靜態方法方式
兩種方式
當第一次調用的時候才建立這個實例 ---線程不安全,效率較高
示例
//餓漢式
public class SingTon {
//1.構造器私有化
private SingTon(){
}
//2.私有的,靜態的該類的引用,存儲建立惟一的對象
//在類的第一次加載時候,建立一個惟一的實例
private static SingTon single=new SingTon();
//3.公共的 靜態的方法方式
//返回值:當前數據類型 參數:沒有
private static SingTon newInstance(){
//將當前建立的實例返回出去
return single;
}
}
在類的第一次加載完成以後,就建立這個實例 ---線程安全,效率較低
示例
//懶漢式
public class Single {
//1.私有的構造函數
private Single(){
}
//2.私有的 靜態的 該類的引用,存儲建立惟一的對象
//先建立一個對象的默認參數爲null
private static Single single=null;
//3.公共的靜態的該類的引用
public static Single newInstance(){
//先判斷實例是否是爲空,若是爲空則新建
//若是不爲空則返回上一次對象的地址
if(single==null){
Single single=new Single();
}
return single;
}
}
真實角色和代理角色實現相同的接口|繼承相同的父類
代理角色持有真實角色的引用:成員屬性進行維護
代理行爲
注意:減小與真實角色的交流,下降耦合度,起到功能的擴展,方便後期維護
/*經理要經過人事招人,至關於 技術部經理 找了 人事當代理
真實角色:經理
代理:人事
行爲:招人(人事和經理都須要實現)
代理模式就是把真實角色做爲代理角色的一個成員變量
*/
public class StaticProxy {
public static void main(String[] args) {
}
}
//經理
class Manager implements Hiring{
public void hiring() {
System.out.println("我是經理,我要招人");
}
}
//人事
class Hr implements Hiring{
Manager manager;
//徹底能夠經過構造函數把真實角色引入到這個代理角色中
public Hr(Manager manager) {
super();
this.manager = manager;
}
public void hiring() {
System.out.println("我是人事,我要初試");
//重頭戲 把真實角色當成代理模式的一個成員
this.manager.hiring();
System.out.println("成功錄取");
}
}
//行爲:招人
interface Hiring{
void hiring();
}
//測試
class Test{
public static void main(String[] args) {
Manager m=new Manager();
Hr h=new Hr(m);
h.hiring();
}
}
/*
*需求:咱們直接從工廠拿車,若是是兩輪輸出兩輪
* 四輪輸出四輪
*
*/
public class Factory {
public static void main(String[] args) {
Car two=new TwoCar();
Car four=new FourCar();
Factory f=new Factory();
two.make();
f.factory(two);
two.run();
four.make();
f.factory(four);
four.run();
}
/*
有一家工廠能夠造兩個輪子也能夠造四個輪子
一工廠是能夠生產車的,這個是一個功能(方法)
結果:肯定這個是方法
二工廠是能夠生產不一樣的車的,能夠建立不一樣的對象
結果:肯定方法體的內容
三工廠不管生產哪一種類型的車都是車,因此返回值必定是車
結果:肯定返回值類型
四工廠生產車,須要給輸入值
結果:肯定參數
*/
//看傳入的是不是 TwoCar或ForCar的一個實例
public static Car factory(Car srt){
if(srt instanceof TwoCar){
System.out.println("在造兩輪");
}
if(srt instanceof FourCar){
System.out.println("在造四輪");
}
return srt;
}
}
interface Car{
void make();
void run();
}
class TwoCar implements Car{
public void make() {
System.out.println("我是造兩輪的模板");
}
public void run() {
System.out.println("烏龜");
}
}
class FourCar implements Car{
public void make() {
System.out.println("我是造四輪的模板");
}
public void run() {
System.out.println("飛同樣的感受");
}
}
成員內部類
靜態內部類
私有內部類
局部內部類
匿名內部類
當內部類做爲外部類的成員,就是成員內部類
外部成員----------內部類
特色:
是成員就具備成員的特色,就是可使用成員修飾符修飾
是類就有類的特色,能夠繼承及實現
內部類可使用外部列的內容,包括私有的
在外部類中能夠經過內部類的對象使用其成員
成員內部類中不能定義靜態內容除了靜態常量
私有內部類可使用外部類中的私有內容
外部類中可使用私有內部了中的私有內容,須要經過內部類對象使用
私有的內部類中只能在外部類中使用,其餘類中沒法使用
只有靜態內部類中能夠定義靜態的內容,除了靜態的內容
靜態內部類中使用外部類中的成員,經過外部類對象使用,由於內部類是靜態
方法中的內部列
不能使用成員修飾符 public static(final能夠)
局部只能在它當前定義的方法中使用,經過對象使用
若是想要在局部內部類中使用當前方法的參數,這個參數必須被final修飾,在jdk1.8中final能夠省略,可是默認
匿名內部類
匿名對象的內部類
方法的參數