久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

程序員轉型指南 當Java遇見了Objective-C

時間:2019-05-14 16:00:16下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《程序員轉型指南 當Java遇見了Objective-C》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《程序員轉型指南 當Java遇見了Objective-C》。

第一篇:程序員轉型指南 當Java遇見了Objective-C

程序員轉型指南 當Java遇見了Objective-C

作者:

【51CTO譯文】目前在移動開發領域最重要的兩個平臺分別為Android平臺和iOS,在兩個平臺開發應用分別要用Java和Objective-C語言。雖然Java和Objective-C就像是處在兩個不同的世界,但這兩種編程語言以及它們的平臺庫等等還是有許多相似的地方。本文為51CTO獨家譯文,講述了外國開發者Genadiy Shteyman從Java開發轉向Objective-C需要掌握技能。以下為全部譯文,(文章中的“我”指代“Genadiy Shteyman”):

最近一段時間,我從編寫企業Java應用轉向使用Objective-C。經過長時間的困擾之后,我發現兩者的相似之處很多,如果能夠早些讀到相關的文章,轉換工作會容易得多。

所以我寫下這篇文章,想要幫助Java程序員快速的掌握Objective-C開發的主要特點。我使用一個社交網絡應用作為例子,演示怎樣用這兩種語言建立開發環境。例子中會包括創建基本對象與比較兩種語言的MVC設計模式,還會演示兩種語言中數據的存儲和獲取。Objective-C開發:從哪里開始

開發iPhone應用,首先最好要使用Mac電腦。最新的Mac OS X 10.6版本通常包含了一份Xcode IDE,以及使用Objective-C的配套iPhone開發軟件工具套裝(圖表一)。

498)this.wid

th=498;“ height=289>

圖表一:Xcode IDE開發環境,項目視圖

2010年11月,蘋果發布了期待已久的iOS SDK 4.2,其中包含了豐富的框架和功能,用來搭建互動iPhone應用。Xcode還包含了一個仿真器,可以讓你在電腦中模擬程序運行在手機上的效果。Objective-C是iPhone應用的主要開發語言。對Java開發者來說,幸運的是Objective-C是完全面向對象的,使用和其他OO語言相同的理念——繼承、多態和封裝等等。定義一個類(Objective-C中稱為module或.m文件),首先要定義一個接口(一個header或.h文件),然后把它引入到類中。

我們來看這個社交網絡應用的例子,這個應用需要建立一個聯系冊,讓你和朋友們時常保持聯系。朋友的檔案存儲在FriendProfile對象中,包含四個字段:朋友的名字、城市、國家和電話號碼,如Listing One所示:

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.Listing One // FriendProfile.h

#import #import

@interface FriendProfile : NSObject { } @property(nonatomic, retain)NSString * name;@property(nonatomic, retain)NSString * country;@property(nonatomic, retain)NSString * city;@property(nonatomic, retain)NSString * phoneNbr;@end //FriendProfile.m

#import ”FriendProfile.h“

@implementation FriendProfile @synthesize name;@synthesize country;@synthesize city;@synthesize phoneNbr;@end 在這個例子中,接口FriendProfile:NSObject表示我們定義了一個叫做FriendProfile的接口,它從NSObject基類中繼承各種功能。NSObject是Objective-C的根類,大多數Objective-C中用到的類都會從中繼承,這和Java中的Object類相似。接下來,我們分配多個NSString類型變量(等同于Java中的String類型)用來存儲朋友的數據。然后是建立FriendProfile類,使用@synthesize關鍵字自動創建各種get和set方法。建立一個FriendProfile對象可以使用如下的語句:

1.FriendProfile * profile = [[FriendProfile alloc] init];這里的alloc和init就像Java里的new關鍵字,用來在內存中建立FriendProfile對象。接下來,就可以給對象的各種字段賦值了。

1.2.3.4.[profile setName:@”Albert“];[profile setCountry:@”USA“];[profile setCity:@”Houston“];[profile setPhoneNbr:@”123-456-789“];或者可以更簡單一點:

1.2.3.4.profile.name = @”Albert“;profile.country = @”USA“;profile.city = @”Houston;profile.phoneNbr = @“123-456-789”;想要充分了解Objective-C的語法和功能可以去蘋果的開發者站點,那里的語言參考編寫的非常好。Java的構造

在Java中,如果我們想寫一個FriendProfile類,所做的和Objective-C會非常相像,就像Listing Two所示:

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.Listing Two package com.vo;

public class FriendProfile { private String name;private String country;private String city;private String phoneNbr;

public String getName(){ return name;}

public void setName(String name){ this.name = name;}

public String getCountry(){ return country;}

public void setCountry(String country){ this.country = country;}

public String getCity(){ return city;}

public void setCity(String city){ this.city = city;32.33.34.35.36.37.38.39.40.41.}

public String getPhoneNbr(){ return phoneNbr;}

public void setPhoneNbr(String phoneNbr){ this.phoneNbr = phoneNbr;} } Listing Two中提供了相似的字段,但是那些get和set必須清楚的寫出來。現在我們看看怎樣在通訊錄里添加一個新朋友,參加Listing Three:

