第一篇:程序员转型指南 当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
@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
@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
...-(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平台的差不多,