蘇州培訓(xùn)網(wǎng) > 蘇州web前端培訓(xùn)機(jī)構(gòu) > 蘇州其然軟件開發(fā)培訓(xùn)
首頁(yè) 培訓(xùn)網(wǎng) 最新資訊 熱門問(wèn)答

蘇州其然軟件開發(fā)培訓(xùn)

13013833891 免費(fèi)試聽

您當(dāng)前的位置: 蘇州軟件系統(tǒng)培訓(xùn) > 蘇州web前端培訓(xùn) > 張家港Java工程師培訓(xùn)哪家好哪里好

張家港Java工程師培訓(xùn)哪家好哪里好_JAVA培訓(xùn)

¥詳詢

班制:周末班

蘇州其然軟件開發(fā)
上課(咨詢)地址:蘇州市昆山市震川西路111號(hào)名仕大廈
報(bào)名咨詢 預(yù)約試聽
課程介紹
張家港Java工程師培訓(xùn)哪家好哪里好
一個(gè)合格的未來(lái) Java工程師

張家港Java工程師培訓(xùn)哪家好哪里好

張家港Java工程師培訓(xùn)哪家好哪里好

Java工程師的工資待遇怎么樣?

張家港Java工程師培訓(xùn)哪家好哪里好

Java工程師的工資待遇怎么樣?

Java軟件工程師一般月薪范圍在4000-10000元,遠(yuǎn)遠(yuǎn)超過(guò)了應(yīng)屆畢業(yè)生月薪 2500元的平均水平。通常來(lái)說(shuō),有一年工作經(jīng)驗(yàn)的Java高級(jí)軟件工程師的薪酬大致在年薪10—13萬(wàn)左右。

從Java的應(yīng)用領(lǐng)域來(lái)分,Java語(yǔ)言的應(yīng)用方向主要表現(xiàn)在以下三個(gè)方面:首 先是大中型的商業(yè)應(yīng)用;其次是桌面應(yīng)用,就是常說(shuō)的C/S應(yīng)用;再次是移動(dòng)領(lǐng)域應(yīng)用。

綜上而言JAVA就業(yè)方向?yàn)椋嚎梢詮氖翵SP網(wǎng)站開發(fā)、Java編程、Java游戲開 發(fā)、Java桌面程序設(shè)計(jì),以及其他與Java語(yǔ)言編程相關(guān)的工作??蛇M(jìn)入電信、銀行、保險(xiǎn)專業(yè)軟件開發(fā)公司等從事軟件設(shè)計(jì)和開發(fā)工作。

JavaWeb開發(fā)

張家港Java工程師培訓(xùn)哪家好哪里好

