java核心技術-內部類

高級類特性-(類的成員之一:內部類)
內的成員之一:內部類(屬性、方法、構造器、代碼塊) 能夠有四種權限訪問修飾符java

注意:外部類 只有兩種 public 和 defaultsql

定義 : 能夠將一個類的定義放在另外一個類定義的內部,這就是內部類 -thinking in Java後端

用法:若是一個類 僅跟本類關係密切的話 對於其餘類但願隱藏 就可使用內部類 例ArrayList中的 Itr架構

一.成員內部類併發

成員內部類也是最普通的內部類,它是外圍類的一個成員。分佈式

在成員內部類中要注意兩點,第一:成員內部類中不能存在任何static的變量和方法;第二:成員內部類是依附於外圍類的,因此只有先建立了外圍類纔可以建立內部類。ide

public class TestInnerClass {
public static void main(String[] args) {
//建立非靜態內部類的對象
Person p = new Person();
Person.Computer pc = p.new Computer();
pc.setName("IBM");
//System.out.println(pc.getName());
}
}
class Person {
private String name = "張三";
private int age;高併發

public Person() {
    super();
}

public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}

public class Computer{
    private String name = "lenovo";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("setName 方法局部變量name: " + name);
        System.out.println("Computer 的屬性name:" + this.name);
        System.out.println("外部內Person 屬性的name:" + Person.this.name);
        this.name = name;
    }

}

}
二.局部內部類性能

有這樣一種內部類,它是嵌套在方法和做用於內的,對於這個類的使用主要是應用與解決比較複雜的問題,想建立一個類來輔助咱們的解決方案,到那時又不但願這個類是公共可用的,因此就產生了局部內部類,局部內部類和成員內部類同樣被編譯,只是它的做用域發生了改變,它只能在該方法和屬性中被使用,出了該方法和屬性就會失效。(作Java後端 用法極少見 本人三年開發 從沒見過有人用過)學習

public class TestInnerClass2 {

//局部內部類:以下方式使用很是的少
private void show(){

    class Inner{

    }
}

//若是一個類僅適用於當前方法時,能夠聲明以下方式
public static Comparator getComparator(){

    class MyComparator implements Comparator{

        @Override
        public int compare(Object o1, Object o2) {
            return 0;
        }

    }
    return new MyComparator();
}

public static void main(String[] args) {
    Comparator comparator = TestInnerClass2.getComparator();
}

}
三.匿名內部類

注意:

1.匿名內部類是沒有訪問修飾符的
2.想使用外部的一個變量 該變量要用final修飾 -java8開始不須要
public class TestInnerClass2 {

public static Comparator getComparator1(){

    Comparator com = new Comparator(){ //匿名內部類實現的Comparator接口,new的是匿名內部類的構造器

        @Override
        public int compare(Object o1, Object o2) {
            // TODO Auto-generated method stub
            return 0;
        }

    };

    return com;
}

public static void main(String[] args) {
    Comparator comparator = TestInnerClass2.getComparator1();
    /*  comparator.compare(o1, o2);*/
}

}
四.靜態內部類

在java提升篇-----關鍵字static中提到Static能夠修飾成員變量、方法、代碼塊,其餘它還能夠修飾內部類,使用static修飾的內部類咱們稱之爲靜態內部類,不過咱們更喜歡稱之爲嵌套內部類。靜態內部類與非靜態內部類之間存在一個最大的區別,它是屬於類自己,而不是某個對象。

public class TestInnerClass {
public static void main(String[] args) {
//建立靜態內部類的實例
Person.Mobile pm = new Person.Mobile();
pm.show();

}

}

class Person {

//靜態內部類
static class Mobile{
    public void show(){
        System.out.println("這是靜態內部類的方法");
    }
}

}
五.內部類標識符

因爲每一個類都會產生一個.class文件,其中包含了如何建立該類型的對象的所有信息。您可能猜到了,內部類也必須生成一個.class文件以包含它們的Class對象信息。這些類文件的命名有嚴格的規則:外圍類的名字,加上$,再加上內部類的名字。若是內部類是匿名的,編譯器會簡單地產生一個數字做爲其標識符。 歡迎工做一到五年的Java工程師朋友們加入Java羣: 891219277羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!

相關文章
相關標籤/搜索