1.2.Listing Three public class FriendlyServletController extends HttpServlet { 3.4.private static final long serialVersionUID = 1L;5.6./**

7.* @see HttpServlet#doGet(HttpServletRequest request, 8.* HttpServletResponse response)9.*/

10.protected void doGet(HttpServletRequest request, 11.HttpServletResponse response)12.throws ServletException, IOException { 13.doPost(request, response);14.} 15.16./**

17.* @see HttpServlet#doPost(HttpServletRequest request, 18.* HttpServletResponse response)19.*/

20.protected void doPost(HttpServletRequest request, 21.HttpServletResponse response)22.throws ServletException, IOException { 23.response.setContentType(“text/html”);24.PrintWriter out = response.getWriter();25.26.final String action = 27.request.getParameter(“requestedAction”);28.29.if(action==null || action.trim().length()==0){ 30.out.println(“invalid action requested”);31.return;32.} 33.else

34.if(action.equalsIgnoreCase(“addToContacts”)){ 35.36.String name = request.getParameter(“name”);37.String country = request.getParameter(“country”);

38.String city = request.getParameter(“city”);39.String phoneNbr = request.getParameter(“phoneNbr”);40.//normally you have to validate browser-originated requests

41.boolean validParameters = 42.validateParameters(name, country, city, phoneNbr);43.if(validParameters==false){ 44.out.println(45.“please verify and submit correct information”);46.return;47.} 48.49.FriendProfile newProfile = new FriendProfile();50.newProfile.setName(name);51.newProfile.setCountry(country);52.newProfile.setCity(city);53.newProfile.setPhoneNbr(phoneNbr);54.55.ProfileManager.getInstance().addToContacts(newProfile);56.out.println(“Your friend is added to contacts”);

57.return;58.} 59.else{ 60.out.println(“invalid action requested”);61.return;62.} 63.} 64.} 在這個例子里,FriendlyServletController類從HTTPServlet中獲取行為,HTTPServlet是Java的客戶端組件類,負責處理瀏覽器的請求。當用戶登入網站并且決定添加一個朋友時,他會在HTML表單的字段中填入數據,表單提交時,Servlet收到并驗證請求的參數,并創建一個FriendProfile對象,在內存中存儲數據。而ProfileManager類會把你的FriendProfile對象存儲到數據庫中。Objective-C的MVC模式

在Java Web應用中常采用Model-View-Controller(MVC)設計模式,iPhone開發中也是如此。如果你在iOS Reference Library中查找UIViewController類的定義,你會發現這樣的話:“UIViewController類為iPhone應用提供最基本的視圖管理模型??你可以使用UIViewController實例來管理視圖結構。”UIViewController實際上是一個控制器組件,用來觸發業務邏輯,更新客戶端的視圖。

498)this.wid

th=498;“ height=128>

圖表2:Model-View-Controller(MVC)設計模式

如果你想在Xcode中創建一個UIViewController類型的對象,可以選擇通過XIB文件來創建。這種特殊的Xcode文件定義了圖形用戶界面或者說視圖,包含了各種不同的控件,比如按鈕、圖表和標簽等等。回到我們的例子中來,假設你已經在聯系列表中添加了幾個朋友,現在想按下某個朋友的鏈接來看查看他的詳細信息,這個功能可以通過定義控制器類來完成。代碼請見Listing Four:

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.Listing Four // FriendProfileViewController.h

#import

@class FriendProfile;@class DatabaseController;@class MFriendProfile;

// define our custom controller to inherit from // the UIViewController class

@interface FriendProfileViewController : UIViewController { FriendProfile * profile;MFriendProfile * mprofile;DatabaseController *dbController;16.} 17.@property(nonatomic, retain)IBOutlet UILabel *lname;18.@property(nonatomic, retain)IBOutlet UILabel *lcountry;19.@property(nonatomic, retain)IBOutlet UILabel *lcity;20.@property(nonatomic, retain)IBOutlet UILabel *lphoneNbr;21.22.-(IBAction)buttonPressed:(id)sender;23.@end 24.25.#import ”FriendProfileViewController.h“ 26.#import ”FriendProfile.h“

27.#import ”DatabaseController.h“ 28.#import ”MFriendProfile.h“

29.@implementation FriendProfileViewController 30....31.32.// Implement viewDidLoad to do additional setup after 33.// loading the view, typically from a nib.34.-(void)viewDidLoad { 35.[super viewDidLoad];36.37.//create sample profile

