1. 程式人生 > >Java中類和介面的一些概念

Java中類和介面的一些概念

類和介面分別有哪些:

常規內部類,靜態內部類,區域性內部類,匿名內部類,抽象類,介面。

內部類的一些好處: 

1.解決多繼承
 2.解決繼承和實現介面時候方法名相同引起的衝突情況(使用內部類可以間接實現多繼承,可以解決實現的多個介面之間,或繼承的類與介面之間方法同名的衝突)
3.實現資料隱藏(非內部類是不允許使用private 與protected來修飾類的,但內部類可以。且內部類為private的時候,通過外部類提供方法來訪問內部類)

4.內部類擁有外圍類的所有元素的訪問許可權

普通內部類

 1.不能有靜態屬性和方法
 2.內部類可以使用外部類的所有屬性和方法
 3.外部類不能直接使用內部類的屬性和方法,使用前必須先例項化

 例項:

public class Example {

    private String name ="exampleName";

    public void ExampleMethod(){
        String innerStr = new ExampleInner().innerStr;//在外部類中呼叫內部類屬性
        System.out.println("ExampleMethod->ExampleInner.innerStr = " + innerStr);
        new ExampleInner().ExampleInnerMethod();//在外部類中直接呼叫屬性
    }
    public class ExampleInner {

        private String innerStr = "exampleInnerStr";
        
        public void ExampleInnerMethod(){
            System.out.println("ExampleInnerMethod-> Example.name:" + name);
        }
    }
    public static void main(String[] args) {
        new Example().ExampleMethod();//外部類呼叫本類方法輸出呼叫內部類的方法及屬性的內容
        new Example().new ExampleInner().ExampleInnerMethod();//外部類和內部類例項化後呼叫內部類方法
        String s = new Example().new ExampleInner().innerStr;//外部類和內部類例項化後呼叫內部類屬性
        System.out.println("s = " + s);
    }
}




靜態內部類

 1.可以包含靜態方法和屬性

 2.不需要再例項化外部類  StaticOutter.StaticInner in = new StaticOutter.StaticInner();

 3.和靜態方法不一樣的是,靜態內部類中可以定義靜態的也可以定義非靜態的成員

例項:

public class Example {
    private String name ="exampleName";
    private static String name_1 = "name_1";

    public static void ExampleMethod(){
        System.out.println("ExampleMethod");
    }

    /**
     * 可以把靜態內部類當成一個外部類的靜態成員
     */
    public static class ExampleInner {
        private String name ="exampleInnerName";
        protected String innerStr = "innerStr";
        protected static String staticInnerStr = "staticInnerStr";

        public static void ExampleInnerMethod(){
            //外部類的靜態方法,不能呼叫非靜態方法
            ExampleMethod();
            //靜態內部類呼叫外部內的屬性及常量必須為static
            System.out.println("ExampleInnerMethod-> Example.name_1:" + name_1);
        }
        public void method(){
            System.out.println("method");
        }
    }
    public static void main(String[] args) {
        //呼叫內部類的靜態方法;方法和屬性可直接通過innerClass.方法/屬性呼叫
        Example.ExampleInner.ExampleInnerMethod();
        //呼叫內部類的靜態屬性
        String staticInnerStr = Example.ExampleInner.staticInnerStr;
        System.out.println("staticInnerStr = " + staticInnerStr);
        //呼叫內部類的非靜態屬性;同包名下使用 new Example.ExampleInner().innerStr;操作
        String innerStr = new ExampleInner().innerStr;
        System.out.println("innerStr = " + innerStr);
        //內部類非靜態方法必須要例項化才能呼叫
        new Example.ExampleInner().method();
    }
}

區域性內部類(外部類的方法中的內部類;實際開發中不常用)

 可以把區域性內部類當作外部類方法中的一個區域性變數

 1.不能有訪問修飾符(public,protected,private,static等)

 2.區域性內部類在方法中,靜態和非靜態都可以

 2.可以訪問方法中的區域性變數和類中的所有屬性、方法

 3.與區域性變數不一樣的是,區域性內部類只能訪問 final 修飾的區域性變數(也即只能訪問常量)

 4.區域性內部類中不可定義靜態變數(不管外部類的方法是不是靜態的)

例項:

public class Example {

    private String name="exampleName";

    public void ExampleMethod(final String methodName){
        String exampleMthodStr="exampleMthodStr";
        final String exampleMthodStr_1="exampleMthodStr_1";
        final String name="ExampleMethod-->>name";
        class ExampleInner{
            String innerStr="innerStr";
            //static String innerStr_1="innerStr_1"; //區域性內部類不能有靜態屬性和方法
            public ExampleInner(String methodName) {
                ExampleMethod();//外部類方法
                System.out.println(name);//外部類屬性
                System.out.println(methodName);//構造方法引數
                System.out.println("ExampleInner :" + innerStr);//區域性內部類屬性
                System.out.println("exampleMthodStr_1 :" + exampleMthodStr_1);//區域性內部類訪問區域性變數
                System.out.println("Example :" + Example.this.name);//外部內部類屬性
                System.out.println("name :" + name);//區域性內部類訪問區域性變數
                //System.out.println(exampleMthodStr);//錯誤,只能訪問由final修飾的區域性變數
            }
            public static void (){
                
            }
        }
        System.out.println("ExampleMethod");
        new ExampleInner(methodName);//初始化區域性內部類的構造方法
    }

    /**
     * 外部類普通方法
     */
    public void ExampleMethod(){
        System.out.println("example-->>");
    }
    public static void main(String[] args) {
        new Example().ExampleMethod("main");
    }
}


匿名內部類(回撥方法,沒有類名的內部類,相對簡單,例項就不再贅述了)

 1.子類中只有一個無參構造器

 2.必須例項化

抽象類(以abstract宣告的類)

 好處:複用
 規範:  只要一個類中包含一個抽象方法,這個類一定是抽線類
 抽象類中不一定包含抽象方法
 抽象類可以繼承抽象類,所有抽象方法方法由第一個非抽象子類實現
 抽象方法不能宣告為private或者final方法
 不能抽象屬性

介面:interface:

好處:抽象

解決java多繼承
介面不是類,是對一組要求的描述

100%抽象
所有方法均為抽象方法
所有方法預設為abstract方法,所以可以不用將方法標記為abstract
所有變數預設為static final變數
 

 implements:實現介面

 class A implements Interface
 介面繼承介面,介面可以實現多繼承
 interface B
 interface C
 interface A extends B, C