⑴ 選java還是選c++呢
①如果你想成為計算機理論和實踐上都超強的程序員,就選C++.
②如果你只對計算機應用軟體開發感興趣,而對理論不是很感冒,就選Java.
③為什麼這么說呢?C++涉及到很多底層的東西,直接和內存想干,而且指針+元編程+模板+類+類型推導+多態+繼承+命令式+無限語法遞歸 需要較多的理論知識,以及從本質上認識到的數據結構基礎。而Java學習者可以不用懂太多,就能開發出同樣的東西,這樣雖然省事,但學到的東西就不夠多。
所以Java擅長的人轉C++經常不適應其綜合語法的細節,而C++擅長的人轉Java,只需要幾天。
⑵ RUBY元編程怎麼樣
在java的時代,因為不滿面向類/對象的復雜機制,自己借鑒研究了對象裝備模式,後來發現就是spring的原理。當時不知spring的情況下,還自己實現了利用運行時反射機制來動態的給對象設置空類,拼裝方法共享實例對象屬性,做出來雖然很欣慰,但是很難看,很慢,不可能到生產環境。 後來了解了js的函數原型prototype,可以動態的定義方法和傳遞閉包,簡直口水直流,直接轉成了web前台開發,只做ajax,直到ruby的出現。大概是06年,那時候資料賊少,全是日文,英文的都不多,學了皮毛就擱置了。 今年,因為自己回歸開發,想實現一些想法,嘗試了php之後,毅然決定打死不用php,與其深入研究php不如決心搞ruby,打眼一看,發現中文資料太多了,太幸福了,當看到這本元編程的時候,馬上想起java時候的辛酸啊。 Ruby讓人快樂,元編程更是快樂的魔法,創造出令人興奮激動的東西。 計算機不再是僕人,而是朋友,我能理解你,你也能理解我。 如果說寫java就像寫論文,那麼用js就像寫英文詩,而ruby像五言絕句。 所以不學元編程,不如用java
⑶ java1.6新特性
1.Desktop類和SystemTray類
前者可以用來打開系統默認瀏覽器瀏覽指定的URL,打開系統默認郵件客戶端給指定的郵箱發郵件,用默認應用程序打開或編輯文件(比如,用記事本打開以txt為後綴名的文件),
用系統默認的列印機列印文檔;後者可以用來在系統托盤區創建一個托盤程序。
2.使用JAXB2來實現對象與XML之間的映射
JAXB是Java Architecture for XML Binding的縮寫,可以將一個Java對象轉變成為XML格式,反之亦然。
我們把對象與關系資料庫之間的映射稱為ORM,其實也可以把對象與XML之間的映射稱為OXM(Object XML Mapping)。原來JAXB是Java EE的一部分,在JDK1.6中,
SUN將其放到了Java SE中,這也是SUN的一貫做法。JDK1.6中自帶的這個JAXB版本是2.0,比起1.0(JSR 31)來,JAXB2(JSR 222)用JDK5的新特性Annotation來標識要作綁定的類和屬性等,
這就極大簡化了開發的工作量。實際上,在Java EE 5.0中,EJB和Web Services也通過Annotation來簡化開發工作。另外,JAXB2在底層是用StAX(JSR 173)來處理XML文檔。
除了JAXB之外,我們還可以通過XMLBeans和Castor等來實現同樣的功能。
3..理解StAX
StAX(JSR 173)是JDK1.6.0中除了DOM和SAX之外的又一種處理XML文檔的API。
StAX 的來歷:在JAXP1.3(JSR 206)有兩種處理XML文檔的方法:DOM(Document Object Model)和SAX(Simple API for XML)。
由於JDK1.6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都會用到StAX所以Sun決定把StAX加入到JAXP家族當中來,
並將JAXP的版本升級到1.4(JAXP1.4是JAXP1.3的維護版本)。
JDK1.6裡面JAXP的版本就是1.4。StAX是The Streaming API for XML的縮寫,一種利用拉模式解析(pull-parsing)XML文檔的API.StAX通過提供一種基於事件迭代器(Iterator)的API讓程序員去控制xml文檔解析過程
,程序遍歷這個事件迭代器去處理每一個解析事件,解析事件可以看做是程序拉出來的,也就是程序促使解析器產生一個解析事件然後處理該事件,之後又促使解析器產生下一個解析事件,如此循環直到碰到文檔結束符;
SAX也是基於事件處理xml文檔,但卻是用推模式解析,解析器解析完整個xml文檔後,才產生解析事件,然後推給程序去處理這些事件;DOM採用的方式是將整個xml文檔映射到一顆內存樹, 這樣就可以很容易地得到父節點和子結點以及兄弟節點的數據,但如果文檔很大,將會嚴重影響性能。
4.使用Compiler API
現在我 們可以用JDK1.6 的Compiler API(JSR 199)去動態編譯Java源文件,Compiler API結合反射功能就可以實現動態的產生Java代碼並編譯執行這些代碼,有點動態語言的特徵。
這個特性對於某些需要用到動態編譯的應用程序相當有用,比如JSP Web Server,當我們手動修改JSP後,是不希望需要重啟Web Server才可以看到效果的,這時候我們就可以用Compiler API來實現動態編譯JSP文件,當然,現在的JSP Web Server也是支持JSP熱部署的,現在的JSP Web Server通過在運行期間通過Runtime.exec或ProcessBuilder來調用javac來編譯代碼,這 種方式需要我們產生另一個進程去做編譯工作,不夠優雅而且容易使代碼依賴與特定的操作系統;Compiler API通過一套易用的標準的API提供了更加豐富的方式去做動態編譯,而且是跨平 台的。
5.輕量級Http Server API
JDK1.6 提供了一個簡單的Http Server API,據此我們可以構建自己的嵌入式Http Server,它支持Http和Https協議,提供了HTTP1.1的部分實現,沒有被實現的那部分可以通過擴展已有的Http Server API來實現,程序員必須自己實現HttpHandler介面,HttpServer會調用HttpHandler實現類的回調方法來處理客戶端請求,在這里,我們把一個Http請求和它的響應稱為一個交換,包裝成HttpExchange類,HttpServer負責將HttpExchange傳給HttpHandler實現類的回調方法。
6.插入式註解處理API(Pluggable Annotation Processing API)
插入式註解處理API(JSR 269)提供一套標准API來處理Annotations(JSR 175)
實際上JSR 269不僅僅用來處理Annotation,我覺得更強大的功能是它建立了Java 語言本身的一個模型,它把method,package,constructor,type,variable, enum,annotation等Java語言元素映射為Types和Elements(兩者有什麼區別?),從而將Java語言的語義映射成為對象,我們可以在javax.lang.model包下面可以看到這些類。 所以我們可以利用JSR 269提供的API來構建一個功能豐富的元編程(metaprogramming)環境。JSR 269用Annotation Processor在編譯期間而不是運行期間處理Annotation,Annotation Processor相當於編譯器的一個插件,所以稱為插入式註解處理.如果Annotation Processor處理Annotation時(執行process方法)產生了新的Java代碼,編譯器會再調用一次Annotation Processor,如果第二次處理還有新代碼產生,就會接著調用Annotation Processor,直到沒有新代碼產生為止.每執行一次process()方法被稱為一個"round",這樣整個Annotation processing過程可以看作是一個round的序列。
JSR 269主要被設計成為針對Tools或者容器的API. 舉個例子,我們想建立一套基於Annotation的單元測試框架(如TestNG),在測試類裡面用Annotation來標識測試期間需要執行的測試方法
7.用Console開發控制台程序
JDK1.6中提供了java.io.Console 類專用來訪問基於字元的控制台設備。你的程序如果要與Windows下的cmd或者Linux下的Terminal交互,就可以用Console類代勞。但我們不總是能得到可用的Console,一個JVM是否有可用的Console依賴於底層平台和JVM如何被調用。如果JVM是在互動式命令行(比如Windows的cmd)中啟動的,並且輸入輸出沒有重定向到另外的地方,那麼就可以得到一個可用的Console實例。
8.對腳本語言的支持
如: ruby,groovy,javascript。
9..Common Annotations
Common annotations原本是Java EE 5.0(JSR 244)規范的一部分,現在SUN把它的一部分放到了Java SE 6.0中。
隨著Annotation元數據功能(JSR 175)加入到Java SE 5.0裡面,很多Java 技術(比如EJB,Web Services)都會用Annotation部分代替XML文件來配置運行參數(或者說是支持聲明式編程,如EJB的聲明式事務),如果這些技術為通用目的都單獨定義了自己的otations,顯然有點重復建設,所以,為其他相關的Java技術定義一套公共的Annotation是有價值的,可以避免重復建設的同時,也保證Java SE和Java EE 各種技術的一致性。
下面列舉出Common Annotations 1.0裡面的10個Annotations Common Annotations Annotation Retention Target Description Generated SourceANNOTATION_TYPE,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE 用於標注生成的源代碼Resource Runtime TYPE,METHOD,FIELD用於標注所依賴的資源,容器據此注入外部資源依賴,有基於欄位的注入和基於setter方法的注入兩種方式 Resources Runtime TYPE同時標注多個外部依賴,容器會把所有這些外部依賴注入PostConstructRuntime METHOD標注當容器注入所有依賴之後運行的方法,用來進行依賴注入後的初始化工作,只有一個方法可以標注為PostConstruct PreDestroy Runtime METHOD當對象實例將要被從容器當中刪掉之前,要執行的回調方法要標注為PreDestroy RunAs Runtime TYPE用於標注用什麼安全形色來執行被標注類的方法,這個安全形色必須和Container的Security角色一致的。RolesAllowed Runtime TYPE,METHOD用於標注允許執行被標注類或方法的安全形色,這個安全形色必須和Container的Security角色一致的 PermitAll Runtime TYPE,METHOD允許所有角色執行被標注的類或方法DenyAll Runtime TYPE,METHOD不允許任何角色執行被標注的類或方法,表明該類或方法不能在Java EE容器裡面運行DeclareRoles Runtime TYPE用來定義可以被應用程序檢驗的安全形色,通常用isUserInRole來檢驗安全形色.
⑷ 怎麼理解元編程
1.一種語言本來做不到的事情,通過你編程來修改它,使得它可以做到了,這就是元編程。
2.就是用代碼生成(操縱)代碼。
3.常見的開發語言均能做到元編程,Lisp這貨就不用多說了,C的Marco,C++的Template,Java的Annotation,C#的Attribute、Reflection、CodeDom和IL Emitter,各種腳本語言(如js、python)的eval,甚至連Unix/Linux的shell腳本也能。
4.元編程常見的應用場景很多,擴展(重構)語法、開發DSL、生成代碼、根據特定場景自動選擇代碼優化、解決一些正交的架構設計問題、AOP等等。
5.所以元編程存在的目的,就是多提供了一個抽象層次。
6.至於元編程有什麼優缺點,爭議還是比較大的。比如以重構語法的應用為例,很多元編程的反對者就認為這樣會導致代碼的可讀性、可維護性降低,分化社區,影響交流,因為每個開發人員都能搞一個自己的方言。
總的來說,元編程玩得轉的話會讓你日子好過一些,玩不轉會讓你日子不好過一些。
⑸ 編程軟體使用什麼寫出來的。 象Java VS 的這種編程軟體
c、c++
⑹ Java 8為什麼需要Lambda表達式
因為大家說需要,所以你可以認為這是普通人的需求。
搞毛線的函數式編程,還不如把元編程的api弄好點。
等你把Lambda表達式用起來就知道,先不說什麼別的,和原來的語法混在一起就是個四不像。連代碼都看的別扭還簡潔個毛線,簡潔最起碼是先讓閱讀簡潔,然後是書寫簡潔,最後才是解決問題簡潔。
個人觀點,不喜勿噴。還不如直接用groovy,要改語法就改的徹底點,這樣下去遲早會把 java語言 搞成個大雜燴,語法是一個語言最基本的東西了,好的語法應該是沒有什麼可以去掉了,而不是需要加什麼。
⑺ java程序員為什麼使用Groovy
正如Groovy對Java很多特性進行的包裝優化一樣,基於Groovy的HttpBuilder也包裹了HttpClient,使網路編程變得更加的方便易用,下面稍微來用一個例子看一下。
尋找各種依賴的jar包有時候會讓我們失去耐心,不過值得慶幸的是我們有Maven和Gradle這樣的工具,可以根據配置輕松的幫我們配置好我們需要的數據。下面我們來敘述一下整個過程。
1. 創建文件夾httpbuildertest
2. 創建gradle配置文件,build.gradle,內容如下:
apply plugin: "groovy"
apply plugin: "eclipse"
repositories {
mavenCentral()
}
dependencies {
compile "org.codehaus.groovy:http-builder:0.4.0"
compile "org.codehaus.groovy:groovy-all:2.3.3"
testCompile "org.spockframework:spock-core:0.7-groovy-2.0"
}
gradle我們將做另文介紹
3. 執行gralde eclipse(當然必須先安裝gradle),就可以生成eclipse所需要的.classpath和.project文件,這時候就可以使用eclipse導入功能來import->Existing Projects Into WorkSpace。
4. 創建我們的一個測試,試試看是不是可以使用httpbuilder了
import groovyx.net.http.HTTPBuilder
import spock.lang.Specification;
import static groovyx.net.http.Method.*
import static groovyx.net.http.ContentType.*
class HttpbuildLabSpec extends Specification{
HTTPBuilder http = new HTTPBuilder( 'http://m.weather.com.cn' )
public void testRequestWeather(){
when:
def info =""
http.request( GET, JSON ) {
url.path = '/data/101290401.html'
headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'
response.success = { resp, json ->
info = json.weatherinfo.city
}
response.failure = { resp -> println "Unexpected error: ${resp.statusLine.statusCode} : ${resp.statusLine.reasonPhrase}" }
}
then: "曲靖"==info
}
}
打完收工,通過這個小例子我們可以了解到這么一些內容:
(1)HTTPBuilder 是這個框架的核心類(要不然怎麼和框架一個名字),構建這個類的對象的時候,指定要請求的baseUrl。
(2)request方法可以指定請求的method和返回的數據格式,method對應的是GET/PUT/POST/DELETE/HEAD幾個常量,而數據格式目前有JSON/XML/HTML/BINARY/URLENC/ANY幾種。
(3)一個比較有意思的地方是,在http的request方法裡面,彷彿是無根之水一樣突然冒出來了幾個沒有聲明過的變數,看起來連編譯也不會通過的方法,那麼是如何能正常運作的呢?這個我們就要研究到Groovy的Closure(閉包)。Groovy的閉包里包含有一個delegate屬性,一般來說,這個delegate里保存的是閉包使用上下文的對象引用,比如a調用了一個閉包b,則b的delegate就是a的this對象。而在HTTPBuilder對象調用request方法的時候,它把傳入閉包的delegate改成了一個叫做SendDelegate的類對象(這是HTTPBuilder的內部類,他們都是用Java寫的,在新版的HttpBuilder里,已經改名為RequestConfigDelegate),這個類裡面,分別包含了一個叫做getHeaders()的方法,一個叫做getUrL()的方法,一個叫做getResponse()的方法。稍微思索一下我們就可以想到,Groovy里有這樣的特性,如果直接使用一個識別不出來的變數,Groovy會假設它是getter的一種簡寫形式,自動進行補全(當然這也是DSL的常用伎倆,把方法偽裝成短語),而getter並沒有參數,所以其括弧是可以簡寫的,實際上上面的代碼可以寫作getUrl().path = '/data/101290401.html',這樣就非常符合程序員的視覺體驗了。
(4)主要是為了喜歡追根問題的同學釋疑,實際上整個調用還是非常的簡單明快的,在request閉包里,我們通過response(記得嗎,實際上就是GetResponse()),獲得了一個Map結構,這個Map的內部結構實際上是Map<String,Closure>,對「success」和「failure」這兩個key我們分別設置了對應的閉包,這樣就完成了回調的設置,一旦方法成功或者失敗,就可以調用到對應的閉包。
(5)使用了JSON作為返回格式,閉包的第二個參數就是解析好的返回body,就是一個Json對象,是可以直接用點號來訪問的。當然最好不要在失敗的閉包里放這個參數,一般失敗的情況比較多,也許就是一個html返回,格式錯誤那麼測試也就無法按照預期進行了。
⑻ Spark 中用 Scala 和 java 開發有什麼區別
Scala相對於Java的優勢是巨大的。熟悉Scala之後再看Java代碼,有種讀匯編的感覺…… 如果僅僅是寫Spark應用,並非一定要學Scala,可以直接用Spark的Java API或Python API。但因為語言上的差異,用Java開發Spark應用要羅嗦許多。好在帶lambda的Java 8出來之後有所改善。 在Spark應用開發上,學Scala主要好處有二: 開發效率更高,代碼更精簡; 使用Spark過程中出現異常情況,在排查時如果對Spark源碼比較熟悉,可以事半功倍
⑼ Ruby和java
ruby on rails是殺手級應用,ruby的語法很迷人,對程序員很友好,另外對元編程支持的很好。java當然更好。不過說老實話,靠語言來就業不是正道,重要的是解決問題的能力。
⑽ 1.JAVA編寫程序,功能如下:
abstract class Shape{
public abstract double getPerimeter();
public abstract double getArea();
}
class Square extends Shape{
private double a;
public Square(double a){
this.a = a;
}
public double getPerimeter(){
return 4 * a;
}
public double getArea(){
return a * a;
}
}
class Circle extends Shape{
private static double pai = 3.14;
private double r;
public Circle(double r){
this.r = r;
}
public double getPerimeter(){
return pai * 2 * r;
}
public double getArea(){
return pai * r * r;
}
}
class Book{
private String name;
private int papers;
public Book(String name, int papers){
this.name = name;
if (papers < 50)
papers = 50;
this.papers = papers;
}
public void detail(){
System.out.println(name + " : " + papers);
}
}
class BookTest{
public static void test(){
Book b = new Book("ruby元編程",120);
b.detail();
}
}
public class Test{
public static void main(String[]args){
BookTest.test();
}
}
兩部分寫一塊了,自己分開,嘿嘿