JavaWeb開發(fā)

  • 01HTML5與CSS3

    • 1.B/S架構(gòu)

    • 2.HTML基本使用

    • 3.HTML DOM

    • 4.CSS選擇器

    • 5.常用樣式

    • 6.盒子模型與布局

    • 7.HTML5新特性

    • 8.CSS3新特性

  • 02JavaScript

    • 1.JavaScript基本語(yǔ)法

    • 2.JavaScript流程控制

    • 3.?dāng)?shù)組、函數(shù)、對(duì)象的使用

    • 4.JavaScript事件綁定/觸發(fā)

    • 5.JavaScript事件冒泡

    • 6.JavaScript嵌入方式

    • 7.JavaScript DOM操作

    • 8.DOM API

  • 03jQuery

    • 1.jQuery快速入門

    • 2.jQuery語(yǔ)法詳解

    • 3.jQuery核心函數(shù)

    • 4.jQuery對(duì)象/JavaScript對(duì)象

    • 5.jQuery選擇器

    • 6.jQuery 文檔處理

    • 7.jQuery事件

    • 8.jQuery動(dòng)畫效果

  • 04AJAX&JSON

    • 1.AJAX技術(shù)衍生

    • 2.XMLHttpRequest使用

    • 3.同步請(qǐng)求&異步請(qǐng)求

    • 4.JSON語(yǔ)法

    • 5.Java JSON轉(zhuǎn)換

    • 6.JavaScript JSON轉(zhuǎn)換

    • 7.jQuery 基本AJAX方法

    • 8.底層$.ajax使用

  • 05XML

    • 1.XML用途

    • 2.XML文檔結(jié)構(gòu)

    • 3.XML基本語(yǔ)法

    • 4.DOM&SAX解析體系

    • 5.DOM4j節(jié)點(diǎn)查詢

    • 6.DOM4j文檔操作

    • 7.xPath語(yǔ)法

    • 8.xPath快速查詢

  • 06bootstrap

    • 1.bootstrap快速使用

    • 2.柵格系統(tǒng)

    • 3.表單、表格、按鈕、圖片

    • 4.下拉菜單

    • 5.按鈕組使用

    • 6.導(dǎo)航條

    • 7.分頁(yè)、進(jìn)度條

  • 07Web服務(wù)器基礎(chǔ)

    • 1.HTTP協(xié)議

    • 2.HttpWatch

    • 3.Tomcat服務(wù)器搭建

    • 4.Tomcat目錄結(jié)構(gòu)解析

    • 5.Tomcat端口配置

    • 6.Tomcat啟動(dòng)&停止

    • 7.Tomcat&Eclipse整合

    • 8.Eclipse配置優(yōu)化

  • 08Servlet

    • 1.Servlet體系

    • 2.Servlet生命周期

    • 3.ServletConfig&ServletContext

    • 4.請(qǐng)求&響應(yīng)

    • 5.重定向&轉(zhuǎn)發(fā)

    • 6.中文亂碼解決方案

    • 7.項(xiàng)目路徑問(wèn)題

  • 09JSP

    • 1.JSP語(yǔ)法

    • 2.JSP原理

    • 3.JSP腳本片段&表達(dá)式

    • 4.JSP聲明&指令

    • 5.JSP九大隱含對(duì)象

    • 6.域?qū)ο笫褂?/span>

  • 10JSTL

    • 1.JSTL簡(jiǎn)介

    • 2.JSTL-核心標(biāo)簽庫(kù)

    • 3.JSTL-函數(shù)標(biāo)簽庫(kù)

    • 4.JSTL-fmt標(biāo)簽庫(kù)

    • 5.自定義標(biāo)簽庫(kù)使用

    • 6.自定義標(biāo)簽庫(kù)原理

  • 11EL

    • 1.EL表達(dá)式簡(jiǎn)介

    • 2.EL使用

    • 3.EL取值原理

    • 4.EL的11大隱含對(duì)象

    • 5.EL2.2與3.0規(guī)范

    • 6.EL邏輯運(yùn)算

    • 7.函數(shù)庫(kù)深入

  • 12Cookie&Session

    • 1.Cookie機(jī)制

    • 2.Cookie創(chuàng)建&使用

    • 3.Session原理

    • 4.Session失效

    • 5.Url重寫

    • 6.Session活化&鈍化

    • 7.Token令牌應(yīng)用

  • 13Filter&Listener

    • 1.Filter原理

    • 2.Filter聲明周期

    • 3.Filter鏈

    • 4.Filter登錄驗(yàn)證

    • 5.Filter事務(wù)控制

    • 6.Listener原理

    • 7.八大監(jiān)聽器使用

    • 8.Listener監(jiān)聽在線用戶

  • 14國(guó)際化

    • 1.國(guó)際化原理

    • 2.ResourceBundle&Locale

    • 3.國(guó)際化資源文件

    • 4.日期/數(shù)字/貨幣國(guó)際化

    • 5.頁(yè)面動(dòng)態(tài)中英文切換

    • 6.頁(yè)面點(diǎn)擊鏈接中英文切換

    • 7.fmt標(biāo)簽庫(kù)的使用

  • 15文件上傳

    • 1.文件上傳原理

    • 2.commons-io&commons-fileupload

    • 3.文件上傳參數(shù)控制

    • 4.文件上傳路徑瀏覽器兼容性解決

    • 5.文件**原理

    • 6.文件**響應(yīng)頭

    • 7.文件**中文亂碼&瀏覽器兼容性

創(chuàng)建者模式之-單例模式


>

應(yīng)用場(chǎng)景