38.profile = [[FriendProfile alloc] init];39.profile.name = @”Albert“;40.profile.country = @”USA“;41.profile.city = @”Houston“;42.profile.phoneNbr = @”123-456-789“;43.44.//show profile on a screen 45.lname.text = profile.name;46.lcountry.text = profile.country;47.lcity.text = profile.city;48.lphoneNbr.text = profile.phoneNbr;49.50.} 51.52.//call the model to bring friend information from database 53.-(IBAction)buttonPressed:(id)sender{ 54.NSLog(@”fetching friend profile by name.“);55.// name is hardcoded for demo purposes.56.// Usually entered by user.57.mprofile =(MFriendProfile*)58.[dbController getFriendProfileObjectbyName:@”Albert“];59.60.61.62.63.64.lname.text = mprofile.name;lcountry.text = mprofile.country;lcity.text = mprofile.city;lphoneNbr.text = mprofile.phoneNbr;} 這段代碼中,我們創建了一個FriendProfileViewController實例,在我們定義的View Bundle中進行初始化,顯示出朋友的各種信息。

Alloc和initWithNibName都是控制器類創建實例時使用的方法,和Java的new關鍵字功能一樣。模型在裝載視圖時開始啟動。每個控制器都有一些從父類UIViewController繼承而來的生命周期方法。比如ViewdidLoad方法就是其中之一,它負責在視圖裝載之后的額外設置,從數據庫中取出信息,更新視圖。在最簡單的情況下,我們的視圖包含一系列標簽,或者是UILabel類型的對象,可以在應用運行時設置各種文本,用戶可以立即看見朋友信息被更新了。Java的MVC模式

下面來看看如何使用Java后臺在瀏覽器窗口中顯示出朋友的詳細信息。我們稍微修改一下FriendlyServletController即可,代碼請見Listing Five:

1.Listing Five 2.import java.io.IOException;3.import java.io.PrintWriter;4.5.import javax.servlet.ServletException;6.import javax.servlet.http.HttpServlet;7.import javax.servlet.http.HttpServletRequest;8.import javax.servlet.http.HttpServletResponse;9.10.import com.model.ProfileManager;11.import com.vo.FriendProfile;12.13./**

14.* Servlet implementation class FriendlyServletController 15.*/

16.public class FriendlyServletController extends HttpServlet { 17.18.private static final long serialVersionUID = 1L;19.20./**

21.* @see HttpServlet#doGet(HttpServletRequest request, 22.* HttpServletResponse response)23.*/

24.protected void doGet(HttpServletRequest request, 25.HttpServletResponse response)26.throws ServletException, IOException { 27.doPost(request, response);28.} 29.30./**

31.* @see HttpServlet#doPost(HttpServletRequest request, 32.* HttpServletResponse response)33.*/

34.protected void doPost(HttpServletRequest request, 35.HttpServletResponse response)36.throws ServletException, IOException { 37.response.setContentType(”text/html“);38.PrintWriter out = response.getWriter();39.40.final String action = request.getParameter(”requestedAction“);41.42.if(action==null || action.trim().length()==0){ 43.out.println(”invalid action requested“);44.return;45.} 46.else if(action.equalsIgnoreCase(”showFriendProfile“)){ 47.String name = request.getParameter(”name“);48.FriendProfile existProfile = new FriendProfile();49.existProfile.setName(name);50.existProfile = 51.ProfileManager.getInstance().lookupContact(existProfile);52.if(existProfile==null){ 53.out.println(”profile was not found“);54.}else{ 55.out.println(”here is your contact information:“ + 56.existProfile.getName()+ ” from “ + 57.existProfile.getCity()+ ” in “ + 58.existProfile.getCountry()+ ” at “ + 59.existProfile.getPhoneNbr());60.} 61.return;62.} 63.else if(action.equalsIgnoreCase(”addToContacts“)){ 64.String name = request.getParameter(”name“);65.String country = request.getParameter(”country“);66.String city = request.getParameter(”city“);67.String phoneNbr = request.getParameter(”phoneNbr“);68.69.//normally you have to validate browser-originated requests

70.boolean validParameters = 71.validateParameters(name, country, city, phoneNbr);

72.if(validParameters==false){ 73.out.println(”please verify and submit correct information“);74.return;75.} 76.77.FriendProfile newProfile = new FriendProfile();78.newProfile.setName(name);79.newProfile.setCountry(country);80.newProfile.setCity(city);81.newProfile.setPhoneNbr(phoneNbr);82.83.ProfileManager.getInstance().addToContacts(newProfile);84.out.println(”Your friend is added to contacts“);85.return;86.} 87.else{ 88.out.println(”invalid action requested“);89.return;90.} 91.} 92.93.//basic parameter validation routine

94.private boolean validateParameters(String name, String country, 95.String city, String phoneNbr){ 96./basic validation to check if all parameters are sent 97.if(name==null || name.trim().length()==0 || 98.country==null || country.trim().length()==0 || 99.city ==null || city.trim().length()==0 || 100.phoneNbr == null || phoneNbr.trim().length()==0){ 101.return false;102.} 103.return true;104.} 105.} 在這個例子中,FriendlyServletController接收表單產生的HTTP請求,我們特別編寫了一個事件叫做showFriendProfile。這里我們的模型是一個ProfileManager對象,負責通過朋友姓名在數據庫中查找記錄。然后查找到的數據庫記錄會以FriendProfile對象的形式返回到控制器,其中包含了各種詳細信息,組成視圖顯示在瀏覽器窗口中。Objective-C的數據庫訪問