由于單例模式只生成一個(gè)實(shí)例, 減少了系統(tǒng)性能開銷(如: 當(dāng)一個(gè)對(duì)象的產(chǎn)生需要比較多的資源時(shí), 如讀取配置, 產(chǎn)生其他依賴對(duì)象, 則可以**在應(yīng)用啟動(dòng)時(shí)直接產(chǎn)生一個(gè)單例對(duì)象, 然后永久駐留內(nèi)存的方式來(lái)解決)

Windows中的任務(wù)管理器; 文件系統(tǒng), 一個(gè)操作系統(tǒng)只能有一個(gè)文件系統(tǒng); 數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)與實(shí)現(xiàn); SPRing中, 一個(gè)Component就只有一個(gè)實(shí)例java-Web中, 一個(gè)Servlet類只有一個(gè)實(shí)例;

實(shí)現(xiàn)要點(diǎn)

聲明為private來(lái)隱藏構(gòu)造器 private static Singleton實(shí)例 聲明為public來(lái)暴露實(shí)例獲取方法

單例模式主要追求三個(gè)方面性能

線程安全 調(diào)用效率高 延遲加載

實(shí)現(xiàn)方式

主要有五種實(shí)現(xiàn)方式,懶漢式(延遲加載,使用時(shí)初始化),餓漢式(JVM加載資源時(shí)初始化),雙重檢查,靜態(tài)內(nèi)部類,枚舉。

懶漢式,線程不安全的實(shí)現(xiàn)

由于沒(méi)有同步,多個(gè)線程可能同時(shí)檢測(cè)到實(shí)例沒(méi)有初始化而分別初始化,從而破壞單例約束。

缺點(diǎn):線程不安全,產(chǎn)生多個(gè)實(shí)例

public class Singleton { private static Singleton instance; private Singleton() { }; public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 懶漢式,線程安全但效率低下的實(shí)現(xiàn) 優(yōu)點(diǎn):線程安全,延遲加載 缺點(diǎn):低效, public class Singleton { private static Singleton instance; private Singleton() { }; public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }

由于對(duì)象只需要在初次初始化時(shí)需要同步,多數(shù)情況下不需要互斥的獲得對(duì)象,加鎖會(huì)造成巨大無(wú)意義的資源消耗

雙重檢查 優(yōu)點(diǎn):線程安全,延遲加載,高效;

這種方法對(duì)比于上面的方法確保了只有在初始化的時(shí)候需要同步,當(dāng)初始化完成后,再次調(diào)用getInstance不會(huì)再進(jìn)入synchronized塊。

public class Singleton { private static volatile Singleton instance; private Singleton() { }; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }

說(shuō)明: 內(nèi)部檢查是必要的

由于在同步塊外的if語(yǔ)句中可能有多個(gè)線程同時(shí)檢測(cè)到instance為null同時(shí)進(jìn)入同步塊區(qū)外部(synchronized (Singleton.class)之外),所以在進(jìn)入同步塊后還需要再判斷是否為null,避免后續(xù)獲得鎖的線程再次對(duì)instance進(jìn)行初始化。

instance聲明為volatile類型是必要的。指示JVM不用優(yōu)化。

指令重排

由于初始化操作 instance=new Singleton()是非原子操作的,主要包含三個(gè)過(guò)程

1、給instance分配內(nèi)存 2、調(diào)用構(gòu)造函數(shù)初始化instance 3、將instance指向分配的空間(instance指向分配空間后,instance就不為空了)

雖然synchronized塊保證了只有一個(gè)線程進(jìn)入同步塊,但是在同步塊內(nèi)部JVM出于優(yōu)化需要可能進(jìn)行指令重排,例如(1->3->2),instance還沒(méi)有初始化之前其他線程就會(huì)在外部檢查到instance不為null,而返回還沒(méi)有初始化的instance,從而造成邏輯錯(cuò)誤。

volatile保證變量的可見性

volatile類型變量可以保證寫入對(duì)于讀取的可見性,JVM不會(huì)將volatile變量上的操作與其他內(nèi)存操作一起重新排序,volatile變量不會(huì)被緩存在寄存器,因此保證了檢測(cè)instance狀態(tài)時(shí)總是檢測(cè)到instance的**新狀態(tài)。

注意:volatile并不保證操作的原子性,例如即使count聲明為volatile類型,count 操作被分解為讀取->寫入兩個(gè)操作,雖然讀取到的是count的**新值,但并不能保證讀取與寫入之間不會(huì)有其他線程再次寫入,從而造成邏輯錯(cuò)誤

餓漢式 優(yōu)點(diǎn):線程安全 缺點(diǎn):沒(méi)有延遲加載 這種方式基于單ClassLoder機(jī)制,instance在類加載時(shí)進(jìn)行初始化,避免了同步問(wèn)題。餓漢式的優(yōu)勢(shì)在于實(shí)現(xiàn)簡(jiǎn)單,劣勢(shì)在于不是延遲加載模式(lazy initialization)

在需要實(shí)例之前就完成了初始化,在單例較多的情況下,會(huì)造成內(nèi)存占用,加載速度慢問(wèn)題 由于在調(diào)用getInstance()之前就完成了初始化,如果需要給getInstance()函數(shù)傳入?yún)?shù),將會(huì)無(wú)法實(shí)現(xiàn)