較復雜的應用都會用到某類數據存儲方式,通常是一個數據庫。蘋果推薦開發者使用稱為Core Data的Cocoa API框架進行數據庫存取操作。Core Data框架能夠直接與SQLite數據庫相結合(我們例子中的數據庫運行在移動設備上)。Core Data隱藏了復雜的SQL操作,取而代之的是非常方便的NSManagedObject界面,你可以直接操作整個對象實例的各種字段,這些字段可以自動存入數據庫。Core Data框架的另一個方便之處是在數據庫中創建表(以及向表中添加關聯與限制),這些都可以在Core Data的用戶界面中完成。

498)this.wid

th=498;” height=328> 圖表3:Core Data stack結構

現在回到我們的社交網絡應用例子,看看怎么從數據庫中取出朋友的信息。我們使用SQLite 和Core Data API,但首先我們要稍微修改一下FriendProfile類,代碼請見Listing Six:

1.2.3.Listing Six //FriendProfile.h interface file// MFriendProfile.h #import 4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.#import

@interface MFriendProfile : NSManagedObject { } @property(nonatomic, retain)NSString * name;@property(nonatomic, retain)NSString * country;@property(nonatomic, retain)NSString * city;@property(nonatomic, retain)NSString * phoneNbr;

@end

// MFriendProfile.m #import “MFriendProfile.h”

@implementation MFriendProfile @dynamic name;@dynamic country;@dynamic city;@dynamic phoneNbr;

@end

這里的FriendProfile類與Listing One中的不同之處在于在這里我加入了Core Data框架的頭文件。而且在這里我們的類是從NSManagedObject中擴展出來,帶有了Core Data對象需要的全部基本行為。Core Data的NSManagedObject類中使用到的Accessor則在應用運行時動態創建。如果你想在FriendProfile類中聲明或使用屬性,但不想在編譯時出現缺少方法的警告,可以使用@dynamic指令,而不是@synthesize指令。

使用NSManagedObject API有些復雜,但你理解之后就會變得很好用。Listing Seven是一個示例方法,從數據庫的FRIENDPROFILE表中取得朋友的信息。表包含四列:NAME、COUNTRY、CITY和PHONENBR。

1.2.3.4.5.6.7.8.9.Listing Seven // DatabaseController.m #import “DatabaseController.h” #import #define kDatabaseName @“SocialNetworking.sqlite”

...-(NSManagedObject *)getFriendProfileObjectbyName:(NSString *)name { 10.11.managedObjectContext = [self managedObjectContext];12.13.//create sort descriptors to specify preferred sort order 14.NSSortDescriptor *sortDescriptor = 15.[[NSSortDescriptor alloc] initWithKey:@“name” ascending:YES];16.NSArray *sortDescriptors = 17.[[NSArray alloc] initWithObjects:sortDescriptor,nil];18.19.//specify where clause 20.NSPredicate *predicate = 21.[NSPredicate predicateWithFormat:@“name == %d”, name];22.23.//fetch our friendís profile from database table 24.NSEntityDescription *entity = 25.[NSEntityDescription entityForName:@“MFRIENDPROFILE”

26.inManagedObjectContext:managedObjectContext];27.28.NSFetchRequest *request = [[NSFetchRequest alloc] init];

29.[request setEntity:entity];30.31.// Set the predicate for the current view 32.if(predicate)33.{ 34.[request setPredicate:predicate];35.} 36.37.if(sortDescriptors)38.{ 39.[request setSortDescriptors:sortDescriptors];40.} 41.42.NSError *error = nil;43.NSMutableArray *results = [[managedObjectContext 44.executeFetchRequest:request error:&error] mutableCopy];45.46.if(error)47.{ 48.NSLog(@“error in getFriendProfileObjectbyName:%@”, 49.[error userInfo]);50.} 51.52.53.54.55.56.57.58.59.60.[sortDescriptor release];[sortDescriptors release];[predicate release];

if([results count] > 0){ return [results objectAtIndex:0];} return nil;} getFriendProfileObjectbyName方法把朋友的姓名作為一個參數接收過來。通過使用Core Data API,我們可以指定在哪一個表中進行查詢和排序,并且在后臺執行SQL語句。

1.SQL>select * from FriendProfile where name = “Albert”;Core Data API有許多種沒有封裝的“半成品”代碼,可以訪問NSManagedObjectContext、NSPersistentStoreCoordinator和NSManagedObjectModel對象。你可以復制這些代碼,只要你取得了FriendProfile對象,就能以下面的形式取得它的屬性:

1.2.3.4.NSString* name = FriendProfile.name;NSString* country = FriendProfile.country;NSString* city = FriendProfile.city;NSString* phoneNbr = FriendProfile.phoneNbr;總的來說,Core Data是一個非常有用的功能,可以讓你通過圖表來定義數據表和管理,可以動態生成相應的對象,而且無需使用復雜的SQL語句。但不好的方面是這里有大量的沒有經過封裝的代碼,這樣你在使用它們與測試時需要非常小心。Java:數據庫存取

Java有許多數據庫框架。在我看來,Hibernate是和Core Data API最相像的Java框架。Hibernate使用的是對象關系映射(Object-Relational Mapping,ORM)機制,這樣你可以通過簡單的在對象中設置字段并且直接映射成數據庫中的表來把對象數據放入關系型數據庫中。映射可以通過XML文件,也可以通過Java 5中的metadata annotation方法獲得。Listing Eight是使用XML進行映射的一個例子。Listing Eight

此例中,Listing Two中的FriendProfile對象被映射到數據庫中的一個同名表,這是一種傳統的數據映射做法。對象的四個字段被直接映射到表中的四列,通過映射,Hibernate可以使用SQL語句來完成各種操作。

另一個配置文件叫做hibernate.cfg.xml,包含了數據庫連接設置的詳細信息,包括數據庫URL、數據庫驅動以及用戶名和密碼等,代碼請見Listing Nine: 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.Listing Eight

Listing Nine中我們導入了所有需要的Hibernate庫,創建了一個Hibernate Session并且開始事務,接下來我們僅簡單使用了Session對象的get方法就輕松檢索到了FriendProfile對象,傳遞回所需要的對象類型并過濾出查詢的字段——朋友的姓名。結論

除去語法結構與運行平臺的不同,使用Objective-C進行iPhone開發與使用Java進行網絡應用開發在下面幾個方面是相同的: ◆兩種語言都是面向對象的

◆兩種語言使用同樣的設計模式,例如MVC ◆兩種語言使用相似的數據庫存儲技術,例如ORM 然而,對于Java開發者,使用Objective-C時在有些地方要格外小心:

◆創建對象:Java對象是在運行時通過new關鍵字創建的。因此Java程序員無需擔心內存分配問題。而在Objective-C中,一個對象可以由三個關鍵字創建,alloc、new或者copy,這三個關鍵字在創建對象時都會增加對象的持有計數(retain count),持有計數是Objective-C特有的內存管理方法,顯示有多少個指針指向對象,是否可以被內存管理器回收。

◆銷毀對象:由于強大的垃圾回收機制,Java的內存管理工作極度簡單。Java的引用對象都存儲在JVM的堆內存中,一旦不再被引用,就可以作為垃圾回收。Objective-C使用的是內存管理器,而不是垃圾回收器。如果你使用上面說的三種方法在內存中創建了一個對象,那么必須使用release方法來釋放對象。release方法會減少持有計數,當計數降到0時,被引用的對象會接受一個來自高級類的dealloc方法,釋放它占用的內存并重新分配。如果忘記了釋放內存或釋放失敗,那么會造成內存泄露和不可預見的錯誤。◆過多釋放和過早重新分配內存:由于垃圾回收機制,Java程序員可以完全不考慮這些問題。但Objective-C程序員需要小心,不能釋放出比分配的更多的內存。如果在已經重新分配的對象上過多釋放內存,就會造成應用的崩潰。

上面這些例子說明了Objective-C和Java在語法和語言元素上有很多相同之處。更重要的是,它們解決問題的思路和用到的組件也是非常相似的。如果你是Java程序員,相信你在看完這篇文章后,轉向Objective-C的道路會更加通順。

第二篇:JAVA面試寶典,java面試題,java面試指南,java面試必備試題,java程序員必備面試題

考官:java中的反射機制是什么,有什么作用啊?

要點:

JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的以及動態調用對象的方法的功能稱為java語言的反射機制。Java反射機制主要提供了以下功能:在運行時判定任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判定任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。

問題:Java為什么要引入異常處理機制

要點:

程序執行時經常會出現除零溢出、數組越界等運行錯誤,影響程序的正常執行。錯誤及異常是不可避免的,一個好的應用程序,在滿足用戶要求的各種功能的同時,還應具備能預見程序執行過程中可能產生的各種異常的能力,并能為異常情況給予恰當處理。在Java語言中,這種技術就是異常處理 Java語言通過面向對象的異常處理機制來解決運行期間的錯誤,可以預防錯誤的程序代碼或系統錯誤所造成的不可預期的結果發生。減少編程人員的工作,增加了程序的靈活性,增加程序的可讀性和健壯性.問題:什么是JAVA多線程機制