public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() { }; public static Singleton getInstance() { return instance; } }

私有靜態(tài)內(nèi)部類 優(yōu)點(diǎn):延遲加載,線程安全

由于私有內(nèi)部類不會(huì)在類的外部被使用,所以只有在調(diào)用getInstance()方法時(shí)才會(huì)被加載。同時(shí)依賴JVM的ClassLoader類加載機(jī)制保證了不會(huì)出現(xiàn)同步問(wèn)題。 私有靜態(tài)內(nèi)部類保證了外部訪問(wèn)不到,內(nèi)部類的靜態(tài)屬性,保證了當(dāng)多線程調(diào)用getInstance時(shí)候,jvm加載Holder字節(jié)碼文件時(shí)候?qū)o態(tài)成員變量初始化保證線程安全。加載成功后instance實(shí)例已經(jīng)創(chuàng)建,已經(jīng)不存在線程安全的問(wèn)題,同時(shí)保證了延遲加載(只要不調(diào)用getInstance方法就不會(huì)實(shí)例化Holder 類)。

public class Singleton { private Singleton() { }; public static Singleton getInstance() { return Holder.instance; } private static class Holder{ private static Singleton instance = new Singleton(); } }

枚舉方法

參見枚舉類解析

線程安全

由于枚舉類的會(huì)在編譯期編譯為繼承自java.lang.Enum的類,其構(gòu)造函數(shù)為私有,不能再創(chuàng)建枚舉對(duì)象,枚舉對(duì)象的聲明和初始化都是在static塊中,所以由JVM的ClassLoader機(jī)制保證了線程的安全性。但是不能實(shí)現(xiàn)延遲加載

序列化

由于枚舉類型采用了特殊的序列化方法,從而保證了在一個(gè)JVM中只能有一個(gè)實(shí)例。

枚舉類的實(shí)例都是static的,且存在于一個(gè)數(shù)組中,可以用values()方法獲取該數(shù)組 在序列化時(shí),只輸出代表枚舉類型的名字屬性 name 反序列化時(shí),根據(jù)名字在靜態(tài)的數(shù)組中查找對(duì)應(yīng)的枚舉對(duì)象,由于沒(méi)有創(chuàng)建新的對(duì)象,因而保證了一個(gè)JVM中只有一個(gè)對(duì)象

public enum Singleton { INSTANCE; public String error(){ return "error"; } }

單例模式的破壞與防御

反射

對(duì)于枚舉類,該破解方法不適用。

import java.lang.reflect.Constructor; public class TestCase { public void testBreak() throws Exception { Class<Singleton> clazz = (Class<Singleton>) Class.forName("Singleton"); Constructor<Singleton> constructor = clazz.getDeclaredConstructor(); constructor.setaccessible(true); Singleton instance1 = constructor.newInstance(); Singleton instance2 = constructor.newInstance(); System.out.println("singleton? " (instance1 == instance2)); } public static void main(String[] args) throws Exception{ new TestCase().testBreak(); } }

序列化

對(duì)于枚舉類,該破解方法不適用。

該測(cè)試首先需要聲明Singleton為實(shí)現(xiàn)了可序列化接口

public class Singleton implements Serializable public class TestCase { private static final String SYSTEM_FILE = "save.txt"; public void testBreak() throws Exception { Singleton instance1 = Singleton.getInstance(); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SYSTEM_FILE)); oos.writeObject(instance1); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SYSTEM_FILE)); Singleton instance2 = (Singleton) ois.readObject(); System.out.println("singleton? " (instance1 == instance2)); } public static void main(String[] args) throws Exception{ new TestCase().testBreak(); } }

ClassLoader

JVM中存在兩種ClassLoader,啟動(dòng)內(nèi)裝載器(bootstrap)和用戶自定義裝載器(user-defined class loader),在一個(gè)JVM中可能存在多個(gè)ClassLoader,每個(gè)ClassLoader擁有自己的NameSpace。一個(gè)ClassLoader只能擁有一個(gè)class對(duì)象類型的實(shí)例,但是不同的ClassLoader可能擁有相同的class對(duì)象實(shí)例,這時(shí)可能產(chǎn)生致命的問(wèn)題。

防御

對(duì)于序列化與反序列化,我們需要添加一個(gè)自定義的反序列化方法,使其不再創(chuàng)建對(duì)象而是直接返回已有實(shí)例,就可以保證單例模式。

我們?cè)俅斡孟旅娴念愡M(jìn)行測(cè)試,就發(fā)現(xiàn)結(jié)果為true。

public final class Singleton { private Singleton() { } private static final Singleton INSTANCE = new Singleton(); public static Singleton getInstance() { return INSTANCE; } private Object readResolve() throws ObjectStreamException { // instead of the object we re on, // return the class variable INSTANCE return INSTANCE; } public class TestCase { private static final String SYSTEM_FILE = "save.txt"; public void testBreak() throws Exception { Singleton instance1 = Singleton.getInstance(); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SYSTEM_FILE)); oos.writeObject(instance1); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SYSTEM_FILE)); Singleton instance2 = (Singleton) ois.readObject(); System.out.println("singleton? " (instance1 == instance2)); } public static void main(String[] args) throws Exception { new TestCase().testBreak(); } } }

單例模式性能總結(jié)

方式 優(yōu)點(diǎn) 缺點(diǎn)
餓漢式 線程安全, 調(diào)用效率高 不能延遲加載
懶漢式 線程安全, 可以延遲加載 調(diào)用效率不高
雙重檢測(cè)鎖式 線程安全, 調(diào)用效率高, 可以延遲加載 -
靜態(tài)內(nèi)部類式 線程安全, 調(diào)用效率高, 可以延遲加載 -
枚舉單例 線程安全, 調(diào)用效率高 不能延遲加載

單例性能測(cè)試

測(cè)試結(jié)果:

HungerSingleton 共耗時(shí): 30 毫秒 LazySingleton 共耗時(shí): 48 毫秒 DoubleCheckSingleton 共耗時(shí): 25 毫秒 StaticInnerSingleton 共耗時(shí): 16 毫秒 EnumSingleton 共耗時(shí): 6 毫秒

在不考慮延遲加載的情況下,枚舉類型獲得了**好的效率,懶漢模式由于每次方法都需要獲取鎖,所以效率**低,靜態(tài)內(nèi)部類與雙重檢查的效果類似。考慮到枚舉可以 有效的避免序列化與反射,所以枚舉是較好實(shí)現(xiàn)單例模式的方法。

public class TestCase { private static final String SYSTEM_FILE = "save.txt"; private static final int THREAD_COUNT = 10; private static final int CIRCLE_COUNT = 100000; public void testSingletonPerformance() throws IOException, InterruptedException { final CountDownLatch latch = new CountDownLatch(THREAD_COUNT); FileWriter writer = new FileWriter(new File(SYSTEM_FILE), true); long start = System.currentTimeMillis(); for (int i = 0; i < THREAD_COUNT; i) { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < CIRCLE_COUNT; i) { Object instance = Singleton.getInstance(); } latch.countDown(); } }).start(); } latch.await(); long end = System.currentTimeMillis(); writer.append("Singleton 共耗時(shí): " (end - start) " 毫秒\n"); writer.close(); } public static void main(String[] args) throws Exception{ new TestCase().testSingletonPerformance(); } }