一.什么是多線程?

多線程是指同時存在幾個執行體,按照不同的執行線索共同工作的情況。

二.什么是程序,進程和線程?

程序是一段靜態的代碼,是應用軟件執行的藍本。

進程是程序的一次動態執行過程,它對應了從代碼加載,執行至執行完畢的一個完整的過程。這個過程也是進程本身從生產,發展至消亡的過程。

線程是比進程更小的執行單位。

區別:一個進程在其執行過程中,可以產生多個線程,形成多條執行線索,每條線索即每個線程也有其從生產,發展到消亡的過程。

三.線程的生命周期

線程的生命周期可分為四個階段,新建,運行,中斷和死亡。

新建:當一個Thread類或者其子類的對象被聲明并創建時,新生成的線程就處于新建裝他,有了相應的內存空間和其他資源。

運行:線程被創建之后,就有了運行的條件了,一旦輪到它來享用CPU資源時,便可以擺脫創建它的主進程開始了自己的生命周期。

中斷:一個正在執行的線程可能被認為的中斷,讓出CPU使用權,進入阻塞狀態。線程阻塞時,不能進入排隊隊列,只有當引起阻塞的原因被撤銷時,線程才可轉入就緒狀態,重新進入排隊隊列中,等待CPU資源,以便從中止處開始運行。

死亡:線程死亡有2種情況,一是正常運行,完成了它全部的工作。另一種是線程被提前強制終止。死亡狀態下的線程,釋放了被分配的內存。

四.線程的優先級

在java系統中,線程調度依據優先級基礎上的“先到先服務”原則。

Thread類的setPriority(int a)方法可設置線程的優先級,取值有Thread.MIN_PRIORITY,Thread.MAX_PRIORITY, Thread.NORM_PRIORITY三種,默認級別為Thread.NORM_PRIORITY.五.如何實現多線程

Java編程中實現多線程有兩種方式:一是繼承Thread類,用其子類創建線程,二是實現Runnable接口

六.線程同步

當兩個或者多個線程同時訪問一個變量,并且一個線程需要改變某個變量時,需要對修改數據的方法修飾為synchronized.當一個線程在使用同步方法時需要用到某個變量,而此變量又需要其他線程修改后才能符合本線程需要,此時用wait(),讓本線程等待。

其他線程如果在使用同步方法時不需要等待,那么當它使用完該方法后,用notifyAll()方法通知所有由于使用該同步方法而處于等待的線程結束等待,(notify()方法只能通知第一個處于等待的線程結束等待)

七.Interrupt()方法

一個線程在run方法執行完后便會自動消滅,如果想在run方法執完畢前就消滅線程,可以使用interrupt()方法,此時該線程會捕獲InterruptedException異常,在處理該異常的語句里告訴線程立刻結束run方法的執行。

問題:java多線程使用cup是什么機制

要點:java獲得cup使用權根據優先級,高優先的先執行,這個和操作系統是一樣的,但是優先級別的控制是通過虛擬機控制的,然后在執行的時候是通過操作系統時間片的機制,多線程java有自己的調度算法,虛擬機會自動調度執行的線程,而操作系統處理的是cpu的執行,其實兩者都有調度算法,xp的機制我想和

1、main方法是怎么寫的public static void main(String [] args){}

2、變量的命名規則是怎么樣的?

采用駝峰命名法,見名知意,以小寫字母開始。

常量命名:全部大寫。

方法命名: 小寫字母開始,駝峰命名。

類命名:首字母大寫。

3、if?else?和寫兩個if 有什么區別

if?else?只執行其中一條,寫兩個if,兩個都要執行

4、在JAVA中直接寫浮點常數,默認是什么類型?

默認是double類型

5、什么是標識符?它的命名規則是什么?

凡是可以命名的地方都叫標識符。

標識符有兩種:

1、系統標識符(關鍵字);

2、用戶標識符

以字母、數字、下劃線、$復活組成,不能以數字開頭

6、什么是變量?

變量是命了名的內存空間,并且空間的值是可以改變的。

7、JDK與JRE分別是什么?

JDK叫java開發工具集,包括編譯環境、運行環境、調試環境以及基礎類庫。

JRE叫java運行環境,包括虛擬機、核心類庫、以及健接文件。

8、try-catch-finally三個基本塊的作用?catch里的代碼是干什么的?

try塊表示此處代碼可能引發異常

catch塊捕獲try塊的異常

finally塊通常用于資源的回收,連接關閉,清理工作等

try-catch-finally不能單獨存在,try塊后必須跟catch或finally

catch或finally前必須跟try塊

9、繼承類和實現接口分別怎么做?