補(bǔ)充知識(shí)

類加載機(jī)制

static關(guān)鍵字的作用是把類的成員變成類相關(guān),而不是實(shí)例相關(guān),static塊會(huì)在類首次被用到的時(shí)候進(jìn)行加載,不是對(duì)象創(chuàng)建時(shí),所以static塊具有線程安全性

普通初始化塊

當(dāng)Java創(chuàng)建一個(gè)對(duì)象時(shí), 系統(tǒng)先為對(duì)象的所有實(shí)例變量分配內(nèi)存(前提是該類已經(jīng)被加載過(guò)了), 然后開始對(duì)這些實(shí)例變量進(jìn)行初始化, 順序是: 先執(zhí)行初始化塊或聲明實(shí)例變量時(shí)指定的初始值(這兩處執(zhí)行的順序與他們?cè)谠创a中排列順序相同), 再執(zhí)行構(gòu)造器里指定的初始值.

靜態(tài)初始化塊

又名類初始化塊(普通初始化塊負(fù)責(zé)對(duì)象初始化, 類初始化塊負(fù)責(zé)對(duì)類進(jìn)行初始化). 靜態(tài)初始化塊是類相關(guān)的, 系統(tǒng)將在類初始化階段靜態(tài)初始化, 而不是在創(chuàng)建對(duì)象時(shí)才執(zhí)行. 因此靜態(tài)初始化塊總是先于普通初始化塊執(zhí)行.

執(zhí)行順序

系統(tǒng)在類初始化以及對(duì)象初始化時(shí), 不僅會(huì)執(zhí)行本類的初始化塊[static/non-static], 而且還會(huì)一直上溯到j(luò)ava.lang.Object類, 先執(zhí)行Object類中的初始化塊[static/non-static], 然后執(zhí)行其父類的, **后是自己.

頂層類(初始化塊, 構(gòu)造器) -> … -> 父類(初始化塊, 構(gòu)造器) -> 本類(初始化塊, 構(gòu)造器)

小結(jié)

static{} 靜態(tài)初始化塊會(huì)在類加載過(guò)程中執(zhí)行;

{} 則只是在對(duì)象初始化過(guò)程中執(zhí)行, 但先于構(gòu)造器;

內(nèi)部類

內(nèi)部類訪問(wèn)權(quán)限

Java 外部類只有兩種訪問(wèn)權(quán)限:public/default, 而內(nèi)部類則有四種訪問(wèn)權(quán)限:private/default/protected/public. 而且內(nèi)部類還可以使用static修飾;內(nèi)部類可以擁有private訪問(wèn)權(quán)限、protected訪問(wèn)權(quán)限、public訪問(wèn)權(quán)限及包訪問(wèn)權(quán)限。如果成員內(nèi)部類Inner用private修飾,則只能在外部類的內(nèi)部訪問(wèn),如果用public修飾,則任何地方都能訪問(wèn);如果用protected修飾,則只能在同一個(gè)包下或者繼承外部類的情況下訪問(wèn);如果是默認(rèn)訪問(wèn)權(quán)限,則只能在同一個(gè)包下訪問(wèn)。這一點(diǎn)和外部類有一點(diǎn)不一樣,外部類只能被public和包訪問(wèn)兩種權(quán)限修飾。成員內(nèi)部類可以看做是外部類的一個(gè)成員,所以可以像類的成員一樣擁有多種權(quán)限修飾。 內(nèi)部類分為成員內(nèi)部類與局部?jī)?nèi)部類, 相對(duì)來(lái)說(shuō)成員內(nèi)部類用途更廣泛, 局部?jī)?nèi)部類用的較少(匿名內(nèi)部類除外), 成員內(nèi)部類又分為靜態(tài)(static)內(nèi)部類與非靜態(tài)內(nèi)部類, 這兩種成員內(nèi)部類同樣要遵守static與非static的約束(如static內(nèi)部類不能訪問(wèn)外部類的非靜態(tài)成員等) 非靜態(tài)內(nèi)部類

非靜態(tài)內(nèi)部類在外部類內(nèi)使用時(shí), 與平時(shí)使用的普通類沒(méi)有太大區(qū)別; Java不允許在非static內(nèi)部類中定義static成員,除非是static final的常量類型 如果外部類成員變量, 內(nèi)部類成員變量與內(nèi)部類中的方法里面的局部變量有重名, 則可**this, 外部類名.this加以區(qū)分. 非靜態(tài)內(nèi)部類的成員可以訪問(wèn)外部類的private成員, 但反之不成立, 內(nèi)部類的成員不被外部類所感知. 如果外部類需要訪問(wèn)內(nèi)部類中的private成員, 必須顯示創(chuàng)建內(nèi)部類實(shí)例, 而且內(nèi)部類的private權(quán)限對(duì)外部類也是不起作用的: 靜態(tài)內(nèi)部類

使用static修飾內(nèi)部類, 則該內(nèi)部類隸屬于該外部類本身, 而不屬于外部類的某個(gè)對(duì)象. 由于static的作用, 靜態(tài)內(nèi)部類不能訪問(wèn)外部類的實(shí)例成員, 而反之不然; 匿名內(nèi)部類

如果(方法)局部變量需要被匿名內(nèi)部類訪問(wèn), 那么該局部變量需要使用final修飾.

枚舉

枚舉類繼承了java.lang.Enum, 而不是Object, 因此枚舉不能顯示繼承其他類; 其中Enum實(shí)現(xiàn)了Serializable和Comparable接口(implements Comparable, Serializable); 非抽象的枚舉類默認(rèn)使用final修飾,因此枚舉類不能派生子類; 枚舉類的所有實(shí)例必須在枚舉類的**行顯示列出(枚舉類不能**new來(lái)創(chuàng)建對(duì)象); 并且這些實(shí)例默認(rèn)/且只能是public static final的; 枚舉類的構(gòu)造器默認(rèn)/且只能是private; 枚舉類通常應(yīng)該設(shè)計(jì)成不可變類, 因此建議成員變量都用private final修飾; 枚舉類不能使用abstract關(guān)鍵字將枚舉類聲明成抽象類(因?yàn)槊杜e類不允許有子類), 但如果枚舉類里面有抽象方法, 或者枚舉類實(shí)現(xiàn)了某個(gè)接口, 則定義每個(gè)枚舉值時(shí)必須為抽象方法提供實(shí)現(xiàn),

$(function () { $( pre.prettyprint code ).each(function () { var lines = $(this).text().split( \n ).length; var $numbering = $( ).addClass( pre-numbering ).hide(); $(this).addClass( has-numbering ).parent().append($numbering); for (i = 1; i <= lines; i ) { $numbering.append($( ).text(i)); }; $numbering.fadeIn(1700); }); });


相關(guān)推薦:


蘇州JAVA培訓(xùn)   蘇州JAVA培訓(xùn)班   蘇州JAVA培訓(xùn)機(jī)構(gòu)

體驗(yàn)課預(yù)約試聽

倒計(jì)時(shí)

12:00:00

課程熱線:

13013833891
在線咨詢

客服在線時(shí)間:早上9點(diǎn)~下午6點(diǎn),其他時(shí)間請(qǐng)?jiān)诰€預(yù)約報(bào)名或留言,謝謝!

蘇州web前端

免費(fèi)體驗(yàn)課開班倒計(jì)時(shí)

11: 41: 09

稍后會(huì)有專業(yè)老師給您回電,請(qǐng)保持電話暢通

咨詢電話:13013833891
推薦機(jī)構(gòu) 全國(guó)分站 更多課程

本周僅剩 個(gè)試聽名額

請(qǐng)鍵入信息,稍后系統(tǒng)將會(huì)把領(lǐng)獎(jiǎng)短信發(fā)至您的手機(jī)

申請(qǐng)?jiān)嚶犆~

QQ:1413838287
加盟合作:0755-83654572