繼承用extends關鍵字繼承

定義接口用interface關鍵字

實現接口用implements10、如何去獲得字符串的長度?

調用String類的length()方法

11、Java的基本數據類型有哪些?

int 4字節 整型

byte 1字節 整型

char 2字節 整型

short 4字節 整型

long 8字節 整型

double 8字節 浮點

float 4字節 浮點

boolean 布爾

12、當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞

值傳遞,Java里沒有引用傳遞

13、列出至少5個最常見到的runtime exception并描述在什么情況下出現

IOException在未找到文件時會拋出

NullPointerExecption在對象引用指向空時會拋出

ArrayIndexOutOfBoundsExecption在數組下標越界時會拋出

NumberFormatException在字符串不能轉換成數字時會拋出

ArithmeticException在分母為零時會拋出

14、ArrayList和Vector的區別

vector是線程安全的,所以效率低,Arraylist是線程不安全的,但是效率高。

15、在IO中字節流和字符流的父類是什么?

字節流父類是InputStrean和OutputStream

字符流父類是Reader和Writer16、什么是包?定義包有什么好處?

文件夾。

好處:

1、可以有效的組織相關類;

2、可以做到信息的隱藏。

17、怎么樣知道磁盤一個目錄中有哪些文件?

1、File對象.list()方法;

2、File對象.listFile()方法。

18、如何獲得一定范圍的隨機整數?

x+Math.random()*y 其中x是位移數,確定最小范圍,y是放大系數,確定最大數。

(x-y)*Math.randon()+y19、如何獲得java當前的工作目錄

使用System.getProperty(“user.dir”)能夠獲得當前工作目錄的字符串地址。

20、怎么樣判斷一個異常類是checked異常還是unchecked異常?

判斷當前異常類,是否是RuntimeException的子類,如果是,則是運行期異常否則是編譯期異常。

21、log4j一共有幾個級別?分別是哪些?級別的高低有什么樣的區別.log4j有五個級別:

DEBUG:調試

INFO:信息

WARN:警告

ERROR:錯誤

FATAL:崩潰

21、靜態變量和成員變量應該怎么訪問?

靜態變量可以通過對象.和類名.的方式訪問

成員變量通過對象.的方式訪問

22、如何將一個字符串轉成一個基本數據類型

Int x = Integer.parselint(“32”);

Double d = Double.parseDouble(“4.5”);

23、如何讓JFrame的初始位置居中(在不同的分辨率中)

窗體對象.setLocationRelativeTo(null);

24、談談集合的作用

方便對數據進行 存儲,檢索,操作,傳輸。

25、類的修飾符能不能是private、static、protected?

內部類可以,因為內部類相當于外部類的屬性

26、Try塊中是否所有的語句都一定會執行,為什么?

不是,一但try中發生了異常,那么異常發生處下面的語句就不會執行,專區catch塊執行

27、什么時候用繼承,什么時候用接口?

當需要重用屬性和方法時使用繼承

當只需要重用方法時用接口

28、finally是不是什么時候都會執行?

是當虛擬機關閉,System.exit(0),finally內容不會執行;

29、什么是主線程?

當main()方法執行時會產生主線程,1最先開始 2最后結束

3產生其他子線程

4回收資源

30、進行IO流操作時,如果操作的文件不存在會發生什么情況?

讀取流在文件不存在時,會拋出文件未找到異常

寫入流在文件不存在時,會創建文件,但如果該文件所在目錄不存在,同時會拋出文件未找到異常

31、IO流操作的步驟是怎么樣的?

創建流 操作流 關閉流

32、finally的作用是什么?

無論是否有異常都會執行的代碼塊,一般用于資源回收,比如流動關閉、數據庫的關閉

34、當一個線程進入一個對象的一個同步方法后,能否進入其它非同步方法? 么?一般在什么時候使用? 可以,但不能進入其他同步方法。

33、try {}里有一個return語句,那么緊跟在這個try后的finally {}里的代碼會不會被執行,什么時候被執行?

Finally{}在程序開啟時只執行它本身里的代碼。

會執行,在方法返回前執行

35、如何啟動線程,它直接調用run()方法有什么區別?

啟動線程調用start方法,用start方法啟動線程后,是多個線程同時進行,使用run()是普通方法,是不會產生新的線程,是單線程。

36、數組有沒有length()這個方法? String有沒有length()這個方法?

數組有length屬性,String有length方法

37、GC是什么? 為什么要有GC?

GC叫做垃圾回收器,為了回收內存不再使用對象,釋放內存空間,避免內存溢出。

38、線程同步化會帶什么樣的結果?

1:可以使數據安全

2:效率會降低

39、什么是線程安全?

當兩個或兩個以上線程,訪問同一個資源時,為了保證數據的安全,只允許同一時間

只能有一個線程訪問該資源。

40、服務器類有一個while循環,能否直接while(true)?

可以,但這樣缺乏靈活性,沒有辦法控制循環結束,最好使用boolean變量來控制

循環的運行和結束。

41、java幫助文檔是如何生成的?

Javadoc.exe42、什么時候類名和文件名必須一致?

當類的定義為Public時,類名必須與文件名保存一致

43、如何將實現包裝類和基本數據類型轉化?

包裝轉基本1:包裝類對象.xxxvalue(值);2直接賦值

基本轉包裝1: Integer = new Integer(90);2直接賦值

44、類InputStream中方法read()的返回值是什么?讀出的是什么?

Read()返回的是int,讀取的數據

read(byte[])返回int 當前讀取的字節數

45、如果一個類實現一個接口,可不可以不實現接口里定義的所有方法?

可以,但這個類只能是抽象類

46、構造方法和方法有什么區別?構造方法能不能被重載,能不能被重寫?

構造方法和雷鳴相同,構造方法沒有返回類型,在對象創建時,被調用。

構造方法可以重載,不能重寫。

47、請列舉switch()括號中能接受的所有數據類型。

Char byte short int48、GUI的布局管理器常見的有哪幾種?

絕對布局

邊界布局管理器

卡片布局管理器

流布局管理器

網格布局管理器

49、斷言有什么作用?

斷言是一個布爾表達式,當表達式為真繼續執行,表達式為假,則拋出一個斷言錯誤,主要用于測試。

50、String和StringBuffer的區別?

String具有長度不可變的特性,當String做添加、刪除修改時,會產生一個新對象

StringBuffer是String類的一個改進版,是緩沖區的一個對象,當對該對象進行字符的添加、修改時,不會產生新對象。

51、接口里方法修符是什么?

Public abstract52、接口里可以定義變量嗎?

不行,就可中的變量修飾符是public static final 只能定義常量

53、說幾個String常用的方法

String.length()split()substring()equals()indexOf()lastundexOf()

54、在Dos界面下如何編譯并執行Java程序?

Javac 文件名

Java 類名

55、創建一個線程有幾種方法?

集成 thread 類

實現Runnable接口

56、項目開發的流程是怎么樣的?

市場調研,需求分析,概要設計,詳細設計,編碼,測試,維護。

57、java語言的特點是什么?

簡單,面向對象,分布式,健壯,可移植,解釋性,安全,多線程,垃圾回收

58、main方法中有個參數String[] args。這個參數的值是由誰傳遞給它的。執行java類時,由控制臺傳入

59、java中采用什么字符編碼集?char類型能不能放入一個中文字? Unicode 該字符集一個字符有2個字節。,char是兩個字節可以放一個中文,因為中文是兩個字節

60、byte的取值范圍

-128~+127(-2的7次方to2的7次方-1)

61、GET方式和POST方式提交時,流有什么不同?

GET和POST是HTTP協議請求服務器的兩種方式

GET方式頁面參數,是附加在URL后面。/login?userName=XXX

POST方式,頁面的參數是放在流最后的其他x86平臺的差不多,

下載程序員轉型指南 當Java遇見了Objective-Cword格式文檔
下載程序員轉型指南 當Java遇見了Objective-C.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    主站蜘蛛池模板: 无码不卡黑人与日本人| 五月婷之久久综合丝袜美腿| 久久久综合香蕉尹人综合网| 国产在线无遮挡免费观看| 精品福利一区二区三区免费视频| 国产女女做受ⅹxx高潮| 久久精品国产丝袜人妻| 人妻少妇一区二区三区| 鲁大师影院在线观看| 色噜噜久久综合伊人一本| 人妻性奴波多野结衣无码| 99999久久久久久亚洲| 夜夜躁狠狠躁日日躁202| 国产精品 无码专区| 午夜福利试看120秒体验区| 亚洲国产av玩弄放荡人妇| 无码中文字幕av免费放dvd| 国产97人人超碰cao蜜芽prom| 国产又色又爽又高潮免费视频麻豆| 久久www成人看片免费不卡| 影音先锋亚洲成aⅴ无码| 欧美黑人又粗又大又爽免费| av无码中文字幕不卡一区二区三区| 精品久久久中文字幕人妻| 中文字幕在线观看亚洲日韩| 国产后入清纯学生妹| 欧美巨大另类极品videosbest| 中文有码亚洲制服av片| 中文字幕高清免费日韩视频在线| 无码av岛国片在线播放| 亚洲综合欧美在线一区在线播放| 日韩精人妻无码一区二区三区| 97国产精华最好的产品| 无码熟熟妇丰满人妻porn| 久久精品熟女亚州av麻豆| 免费无码专区毛片高潮喷水| 不卡高清av手机在线观看| 国产精品香蕉在线观看网| 亚洲精品无码久久不卡| 国产寡妇树林野战在线播放| 日日碰狠狠丁香久燥|