精华内容
下载资源
问答
  • 继承多态。。

    2016-01-14 13:54:00
    一、封装 学习过Java中的同学可能都知道了,封装就是对中的一些字段,方法进行保护,...哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过修饰符来完成,这就是封装,下面来看一个例子吧: Car....

    一、封装

    学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java中有四种访问权限修饰符:public,default,protected,private,访问权限一次递减的,这样我们在定义类的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过修饰符来完成,这就是封装,下面来看一个例子吧:

    Car.h

     

    1. //  Car.h  
      //  05_ObjectDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      @interface Car : NSObject{  
          //这个属性就是对外进行保密的相当于private,所以我们需要在外部访问的话,必须定义get/set方法  
          //默认的是private的,但是我们可以使用@public设置为public属性的,那么在外部可以直接访问:person->capcity = 2.8;  
          //当然我们一般不这么使用,因为这会破坏封装性,这种用法相当于C中的结构体中权限  
          //一共四种:@public,@protected,@private,@package,这个和Java中是相同的  
      @public  
          float _capcity; //油量属性  
      }  
        
      - (void)run:(float)t;  
        
      @end  

       

    这里我们可以看到,OC中也是有四种访问权限修饰符:

     

    @public、@protected、@private、@package

    其中默认的修饰符是@private

    但是这里要注意的是:OC中的方法是没有修饰符的概念的,这个和Java有很大的区别,一般都是公开访问的,即public的,但是我们怎么做到让OC中的一个方法不能被外界访问呢?

    OC中是这么做的,如果想让一个方法不被外界访问的话,只需要在.m文件中实现这个方法,不要在头文件中进行定义,说白了就是:该方法有实现,没定义,这样外界在导入头文件的时候,是没有这个方法的,但是这个方法我们可以在自己的.m文件中进行使用。

    为什么要介绍这点知识呢?因为在后面我们会说到单利模式,到时候就会用到这个知识点了。

     

    二、继承

    继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。当然OC中的继承和Java中是一样的,没多大区别,这里在看一个例子吧:

    首先来看一下父类:Car

    Car.h

     

    1. //  
      //  Car.h  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      @interface Car : NSObject{  
          NSString *_brand;  
          NSString *_color;  
      }  
        
      - (void)setBrand:(NSString *)brand;  
      - (void)setColor:(NSString *)color;  
      - (void)brake;  
      - (void)quicken;  
        
      @end  

       

    在Car类中定义了两个属性,以及一些方法

     

    Car.m

     

    1. //  
      //  Car.m  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Car.h"  
        
      @implementation Car  
      - (void)setBrand:(NSString *)brand{  
          _brand = brand;  
      }  
      - (void)setColor:(NSString *)color{  
          _color = color;  
      }  
      - (void)brake{  
          NSLog(@"刹车");  
      }  
      - (void)quicken{  
          NSLog(@"加速");  
      }  
      @end  

       

      方法的实现

     

     

    在来看一下子类:

    Taxi.h

     

    1. //  
      //  Taxi.h  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Car.h"  
        
      @interface Taxi : Car{  
          NSString *_company;//所属公司  
      }  
        
      //打印发票  
      - (void)printTick;  
        
      @end  

       

    看到Taxi类继承了父类Car,这里需要导入父类的头文件,然后在Taxi类中多了一个属性和方法

     

    Taxi.m

     

    1. //  
      //  Taxi.m  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Taxi.h"  
        
      @implementation Taxi  
        
      - (void)printTick{  
          [super brake];  
          [self brake];  
          NSLog(@"%@出租车打印了发票,公司为:%@,颜色为:%@",_brand,_company,_color);  
      }  
        
      @end  

       

      对方法的实现,这里我们看到实现文件中是不需要导入父类Car的头文件的,因为可以认为,Taxi.h头文件中已经包含了Car的头文件了。而且,这里可以使用super关键字来调用父类的方法,同时这里我们也是可以用self关键字来调用,这里看到其实这两种方式调用的效果是一样的,当我们在子类重新实现brake方法的时候(Java中的重写概念),那么这时候super关键字调用的还是父类的方法,而self调用的就是重写之后的brake方法了。同样,我们也是可以使用父类中的属性。

     

     

    再看一下另外一个子类:

    Truck.h

     

    1. //  
      //  Truck.h  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Car.h"  
      //卡车类继承Car  
      @interface Truck : Car{  
          float _maxWeight;//最大载货量  
      }  
        
      //覆盖父类的方法brake  
      //优先调用子类的方法  
      - (void)brake;  
        
      - (void)unload;  
        
      @end  

       

      这里就自己定义了一个brake方法,这时候就会覆盖父类中的brake方法了。

     

    Truck.m

     

    1. //  
      //  Truck.m  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Truck.h"  
        
      @implementation Truck  
        
      - (void)brake{  
          [super brake];  
          NSLog(@"Truck类中的brake方法");  
      }  
        
      - (void)unload{  
          [super brake];//调用父类的方法  
          [self brake];//也是可以的  
          NSLog(@"%@的卡车卸货了,载货量:%.2f,汽车的颜色:%@",_brand,_maxWeight,_color);  
      }  
        
      @end  

       

    这里就可以看到,我们会在brake方法中调用一下父类的brake方法,然后在实现我们自己的逻辑代码。

     

     

    好了,继承就说这么多了,其实封装和继承两个特性没什么难度的,很容易理解的,下面在来看一下最后一个特性:多态

     

    三、多态

    多态对于面向对象思想来说,个人感觉是真的很重要,他对以后的编写代码的优雅方式也是起到很重要的作用,其实现在很多设计模式中大部分都是用到了多态的特性,Java中的多态特性用起来很是方便的,但是C++中就很难用了,其实多态说白了就是:定义类型和实际类型,一般是基于接口的形式实现的,不多说了,直接看例子吧:

    打印机的例子

    抽象的打印机类Printer

    Printer.h

     

    1. //  
      //  Printer.h  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      @interface Printer : NSObject  
        
      - (void) print;  
        
      @end  

       

    就是一个简单的方法print

     

    Printer.m

     

    1. //  
      //  Printer.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Printer.h"  
        
      @implementation Printer  
        
      - (void)print{  
          NSLog(@"打印机打印纸张");  
      }  
        
      @end  

       

    实现也是很简单的

     

     

    下面来看一下具体的子类

    ColorPrinter.h

     

    1. //  
      //  ColorPrinter.h  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Printer.h"  
        
      //修改父类的打印行为  
      @interface ColorPrinter : Printer  
      - (void)print;  
      @end  

       

     

     

    ColorPrinter.m

     

    1. //  
      //  ColorPrinter.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "ColorPrinter.h"  
        
      @implementation ColorPrinter  
        
      - (void)print{  
          NSLog(@"彩色打印机");  
      }  
        
      @end  

       

    在看一下另外一个子类

     

    BlackPrinter.h

     

    1. //  
      //  BlackPrinter.h  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Printer.h"  
        
      @interface BlackPrinter : Printer  
        
      - (void)print;  
        
      @end  

       


    BlackPrinter.m

     

     

    1. //  
      //  BlackPrinter.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "BlackPrinter.h"  
        
      @implementation BlackPrinter  
        
      - (void)print{  
          NSLog(@"黑白打印机");  
      }  
        
      @end  

       

     

     

    这里我们在定义一个Person类,用来操作具体的打印机

    Person.h

     

    1. //  
      //  Person.h  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      #import "ColorPrinter.h"  
      #import "BlackPrinter.h"  
        
      //扩展性不高,当我们需要添加一个新的打印机的时候还要定义对应的一个方法  
      //所以这时候就可以使用多态技术了  
        
      @interface Person : NSObject{  
          NSString *_name;  
      }  
        
      //- (void) printWithColor:(ColorPrinter *)colorPrint;  
        
      //- (void) printWithBlack:(BlackPrinter *)blackPrint;  
        
      - (void) doPrint:(Printer *)printer;  
        
      @end  

       

     

     

    Person.m

     

    1. //  
      //  Person.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Person.h"  
        
      @implementation Person  
        
      /* 
      - (void) printWithColor:(ColorPrinter *)colorPrint{ 
          [colorPrint print]; 
      } 
       
      - (void) printWithBlack:(BlackPrinter *)blackPrint{ 
          [blackPrint print]; 
      } 
       */  
        
      - (void) doPrint:(Printer *)printer{  
          [printer print];  
      }  
        
      @end  

       


    再来看一下测试代码:

     

    main.m

     

    1. //  
      //  main.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      #import "Person.h"  
      #import "BlackPrinter.h"  
      #import "ColorPrinter.h"  
        
      int main(int argc, const charchar * argv[]) {  
          @autoreleasepool {  
                
              Person *person =[[Person alloc] init];  
                
              ColorPrinter *colorPrint = [[ColorPrinter alloc] init];  
              BlackPrinter *blackPrint = [[BlackPrinter alloc] init];  
                
              //多态的定义  
              /* 
              Printer *p1 = [[ColorPrinter alloc] init]; 
              Printer *p2 = [[BlackPrinter alloc] init]; 
               
              [person doPrint:p1]; 
              [person doPrint:p2]; 
               */  
                
              //通过控制台输入的命令来控制使用哪个打印机  
              int cmd;  
              do{  
                  scanf("%d",&cmd);  
                  if(cmd == 1){  
                      [person doPrint:colorPrint];  
                  }else if(cmd == 2){  
                      [person doPrint:blackPrint];  
                  }  
              }while (1);  
                
          }  
          return 0;  
      }  

       

     

     

    下面就来详细讲解一下多态的好处

    上面的例子是一个彩色打印机和黑白打印机这两种打印机,然后Person类中有一个操作打印的方法,当然这个方法是需要打印机对象的,如果不用多态机制实现的话(Person.h中注释的代码部分),就是给两种打印机单独定义个操作的方法,然后在Person.m(代码中注释的部分)中用具体的打印机对象进行操作,在main.m文件中,我们看到,当Person需要使用哪个打印机的时候,就去调用指定的方法:

     

    1. [person printWithBlack:blackPrint];//调用黑白打印机  
      [person printWithColor:colorPrint];//调用彩色打印机  

       

    这种设计就不好了,为什么呢?假如现在又有一种打印机,那么我们还需要在Person.h中定义一种操作这种打印机的方法,那么后续如果在添加新的打印机呢?还在添加方法吗?那么Person.h文件就会变得很臃肿。所以这时候多态就体现到好处了,使用父类类型,在Person.h中定义一个方法就可以了:

     

     

    1. - (void) doPrint:(Printer *)printer;  

       

    这里看到了,这个方法的参数类型就是父类的类型,这就是多态,定义类型为父类类型,实际类型为子类类型

     

     

    1. - (void) doPrint:(Printer *)printer{  
          [printer print];  
      }  

       

    这里调用print方法,就是传递进来的实际类型的print方法。

     

     

    1. Printer *p1 = [[ColorPrinter alloc] init];  
      Printer *p2 = [[BlackPrinter alloc] init];  
                
      [person doPrint:p1];  
      [person doPrint:p2];  

       

      这里的p1,p2表面上的类型是Printer,但是实际类型是子类类型,所以会调用他们自己对应的print方法。

     

     

    从上面的例子中我们就可以看到多态的特新很是重要,当然也是三大特性中比较难理解的,但是在coding的过程中,用多了就自然理解了,没必要去刻意的理解。

     

    总结

    这篇文章主要介绍了类的三大特性:封装、继承、多态,这三个特性也是后面学习面向对象的重要基础。

    一、封装

    学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java中有四种访问权限修饰符:public,default,protected,private,访问权限一次递减的,这样我们在定义类的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过修饰符来完成,这就是封装,下面来看一个例子吧:

    Car.h

     

    1. //  Car.h  
      //  05_ObjectDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      @interface Car : NSObject{  
          //这个属性就是对外进行保密的相当于private,所以我们需要在外部访问的话,必须定义get/set方法  
          //默认的是private的,但是我们可以使用@public设置为public属性的,那么在外部可以直接访问:person->capcity = 2.8;  
          //当然我们一般不这么使用,因为这会破坏封装性,这种用法相当于C中的结构体中权限  
          //一共四种:@public,@protected,@private,@package,这个和Java中是相同的  
      @public  
          float _capcity; //油量属性  
      }  
        
      - (void)run:(float)t;  
        
      @end  

       

      这里我们可以看到,OC中也是有四种访问权限修饰符:

     

    @public、@protected、@private、@package

    其中默认的修饰符是@private

    但是这里要注意的是:OC中的方法是没有修饰符的概念的,这个和Java有很大的区别,一般都是公开访问的,即public的,但是我们怎么做到让OC中的一个方法不能被外界访问呢?

    OC中是这么做的,如果想让一个方法不被外界访问的话,只需要在.m文件中实现这个方法,不要在头文件中进行定义,说白了就是:该方法有实现,没定义,这样外界在导入头文件的时候,是没有这个方法的,但是这个方法我们可以在自己的.m文件中进行使用。

    为什么要介绍这点知识呢?因为在后面我们会说到单利模式,到时候就会用到这个知识点了。

     

    二、继承

    继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。当然OC中的继承和Java中是一样的,没多大区别,这里在看一个例子吧:

    首先来看一下父类:Car

    Car.h

     

    1. //  
      //  Car.h  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      @interface Car : NSObject{  
          NSString *_brand;  
          NSString *_color;  
      }  
        
      - (void)setBrand:(NSString *)brand;  
      - (void)setColor:(NSString *)color;  
      - (void)brake;  
      - (void)quicken;  
        
      @end  

       

      在Car类中定义了两个属性,以及一些方法

     

    Car.m

     

    1. //  
      //  Car.m  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Car.h"  
        
      @implementation Car  
      - (void)setBrand:(NSString *)brand{  
          _brand = brand;  
      }  
      - (void)setColor:(NSString *)color{  
          _color = color;  
      }  
      - (void)brake{  
          NSLog(@"刹车");  
      }  
      - (void)quicken{  
          NSLog(@"加速");  
      }  
      @end  

       

      方法的实现

     

     

    在来看一下子类:

    Taxi.h

     

    1. //  
      //  Taxi.h  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Car.h"  
        
      @interface Taxi : Car{  
          NSString *_company;//所属公司  
      }  
        
      //打印发票  
      - (void)printTick;  
        
      @end  

       

    看到Taxi类继承了父类Car,这里需要导入父类的头文件,然后在Taxi类中多了一个属性和方法

     

    Taxi.m

     

    1. //  
      //  Taxi.m  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Taxi.h"  
        
      @implementation Taxi  
        
      - (void)printTick{  
          [super brake];  
          [self brake];  
          NSLog(@"%@出租车打印了发票,公司为:%@,颜色为:%@",_brand,_company,_color);  
      }  
        
      @end  

       

    对方法的实现,这里我们看到实现文件中是不需要导入父类Car的头文件的,因为可以认为,Taxi.h头文件中已经包含了Car的头文件了。而且,这里可以使用super关键字来调用父类的方法,同时这里我们也是可以用self关键字来调用,这里看到其实这两种方式调用的效果是一样的,当我们在子类重新实现brake方法的时候(Java中的重写概念),那么这时候super关键字调用的还是父类的方法,而self调用的就是重写之后的brake方法了。同样,我们也是可以使用父类中的属性。

     

     

    再看一下另外一个子类:

    Truck.h

     

    1. //  
      //  Truck.h  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Car.h"  
      //卡车类继承Car  
      @interface Truck : Car{  
          float _maxWeight;//最大载货量  
      }  
        
      //覆盖父类的方法brake  
      //优先调用子类的方法  
      - (void)brake;  
        
      - (void)unload;  
        
      @end  

       

    这里就自己定义了一个brake方法,这时候就会覆盖父类中的brake方法了。

     

    Truck.m

     

    1. //  
      //  Truck.m  
      //  06_ExtendDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Truck.h"  
        
      @implementation Truck  
        
      - (void)brake{  
          [super brake];  
          NSLog(@"Truck类中的brake方法");  
      }  
        
      - (void)unload{  
          [super brake];//调用父类的方法  
          [self brake];//也是可以的  
          NSLog(@"%@的卡车卸货了,载货量:%.2f,汽车的颜色:%@",_brand,_maxWeight,_color);  
      }  
        
      @end  

       

    这里就可以看到,我们会在brake方法中调用一下父类的brake方法,然后在实现我们自己的逻辑代码。

     

     

    好了,继承就说这么多了,其实封装和继承两个特性没什么难度的,很容易理解的,下面在来看一下最后一个特性:多态

     

    三、多态

    多态对于面向对象思想来说,个人感觉是真的很重要,他对以后的编写代码的优雅方式也是起到很重要的作用,其实现在很多设计模式中大部分都是用到了多态的特性,Java中的多态特性用起来很是方便的,但是C++中就很难用了,其实多态说白了就是:定义类型和实际类型,一般是基于接口的形式实现的,不多说了,直接看例子吧:

    打印机的例子

    抽象的打印机类Printer

    Printer.h

     

    1. //  
      //  Printer.h  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      @interface Printer : NSObject  
        
      - (void) print;  
        
      @end  

       

      就是一个简单的方法print

     

    Printer.m

     

    1. //  
      //  Printer.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Printer.h"  
        
      @implementation Printer  
        
      - (void)print{  
          NSLog(@"打印机打印纸张");  
      }  
        
      @end  

       

    实现也是很简单的

     

     

    下面来看一下具体的子类

    ColorPrinter.h

     

    1. //  
      //  ColorPrinter.h  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Printer.h"  
        
      //修改父类的打印行为  
      @interface ColorPrinter : Printer  
      - (void)print;  
      @end  

       

     

     

    ColorPrinter.m

     

    1. //  
      //  ColorPrinter.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "ColorPrinter.h"  
        
      @implementation ColorPrinter  
        
      - (void)print{  
          NSLog(@"彩色打印机");  
      }  
        
      @end  

       


    在看一下另外一个子类

     

    BlackPrinter.h

     

    1. //  
      //  BlackPrinter.h  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Printer.h"  
        
      @interface BlackPrinter : Printer  
        
      - (void)print;  
        
      @end  

       

    BlackPrinter.m

     

     

    1. //  
      //  BlackPrinter.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "BlackPrinter.h"  
        
      @implementation BlackPrinter  
        
      - (void)print{  
          NSLog(@"黑白打印机");  
      }  
        
      @end  
       

       

       

    这里我们在定义一个Person类,用来操作具体的打印机

    Person.h

     

    1. //  
      //  Person.h  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      #import "ColorPrinter.h"  
      #import "BlackPrinter.h"  
        
      //扩展性不高,当我们需要添加一个新的打印机的时候还要定义对应的一个方法  
      //所以这时候就可以使用多态技术了  
        
      @interface Person : NSObject{  
          NSString *_name;  
      }  
        
      //- (void) printWithColor:(ColorPrinter *)colorPrint;  
        
      //- (void) printWithBlack:(BlackPrinter *)blackPrint;  
        
      - (void) doPrint:(Printer *)printer;  
        
      @end

       

        

     

     

    Person.m

     

    1. //  
      //  Person.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import "Person.h"  
        
      @implementation Person  
        
      /* 
      - (void) printWithColor:(ColorPrinter *)colorPrint{ 
          [colorPrint print]; 
      } 
       
      - (void) printWithBlack:(BlackPrinter *)blackPrint{ 
          [blackPrint print]; 
      } 
       */  
        
      - (void) doPrint:(Printer *)printer{  
          [printer print];  
      }  
        
      @end  

       

    再来看一下测试代码:

     

    main.m

     

    1. //  
      //  main.m  
      //  07_DynamicDemo  
      //  
      //  Created by jiangwei on 14-10-11.  
      //  Copyright (c) 2014年 jiangwei. All rights reserved.  
      //  
        
      #import <Foundation/Foundation.h>  
        
      #import "Person.h"  
      #import "BlackPrinter.h"  
      #import "ColorPrinter.h"  
        
      int main(int argc, const charchar * argv[]) {  
          @autoreleasepool {  
                
              Person *person =[[Person alloc] init];  
                
              ColorPrinter *colorPrint = [[ColorPrinter alloc] init];  
              BlackPrinter *blackPrint = [[BlackPrinter alloc] init];  
                
              //多态的定义  
              /* 
              Printer *p1 = [[ColorPrinter alloc] init]; 
              Printer *p2 = [[BlackPrinter alloc] init]; 
               
              [person doPrint:p1]; 
              [person doPrint:p2]; 
               */  
                
              //通过控制台输入的命令来控制使用哪个打印机  
              int cmd;  
              do{  
                  scanf("%d",&cmd);  
                  if(cmd == 1){  
                      [person doPrint:colorPrint];  
                  }else if(cmd == 2){  
                      [person doPrint:blackPrint];  
                  }  
              }while (1);  
                
          }  
          return 0;  
      }  

       

       

     

    下面就来详细讲解一下多态的好处

    上面的例子是一个彩色打印机和黑白打印机这两种打印机,然后Person类中有一个操作打印的方法,当然这个方法是需要打印机对象的,如果不用多态机制实现的话(Person.h中注释的代码部分),就是给两种打印机单独定义个操作的方法,然后在Person.m(代码中注释的部分)中用具体的打印机对象进行操作,在main.m文件中,我们看到,当Person需要使用哪个打印机的时候,就去调用指定的方法:

     

    1. [person printWithBlack:blackPrint];//调用黑白打印机  
      [person printWithColor:colorPrint];//调用彩色打印机  

       

    这种设计就不好了,为什么呢?假如现在又有一种打印机,那么我们还需要在Person.h中定义一种操作这种打印机的方法,那么后续如果在添加新的打印机呢?还在添加方法吗?那么Person.h文件就会变得很臃肿。所以这时候多态就体现到好处了,使用父类类型,在Person.h中定义一个方法就可以了:

     

     

    1. - (void) doPrint:(Printer *)printer;  

    这里看到了,这个方法的参数类型就是父类的类型,这就是多态,定义类型为父类类型,实际类型为子类类型

     

     

    1. - (void) doPrint:(Printer *)printer{  
          [printer print];  
      }  

       

    这里调用print方法,就是传递进来的实际类型的print方法。

     

     

    1. Printer *p1 = [[ColorPrinter alloc] init];  
      Printer *p2 = [[BlackPrinter alloc] init];  
                
      [person doPrint:p1];  
      [person doPrint:p2]; 

       

       

    这里的p1,p2表面上的类型是Printer,但是实际类型是子类类型,所以会调用他们自己对应的print方法。

     

     

    从上面的例子中我们就可以看到多态的特新很是重要,当然也是三大特性中比较难理解的,但是在coding的过程中,用多了就自然理解了,没必要去刻意的理解。

     

    总结

    这篇文章主要介绍了类的三大特性:封装、继承、多态,这三个特性也是后面学习面向对象的重要基础。

    转载于:https://www.cnblogs.com/wangmingxing/p/5129987.html

    展开全文
  • JavaEE问题集合1

    2020-08-06 15:56:27
    一、基础问答 不能被继承的类有[Long Double Float Short Void Class Math String] ...下面哪些类可以被继承?  java.lang.Thread (T)  java.lang.Number (T)  java.lang.Double (F)  java.lang...

    一、基础问答

        不能被继承的类有[Long  Double  Float  Short  Void  Class  Math  String]

        他们都被final修饰

            类可以被继承[Thread   ClassLoader  Number Calendar

    ]

      1.下面哪些类可以被继承?

       java.lang.Thread (T)

       java.lang.Number (T)

       java.lang.Double (F)

       java.lang.Math  (F)

       java.lang.Void  (F)

             java.lang.Class  (F)

       java.lang.ClassLoader (T)

     

      2.抽象类和接口的区别

     

      (1)接口可以被多重implements,抽象类只能被单一extends

      (2)接口只有定义,抽象类可以有定义和实现

     

      (3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本包可见)

     

      3.Hashtable的原理,并说出HashMap与Hashtable的区别

     

      HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.

    HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.

     

      4.forward和redirect的区别

     

      forward: an internal transfer in servlet

      redirect: 重定向,有2次request,第2次request将丢失第一次的attributs/parameters等

     

      5.什么是Web容器?

     

      实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.

     

      6.解释下面关于J2EE的名词

     

      (1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能.

      (2)JMS:Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.

      (3)JTA:Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.

      (4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.

      (5)RMI:Remote Method Interface,远程方法调用

     

      7.EJB是基于哪些技术实现的?并说 出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别.

     

      EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现.

     

      SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑;EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体.

     

      Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean .这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体.Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行.从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态.

     

      8.XML的解析方法

     

      Sax,DOM,JDOM

     

      9.什么是Web Service?

     

      Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。

    Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。

     

      注:SOAP协议(Simple Object Access Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。

     

      优势:

     

      (1).跨平台。

      (2).SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。

      (3).由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。

      (4).此外,WebService实现的技术难度要比CORBA和DCOM小得多。

      (5).要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上。

      (6).在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。

     

      缺点:

     

      (1).WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。

      (2).WebService规范没有规定任何与实现相关的细节,包括对象模型、编程语言,这一点,它不如CORBA。

     

      10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

     

      答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

      同步的实现方面有两种,分别是synchronized,wait与notify

     

      11.JSP中动态INCLUDE与静态INCLUDE的区别?

     

      动态INCLUDE用jsp:include动作实现

     

     

     

      它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

     

      静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

     

      

     

    二、Java编程与程序运行结果

     

      1.Java编程,打印昨天的当前时刻

     

    public class YesterdayCurrent{

      public void main(String[] args){

        Calendar cal = Calendar.getInstance();

        cal.add(Calendar.DATE, -1);

        System.out.println(cal.getTime());

      }

    }

      2.文件读写,实现一个计数器

     

      public int getNum(){

            int i = -1;

            try{

                String stri="";

                BufferedReader in = new BufferedReader(new FileReader(f));

                while((stri=in.readLine())!=null){

                    i = Integer.parseInt(stri.trim());

                }

                in.close();

            }catch(Exception e){

                e.printStackTrace();

            }

            return i;

        }

     

     

    更多相关面试题请参阅这里:

    .Net面试题集(最全最新)

    一道有趣的C#考试题目

    某公司招收.net高级程序员的试卷

    Google:21道能力倾向测试面试题

    GOOGLE面试题

    Google的面试题,你能做出多少?

    据说是阿尔卡特(中国)的面试题目(C)

    成为编程高手的基础素养

    微软面试题——微软的智力题——三个灯泡

    Java面试题汇总及c/c++面试题(最新最全)

    J2EE面试题集(附答案)

    Java面试题集(欢迎大家踊跃提供)

    更多相关面试试题请点击左侧的相关内容主题……

     

        public void setNum(){

            int i = getNum();

            i++;       

            try{

                PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(f,false))); 

                out.write(String.valueOf(i));            //可能是编码的原因,如果直接写入int的话,将出现java编码和windows编码的混乱,因此此处写入的是String

                out.close() ;

            }catch(Exception e){

                e.printStackTrace();

            }

        }

      3. 指出下面程序的运行结果:

     

    class A{

        static{

            System.out.print("1");

        }

        public A(){

            System.out.print("2");

        }

    }

    class B extends A{

        static{

            System.out.print("a");

        }

        public B(){

            System.out.print("b");

        }  

    }

    public class Hello{

        public static void main(String[] ars){

            A ab = new B(); //执行到此处,结果: 1a2b

    ab = new B(); //执行到此处,结果: 1a2bab

        }

    }

      注:类的static 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造

     

      4.写一个Singleton模式的例子

     

    public class Singleton{

    private static Singleton single = new Singleton();

    private Singleton(){}

    public Singleton getInstance(){

      return single;

    }

    }

    三、数据库

     

      1.删除表的重复记录

     

      如果记录完全相同才算重复记录,那么:  (sql server2000下测试通过)

     

    select distinct * into #tmpp from tid

    delete from tid    

    insert into tid select * from #tmpp

    drop table #tmpp

      如果有id主键(数字,自增1的那种),那么:(sql server2000下测试通过)

     

    delete from tableA where id not in

    (select id = min(id) from tableA group by name)

      2.delete from tablea & truncate table tablea的区别

     

      truncate 语句执行速度快,占资源少,并且只记录页删除的日志;

      delete 对每条记录的删除均需要记录日志

     

     

    JAVA编程题

    1.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset

    [hidden]import java.util.*;

    public class bycomma{

    public static String[] splitStringByComma(String source){

       if(source==null||source.trim().equals(""))

        return null;

       StringTokenizer commaToker = new StringTokenizer(source,",");

       String[] result = new String[commaToker.countTokens()];

       int i=0;

       while(commaToker.hasMoreTokens()){

        result[i] = commaToker.nextToken();

        i++;

       }

       return result;

    }

    public static void main(String args[]){

    String[] s = splitStringByComma("5,8,7,4,3,9,1");

    int[] ii = new int[s.length];

    for(int i = 0;i ii[i] =Integer.parseInt(s[i]);

    }

        Arrays.sort(ii);

        //asc

        for(int i=0;i    System.out.println(ii[i]);

        }

        //desc

        for(int i=(s.length-1);i>=0;i--){

        System.out.println(ii[i]);

        }

    }

    }[/hidden]

    2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

    [hidden]package test.format;

    import java.text.NumberFormat;

    import java.util.HashMap;

    public class SimpleMoneyFormat {

      public static final String EMPTY = "";

      public static final String ZERO = "零";

      public static final String ONE = "壹";

      public static final String TWO = "贰";

      public static final String THREE = "叁";

      public static final String FOUR = "肆";

      public static final String FIVE = "伍";

      public static final String SIX = "陆";

      public static final String SEVEN = "柒";

      public static final String EIGHT = "捌";

      public static final String NINE = "玖";

      public static final String TEN = "拾";

      public static final String HUNDRED = "佰";

      public static final String THOUSAND = "仟";

      public static final String TEN_THOUSAND = "万";

      public static final String HUNDRED_MILLION = "亿";

      public static final String YUAN = "元";

      public static final String JIAO = "角";

      public static final String FEN = "分";

      public static final String DOT = ".";

     

      private static SimpleMoneyFormat formatter = null;

      private HashMap chineseNumberMap = new HashMap();

      private HashMap chineseMoneyPattern = new HashMap();

      private NumberFormat numberFormat = NumberFormat.getInstance();

     

      private SimpleMoneyFormat() {

        numberFormat.setMaximumFractionDigits(4);

        numberFormat.setMinimumFractionDigits(2);

        numberFormat.setGroupingUsed(false);

     

        chineseNumberMap.put("0", ZERO);

        chineseNumberMap.put("1", ONE);

        chineseNumberMap.put("2", TWO);

        chineseNumberMap.put("3", THREE);

        chineseNumberMap.put("4", FOUR);

        chineseNumberMap.put("5", FIVE);

        chineseNumberMap.put("6", SIX);

        chineseNumberMap.put("7", SEVEN);

        chineseNumberMap.put("8", EIGHT);

        chineseNumberMap.put("9", NINE);

        chineseNumberMap.put(DOT, DOT);

     

        chineseMoneyPattern.put("1", TEN);

        chineseMoneyPattern.put("2", HUNDRED);

        chineseMoneyPattern.put("3", THOUSAND);

        chineseMoneyPattern.put("4", TEN_THOUSAND);

        chineseMoneyPattern.put("5", TEN);

        chineseMoneyPattern.put("6", HUNDRED);

        chineseMoneyPattern.put("7", THOUSAND);

        chineseMoneyPattern.put("8", HUNDRED_MILLION);

      }

     

      public static SimpleMoneyFormat getInstance() {

        if (formatter == null)

          formatter = new SimpleMoneyFormat();

        return formatter;

      }

     

      public String format(String moneyStr) {

        checkPrecision(moneyStr);

        String result;

        result = convertToChineseNumber(moneyStr);

        result = addUnitsToChineseMoneyString(result);

        return result;

      }

     

      public String format(double moneyDouble) {

        return format(numberFormat.format(moneyDouble));

      }

     

      public String format(int moneyInt) {

        return format(numberFormat.format(moneyInt));

      }

     

      public String format(long moneyLong) {

        return format(numberFormat.format(moneyLong));

      }

     

      public String format(Number moneyNum) {

        return format(numberFormat.format(moneyNum));

      }

     

      private String convertToChineseNumber(String moneyStr) {

        String result;

        StringBuffer cMoneyStringBuffer = new StringBuffer();

        for (int i = 0; i < moneyStr.length(); i++) {

          cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i + 1)));

        }

        //拾佰仟万亿等都是汉字里面才有的单位,加上它们

        int indexOfDot = cMoneyStringBuffer.indexOf(DOT);

        int moneyPatternCursor = 1;

        for (int i = indexOfDot - 1; i > 0; i--) {

          cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor));

          moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor + 1;

        }

     

        String fractionPart = cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."));

        cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."), cMoneyStringBuffer.length());

        while (cMoneyStringBuffer.indexOf("零拾") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"), cMoneyStringBuffer.indexOf("零拾") + 2, ZERO);

        }

        while (cMoneyStringBuffer.indexOf("零佰") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"), cMoneyStringBuffer.indexOf("零佰") + 2, ZERO);

        }

        while (cMoneyStringBuffer.indexOf("零仟") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"), cMoneyStringBuffer.indexOf("零仟") + 2, ZERO);

        }

        while (cMoneyStringBuffer.indexOf("零万") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"), cMoneyStringBuffer.indexOf("零万") + 2, TEN_THOUSAND);

        }

        while (cMoneyStringBuffer.indexOf("零亿") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"), cMoneyStringBuffer.indexOf("零亿") + 2, HUNDRED_MILLION);

        }

        while (cMoneyStringBuffer.indexOf("零零") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"), cMoneyStringBuffer.indexOf("零零") + 2, ZERO);

        }

        if (cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1)

          cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1, cMoneyStringBuffer.length());

        cMoneyStringBuffer.append(fractionPart);

     

        result = cMoneyStringBuffer.toString();

        return result;

      }

     

     

      private String addUnitsToChineseMoneyString(String moneyStr) {

        String result;

        StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr);

        int indexOfDot = cMoneyStringBuffer.indexOf(DOT);

        cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN);[/hidden]

     

     

    欢迎加入更多J2EE面试题……

     

    更多相关面试题请参阅这里:

    一道有趣的C#考试题目

    某公司招收.net高级程序员的试卷

    .Net面试题集(最全最新)(欢迎加入更多.Net 面试题)

    Google:21道能力倾向测试面试题

    GOOGLE面试题

    Google的面试题,你能做出多少?

    据说是阿尔卡特(中国)的面试题目(C)

    世界大公司面试题——微软的面试题

    世界大公司面试题——微软的面试题(答案)

    成为编程高手的基础素养

    微软面试题——微软的智力题——三个灯泡

    Java面试题汇总及c/c++面试题(最新最全)

    J2EE面试题集(附答案)

    Java常见面试题集--面试题全面综合(一)

    Java常见面试题集--面试题全面综合(二)

    Java面试题集(欢迎大家踊跃提供)

    .Net面试题集(最全最新)(欢迎加入更多.Net 面试题)

     

    更多相关面试试题

    更多面试题请点击左侧的相关内容主题……

     

    J2EE面试题集(附答案)  J2EE认证试题集

    Tags: J2EE面试题集锦(附答案) , J2EE面试题 , JAVA面试题 , J2EE常见面试题

    上一篇: Java面试题集(欢迎提供更多Java面试题)

    下一篇: Java面试题(最新最全Java面试题汇总)

    评论(12) | 引用(0) | 阅读(32204)

    引用地址:

    注意: 该地址仅在今日23:59:59之前有效

    travel Says:

    2008/03/19 00:13

    2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

    测试过了,数字自己再转换吧。(小数还没处理,看个想法吧 )

    public class NumToChinese {

        public static void main(String[] args) {

        //String numberString = args[1];//args[0] is the class name "NumToChinese"

        String numberString = "123400567089";

        System.out.println("original number is :"+numberString); 

        char[] numberChar = numberString.toCharArray();

        int length = numberString.length();

        String[] chineseChar = new String[length];

        chineseChar[0]="";

        for (int i = 1;i<length; i++){

            switch(i%8)  {

            case 1: chineseChar[i]="十";break;

            case 2: chineseChar[i]="百";break;

            case 3: chineseChar[i]="千";break;

            case 4: chineseChar[i]="万";break;

            case 5: chineseChar[i]="十";break;

            case 6: chineseChar[i]="百";break;

            case 7: chineseChar[i]="千";break;

            case 0: chineseChar[i]="亿";

        }

    }

       StringBuffer result = new StringBuffer();

        for (int j=0;j<length;j++){

            char first = numberChar[j];

            String second = chineseChar[length-1-j];

            if (first!='0')     

                result.append(first).append(second);

           else {

                if (((length-1-j)%4)==0)

                    result.append(second);

                else {

                    String temp = result.substring(result.length()-1);

                    if(!temp.equals("零")) result.append("零");

                }

            }

        }

        System.out.println("the reversed chinese number is : "+result.toString());

      }

     

    }

    牛发癫 Says:

    2008/03/10 11:29

    好东西,不顶就对不住你了

    不 Says: 

    2007/11/02 16:09

    谢谢

    skyfire82 Says: 

    2007/08/27 13:46

    好东西  顶

    dfdsfdsf Says: 

    2007/08/26 19:09

    dcffd

    acici Says: 

    2007/08/12 09:57

    查看详情

    chenzhengrong Says: 

    2007/08/10 10:43

    太叼了!!!

    网魂工作室 Says: 

    2006/04/04 10:14

    11.

    interface Playable {

        void play();

    }

    interface Bounceable {

        void play();

    }

    interface Rollable extends Playable, Bounceable {

        Ball ball = new Ball(\"PingPang\");

    }

    class Ball implements Rollable {

        private String name;

        public String getName() {

            return name;

        }

        public Ball(String name) {

            this.name = name;       

        }

       public void play() {

            ball = new Ball(\"Football\");

            System.out.println(ball.getName());

        }

    }

    这个错误不容易发现。

    答案: 错。\"interface Rollable extends Playable, Bounceable\"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的\"Ball ball = new Ball(\"PingPang\");\"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说\"Ball ball = new Ball(\"PingPang\");\"实际上是\"public static final Ball ball = new Ball(\"PingPang\");\"。在Ball类的Play()方法中,\"ball = new Ball(\"Football\");\"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在\"ball = new Ball(\"Football\");\"这里显示有错。

    网魂工作室 Says: 

    2006/04/04 10:14

    8.

    public class Something {

         public static void main(String[] args) {

            Something s = new Something();

            System.out.println(\"s.doSomething() returns \" + doSomething());

        }

        public String doSomething() {

            return \"Do something ...\";

        }

    }

    看上去很完美。

    答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成\"System.out.println(\"s.doSomething() returns \" + s.doSomething());\"。同理,static method不能访问non-static instant variable。

    9.

    此处,Something类的文件名叫OtherThing.java

    class Something {

        private static void main(String[] something_to_do) {       

            System.out.println(\"Do something ...\");

        }

    }

    这个好像很明显。

    答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。

    10

    interface  A{

       int x = 0;

    }

    class B{

       int x =1;

    }

    class C extends B implements A {

       public void pX(){

          System.out.println(x);

       }

       public static void main(String[] args) {

          new C().pX();

       }

    }

    答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。

     

    网魂工作室 Says: 

    2006/04/04 10:13

     

    6.

    class Something {

        int i;

        public void doSomething() {

            System.out.println(\"i = \" + i);

        }

    }

    有什么错呢? 看不出来啊。

    答案: 正确。输出的是\"i = 0\"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

    7.

    class Something {

        final int i;

        public void doSomething() {

            System.out.println(\"i = \" + i);

        }

    }

    和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?

    答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为\"final int i = 0;\"。

    展开全文
  • J2EE面试题集锦_

    2013-06-26 21:11:00
    一、基础问答 不能被继承的类有[Long Double Float Short Void Class Math String] 他们都被final修饰 类可以被继承[Thread ClassLoader Number ...下面哪些类可以被继承?  java.lang.Thread (T)  java...

    一、基础问答

        不能被继承的类有[Long  Double  Float  Short  Void  Class  Math  String]

        他们都被final修饰

            类可以被继承[Thread   ClassLoader  Number Calendar

    ]

      1.下面哪些类可以被继承?

       java.lang.Thread (T)

       java.lang.Number (T)

       java.lang.Double (F)

       java.lang.Math  (F)

       java.lang.Void  (F)

             java.lang.Class  (F)

       java.lang.ClassLoader (T)

     

      2.抽象类和接口的区别

     

      (1)接口可以被多重implements,抽象类只能被单一extends

      (2)接口只有定义,抽象类可以有定义和实现

     

      (3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本包可见)

     

      3.Hashtable的原理,并说出HashMap与Hashtable的区别

     

      HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.

    HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.

     

      4.forward和redirect的区别

     

      forward: an internal transfer in servlet

      redirect: 重定向,有2次request,第2次request将丢失第一次的attributs/parameters等

     

      5.什么是Web容器?

     

      实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.

     

      6.解释下面关于J2EE的名词

     

      (1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能.

      (2)JMS:Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.

      (3)JTA:Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.

      (4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.

      (5)RMI:Remote Method Interface,远程方法调用

     

      7.EJB是基于哪些技术实现的?并说 出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别.

     

      EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现.

     

      SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑;EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体.

     

      Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean .这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体.Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行.从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态.

     

      8.XML的解析方法

     

      Sax,DOM,JDOM

     

      9.什么是Web Service?

     

      Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。

    Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。

     

      注:SOAP协议(Simple Object Access Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。

     

      优势:

     

      (1).跨平台。

      (2).SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。

      (3).由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。

      (4).此外,WebService实现的技术难度要比CORBA和DCOM小得多。

      (5).要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上。

      (6).在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。

     

      缺点:

     

      (1).WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。

      (2).WebService规范没有规定任何与实现相关的细节,包括对象模型、编程语言,这一点,它不如CORBA。

     

      10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

     

      答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

      同步的实现方面有两种,分别是synchronized,wait与notify

     

      11.JSP中动态INCLUDE与静态INCLUDE的区别?

     

      动态INCLUDE用jsp:include动作实现

     

     

     

      它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

     

      静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

     

      

     

    二、Java编程与程序运行结果

     

      1.Java编程,打印昨天的当前时刻

     

    public class YesterdayCurrent{

      public void main(String[] args){

        Calendar cal = Calendar.getInstance();

        cal.add(Calendar.DATE, -1);

        System.out.println(cal.getTime());

      }

    }

      2.文件读写,实现一个计数器

     

      public int getNum(){

            int i = -1;

            try{

                String stri="";

                BufferedReader in = new BufferedReader(new FileReader(f));

                while((stri=in.readLine())!=null){

                    i = Integer.parseInt(stri.trim());

                }

                in.close();

            }catch(Exception e){

                e.printStackTrace();

            }

            return i;

        }

     

     

    更多相关面试题请参阅这里:

    .Net面试题集(最全最新)

    一道有趣的C#考试题目

    某公司招收.net高级程序员的试卷

    Google:21道能力倾向测试面试题

    GOOGLE面试题

    Google的面试题,你能做出多少?

    据说是阿尔卡特(中国)的面试题目(C)

    成为编程高手的基础素养

    微软面试题——微软的智力题——三个灯泡

    Java面试题汇总及c/c++面试题(最新最全)

    J2EE面试题集(附答案)

    Java面试题集(欢迎大家踊跃提供)

    更多相关面试试题请点击左侧的相关内容主题……

     

        public void setNum(){

            int i = getNum();

            i++;       

            try{

                PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(f,false))); 

                out.write(String.valueOf(i));            //可能是编码的原因,如果直接写入int的话,将出现java编码和windows编码的混乱,因此此处写入的是String

                out.close() ;

            }catch(Exception e){

                e.printStackTrace();

            }

        }

      3. 指出下面程序的运行结果:

     

    class A{

        static{

            System.out.print("1");

        }

        public A(){

            System.out.print("2");

        }

    }

    class B extends A{

        static{

            System.out.print("a");

        }

        public B(){

            System.out.print("b");

        }  

    }

    public class Hello{

        public static void main(String[] ars){

            A ab = new B(); //执行到此处,结果: 1a2b

    ab = new B(); //执行到此处,结果: 1a2bab

        }

    }

      注:类的static 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造

     

      4.写一个Singleton模式的例子

     

    public class Singleton{

    private static Singleton single = new Singleton();

    private Singleton(){}

    public Singleton getInstance(){

      return single;

    }

    }

    三、数据库

     

      1.删除表的重复记录

     

      如果记录完全相同才算重复记录,那么:  (sql server2000下测试通过)

     

    select distinct * into #tmpp from tid

    delete from tid    

    insert into tid select * from #tmpp

    drop table #tmpp

      如果有id主键(数字,自增1的那种),那么:(sql server2000下测试通过)

     

    delete from tableA where id not in

    (select id = min(id) from tableA group by name)

      2.delete from tablea & truncate table tablea的区别

     

      truncate 语句执行速度快,占资源少,并且只记录页删除的日志;

      delete 对每条记录的删除均需要记录日志

     

     

    JAVA编程题

    1.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset

    [hidden]import java.util.*;

    public class bycomma{

    public static String[] splitStringByComma(String source){

       if(source==null||source.trim().equals(""))

        return null;

       StringTokenizer commaToker = new StringTokenizer(source,",");

       String[] result = new String[commaToker.countTokens()];

       int i=0;

       while(commaToker.hasMoreTokens()){

        result[i] = commaToker.nextToken();

        i++;

       }

       return result;

    }

    public static void main(String args[]){

    String[] s = splitStringByComma("5,8,7,4,3,9,1");

    int[] ii = new int[s.length];

    for(int i = 0;i ii[i] =Integer.parseInt(s[i]);

    }

        Arrays.sort(ii);

        //asc

        for(int i=0;i    System.out.println(ii[i]);

        }

        //desc

        for(int i=(s.length-1);i>=0;i--){

        System.out.println(ii[i]);

        }

    }

    }[/hidden]

    2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

    [hidden]package test.format;

    import java.text.NumberFormat;

    import java.util.HashMap;

    public class SimpleMoneyFormat {

      public static final String EMPTY = "";

      public static final String ZERO = "零";

      public static final String ONE = "壹";

      public static final String TWO = "贰";

      public static final String THREE = "叁";

      public static final String FOUR = "肆";

      public static final String FIVE = "伍";

      public static final String SIX = "陆";

      public static final String SEVEN = "柒";

      public static final String EIGHT = "捌";

      public static final String NINE = "玖";

      public static final String TEN = "拾";

      public static final String HUNDRED = "佰";

      public static final String THOUSAND = "仟";

      public static final String TEN_THOUSAND = "万";

      public static final String HUNDRED_MILLION = "亿";

      public static final String YUAN = "元";

      public static final String JIAO = "角";

      public static final String FEN = "分";

      public static final String DOT = ".";

     

      private static SimpleMoneyFormat formatter = null;

      private HashMap chineseNumberMap = new HashMap();

      private HashMap chineseMoneyPattern = new HashMap();

      private NumberFormat numberFormat = NumberFormat.getInstance();

     

      private SimpleMoneyFormat() {

        numberFormat.setMaximumFractionDigits(4);

        numberFormat.setMinimumFractionDigits(2);

        numberFormat.setGroupingUsed(false);

     

        chineseNumberMap.put("0", ZERO);

        chineseNumberMap.put("1", ONE);

        chineseNumberMap.put("2", TWO);

        chineseNumberMap.put("3", THREE);

        chineseNumberMap.put("4", FOUR);

        chineseNumberMap.put("5", FIVE);

        chineseNumberMap.put("6", SIX);

        chineseNumberMap.put("7", SEVEN);

        chineseNumberMap.put("8", EIGHT);

        chineseNumberMap.put("9", NINE);

        chineseNumberMap.put(DOT, DOT);

     

        chineseMoneyPattern.put("1", TEN);

        chineseMoneyPattern.put("2", HUNDRED);

        chineseMoneyPattern.put("3", THOUSAND);

        chineseMoneyPattern.put("4", TEN_THOUSAND);

        chineseMoneyPattern.put("5", TEN);

        chineseMoneyPattern.put("6", HUNDRED);

        chineseMoneyPattern.put("7", THOUSAND);

        chineseMoneyPattern.put("8", HUNDRED_MILLION);

      }

     

      public static SimpleMoneyFormat getInstance() {

        if (formatter == null)

          formatter = new SimpleMoneyFormat();

        return formatter;

      }

     

      public String format(String moneyStr) {

        checkPrecision(moneyStr);

        String result;

        result = convertToChineseNumber(moneyStr);

        result = addUnitsToChineseMoneyString(result);

        return result;

      }

     

      public String format(double moneyDouble) {

        return format(numberFormat.format(moneyDouble));

      }

     

      public String format(int moneyInt) {

        return format(numberFormat.format(moneyInt));

      }

     

      public String format(long moneyLong) {

        return format(numberFormat.format(moneyLong));

      }

     

      public String format(Number moneyNum) {

        return format(numberFormat.format(moneyNum));

      }

     

      private String convertToChineseNumber(String moneyStr) {

        String result;

        StringBuffer cMoneyStringBuffer = new StringBuffer();

        for (int i = 0; i < moneyStr.length(); i++) {

          cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i + 1)));

        }

        //拾佰仟万亿等都是汉字里面才有的单位,加上它们

        int indexOfDot = cMoneyStringBuffer.indexOf(DOT);

        int moneyPatternCursor = 1;

        for (int i = indexOfDot - 1; i > 0; i--) {

          cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor));

          moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor + 1;

        }

     

        String fractionPart = cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."));

        cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."), cMoneyStringBuffer.length());

        while (cMoneyStringBuffer.indexOf("零拾") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"), cMoneyStringBuffer.indexOf("零拾") + 2, ZERO);

        }

        while (cMoneyStringBuffer.indexOf("零佰") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"), cMoneyStringBuffer.indexOf("零佰") + 2, ZERO);

        }

        while (cMoneyStringBuffer.indexOf("零仟") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"), cMoneyStringBuffer.indexOf("零仟") + 2, ZERO);

        }

        while (cMoneyStringBuffer.indexOf("零万") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"), cMoneyStringBuffer.indexOf("零万") + 2, TEN_THOUSAND);

        }

        while (cMoneyStringBuffer.indexOf("零亿") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"), cMoneyStringBuffer.indexOf("零亿") + 2, HUNDRED_MILLION);

        }

        while (cMoneyStringBuffer.indexOf("零零") != -1) {

          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"), cMoneyStringBuffer.indexOf("零零") + 2, ZERO);

        }

        if (cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1)

          cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1, cMoneyStringBuffer.length());

        cMoneyStringBuffer.append(fractionPart);

     

        result = cMoneyStringBuffer.toString();

        return result;

      }

     

     

      private String addUnitsToChineseMoneyString(String moneyStr) {

        String result;

        StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr);

        int indexOfDot = cMoneyStringBuffer.indexOf(DOT);

        cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN);[/hidden]

     

     

    欢迎加入更多J2EE面试题……

     

    更多相关面试题请参阅这里:

    一道有趣的C#考试题目

    某公司招收.net高级程序员的试卷

    .Net面试题集(最全最新)(欢迎加入更多.Net 面试题)

    Google:21道能力倾向测试面试题

    GOOGLE面试题

    Google的面试题,你能做出多少?

    据说是阿尔卡特(中国)的面试题目(C)

    世界大公司面试题——微软的面试题

    世界大公司面试题——微软的面试题(答案)

    成为编程高手的基础素养

    微软面试题——微软的智力题——三个灯泡

    Java面试题汇总及c/c++面试题(最新最全)

    J2EE面试题集(附答案)

    Java常见面试题集--面试题全面综合(一)

    Java常见面试题集--面试题全面综合(二)

    Java面试题集(欢迎大家踊跃提供)

    .Net面试题集(最全最新)(欢迎加入更多.Net 面试题)

     

    更多相关面试试题

    更多面试题请点击左侧的相关内容主题……

     

    J2EE面试题集(附答案)  J2EE认证试题集

    Tags: J2EE面试题集锦(附答案) , J2EE面试题 , JAVA面试题 , J2EE常见面试题

    上一篇: Java面试题集(欢迎提供更多Java面试题)

    下一篇: Java面试题(最新最全Java面试题汇总)

    评论(12) | 引用(0) | 阅读(32204)

    引用地址:

    注意: 该地址仅在今日23:59:59之前有效

    travel Says:

    2008/03/19 00:13

    2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

    测试过了,数字自己再转换吧。(小数还没处理,看个想法吧 )

    public class NumToChinese {

        public static void main(String[] args) {

        //String numberString = args[1];//args[0] is the class name "NumToChinese"

        String numberString = "123400567089";

        System.out.println("original number is :"+numberString); 

        char[] numberChar = numberString.toCharArray();

        int length = numberString.length();

        String[] chineseChar = new String[length];

        chineseChar[0]="";

        for (int i = 1;i<length; i++){

            switch(i%8)  {

            case 1: chineseChar[i]="十";break;

            case 2: chineseChar[i]="百";break;

            case 3: chineseChar[i]="千";break;

            case 4: chineseChar[i]="万";break;

            case 5: chineseChar[i]="十";break;

            case 6: chineseChar[i]="百";break;

            case 7: chineseChar[i]="千";break;

            case 0: chineseChar[i]="亿";

        }

    }

       StringBuffer result = new StringBuffer();

        for (int j=0;j<length;j++){

            char first = numberChar[j];

            String second = chineseChar[length-1-j];

            if (first!='0')     

                result.append(first).append(second);

           else {

                if (((length-1-j)%4)==0)

                    result.append(second);

                else {

                    String temp = result.substring(result.length()-1);

                    if(!temp.equals("零")) result.append("零");

                }

            }

        }

        System.out.println("the reversed chinese number is : "+result.toString());

      }

     

    }

    牛发癫 Says:

    2008/03/10 11:29

    好东西,不顶就对不住你了

    不 Says: 

    2007/11/02 16:09

    谢谢

    skyfire82 Says: 

    2007/08/27 13:46

    好东西  顶

    dfdsfdsf Says: 

    2007/08/26 19:09

    dcffd

    acici Says: 

    2007/08/12 09:57

    查看详情

    chenzhengrong Says: 

    2007/08/10 10:43

    太叼了!!!

    网魂工作室 Says: 

    2006/04/04 10:14

    11.

    interface Playable {

        void play();

    }

    interface Bounceable {

        void play();

    }

    interface Rollable extends Playable, Bounceable {

        Ball ball = new Ball(\"PingPang\");

    }

    class Ball implements Rollable {

        private String name;

        public String getName() {

            return name;

        }

        public Ball(String name) {

            this.name = name;       

        }

       public void play() {

            ball = new Ball(\"Football\");

            System.out.println(ball.getName());

        }

    }

    这个错误不容易发现。

    答案: 错。\"interface Rollable extends Playable, Bounceable\"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的\"Ball ball = new Ball(\"PingPang\");\"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说\"Ball ball = new Ball(\"PingPang\");\"实际上是\"public static final Ball ball = new Ball(\"PingPang\");\"。在Ball类的Play()方法中,\"ball = new Ball(\"Football\");\"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在\"ball = new Ball(\"Football\");\"这里显示有错。

    网魂工作室 Says: 

    2006/04/04 10:14

    8.

    public class Something {

         public static void main(String[] args) {

            Something s = new Something();

            System.out.println(\"s.doSomething() returns \" + doSomething());

        }

        public String doSomething() {

            return \"Do something ...\";

        }

    }

    看上去很完美。

    答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成\"System.out.println(\"s.doSomething() returns \" + s.doSomething());\"。同理,static method不能访问non-static instant variable。

    9.

    此处,Something类的文件名叫OtherThing.java

    class Something {

        private static void main(String[] something_to_do) {       

            System.out.println(\"Do something ...\");

        }

    }

    这个好像很明显。

    答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。

    10.

    interface  A{

       int x = 0;

    }

    class B{

       int x =1;

    }

    class C extends B implements A {

       public void pX(){

          System.out.println(x);

       }

       public static void main(String[] args) {

          new C().pX();

       }

    }

    答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。

     

    网魂工作室 Says: 

    2006/04/04 10:13

     

    6.

    class Something {

        int i;

        public void doSomething() {

            System.out.println(\"i = \" + i);

        }

    }

    有什么错呢? 看不出来啊。

    答案: 正确。输出的是\"i = 0\"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

    7.

    class Something {

        final int i;

        public void doSomething() {

            System.out.println(\"i = \" + i);

        }

    }

    和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?

    答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为\"final int i = 0;\"。

    转载于:https://www.cnblogs.com/fickleness/p/3157465.html

    展开全文
  • Java笔试题【7】

    2017-04-02 02:00:57
    一、基础问答  不能被继承的类有[Long Double Float Short Void Class Math String]  他们都被final修饰  类可以被继承[Thread ClassLoader...下面哪些类可以被继承?  java.lang.Thread (T)  java.l

    一、基础问答

        不能被继承的类有[Long  Double Float  Short  Void Class  Math  String]

        他们都被final修饰

            类可以被继承[Thread   ClassLoader  Number Calendar

    ]

      1.下面哪些类可以被继承?

       java.lang.Thread (T)

       java.lang.Number (T)

       java.lang.Double (F)

       java.lang.Math (F)

       java.lang.Void (F)

            java.lang.Class  (F)

       java.lang.ClassLoader (T)

     

      2.抽象类和接口的区别

     

      (1)接口可以被多重implements,抽象类只能被单一extends

      (2)接口只有定义,抽象类可以有定义和实现

     

      (3)接口的字段定义默认为:public staticfinal, 抽象类字段默认是"friendly"(本包可见)

     

      3.Hashtable的原理,并说出HashMap与Hashtable的区别

     

      HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.

    HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的.

     

      4.forward和redirect的区别

     

      forward: an internal transfer in servlet

      redirect: 重定向,有2次request,第2次request将丢失第一次的attributs/parameters等

     

      5.什么是Web容器?

     

      实现J2EE规范中web协议的应用.该协议定义了web程序的运行时环境,包括:并发性,安全性,生命周期管理等等.

     

      6.解释下面关于J2EE的名词

     

      (1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能.

      (2)JMS:Java Message Service,JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.

      (3)JTA:Java Transaction API,JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.

      (4)JAF: Java Action FrameWork,JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.

      (5)RMI:Remote Method Interface,远程方法调用

     

      7.EJB是基于哪些技术实现的?并说 出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别.

     

      EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现.

     

      SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件.EntityBean被用来代表应用系统中用到的数据.对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑;EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体.

     

      Session Bean 还可以再细分为 StatefulSession Bean 与 Stateless Session Bean .这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体.Stateless SessionBean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 StatelessSession Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method.换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行.从内存方面来看, Stateful Session Bean 与 Stateless SessionBean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态.

     

      8.XML的解析方法

     

      Sax,DOM,JDOM

     

      9.什么是Web Service?

     

      Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。

    Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。

     

      注:SOAP协议(Simple Object AccessProtocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。

     

      优势:

     

      (1).跨平台。

      (2).SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。

      (3).由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。

      (4).此外,WebService实现的技术难度要比CORBA和DCOM小得多。

      (5).要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上。

      (6).在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。

     

      缺点:

     

      (1).WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。

      (2).WebService规范没有规定任何与实现相关的细节,包括对象模型、编程语言,这一点,它不如CORBA。

     

      10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

     

      答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

      同步的实现方面有两种,分别是synchronized,wait与notify

     

      11.JSP中动态INCLUDE与静态INCLUDE的区别?

     

      动态INCLUDE用jsp:include动作实现

     

     

     

      它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

     

      静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

     

      

     

    二、Java编程与程序运行结果

     

      1.Java编程,打印昨天的当前时刻

     

    public class YesterdayCurrent{

      public voidmain(String[] args){

        Calendar cal= Calendar.getInstance();

       cal.add(Calendar.DATE, -1);

       System.out.println(cal.getTime());

      }

    }

      2.文件读写,实现一个计数器

     

      public intgetNum(){

            int i =-1;

            try{

                Stringstri="";

               BufferedReader in = new BufferedReader(new FileReader(f));

               while((stri=in.readLine())!=null){

                   i = Integer.parseInt(stri.trim());

                }

               in.close();

           }catch(Exception e){

                e.printStackTrace();

            }

            returni;

        }

     

     

    更多相关面试题请参阅这里:

    .Net面试题集(最全最新)

    一道有趣的C#考试题目

    某公司招收.net高级程序员的试卷

    Google:21道能力倾向测试面试题

    GOOGLE面试题

    Google的面试题,你能做出多少?

    据说是阿尔卡特(中国)的面试题目(C)

    成为编程高手的基础素养

    微软面试题——微软的智力题——三个灯泡

    Java面试题汇总及c/c++面试题(最新最全)

    J2EE面试题集(附答案)

    Java面试题集(欢迎大家踊跃提供)

    更多相关面试试题请点击左侧的相关内容主题……

     

        public voidsetNum(){

            int i =getNum();

           i++;       

            try{

               PrintWriter out=new PrintWriter(new BufferedWriter(newFileWriter(f,false))); 

               out.write(String.valueOf(i));           //可能是编码的原因,如果直接写入int的话,将出现java编码和windows编码的混乱,因此此处写入的是String

               out.close() ;

           }catch(Exception e){

               e.printStackTrace();

            }

        }

      3. 指出下面程序的运行结果:

     

    class A{

        static{

           System.out.print("1");

        }

        public A(){

           System.out.print("2");

        }

    }

    class B extends A{

        static{

           System.out.print("a");

        }

        public B(){

           System.out.print("b");

        }  

    }

    public class Hello{

        publicstatic void main(String[] ars){

            A ab =new B(); //执行到此处,结果: 1a2b

    ab = new B(); //执行到此处,结果:1a2bab

        }

    }

      注:类的static 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造

     

      4.写一个Singleton模式的例子

     

    public class Singleton{

    private static Singleton single = new Singleton();

    private Singleton(){}

    public Singleton getInstance(){

      return single;

    }

    }

    三、数据库

     

      1.删除表的重复记录

     

      如果记录完全相同才算重复记录,那么:  (sql server2000下测试通过)

     

    select distinct * into #tmpp from tid

    delete from tid    

    insert into tid select * from #tmpp

    drop table #tmpp

      如果有id主键(数字,自增1的那种),那么:(sql server2000下测试通过)

     

    delete from tableA where id not in

    (select id = min(id) from tableA group by name)

      2.delete from tablea & truncate table tablea的区别

     

      truncate 语句执行速度快,占资源少,并且只记录页删除的日志;

      delete 对每条记录的删除均需要记录日志

     

     

    JAVA编程题

    1.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset

    [hidden]import java.util.*;

    public class bycomma{

    public static String[] splitStringByComma(Stringsource){

      if(source==null||source.trim().equals(""))

        return null;

      StringTokenizer commaToker = new StringTokenizer(source,",");

       String[]result = new String[commaToker.countTokens()];

       int i=0;

      while(commaToker.hasMoreTokens()){

        result[i] =commaToker.nextToken();

        i++;

       }

       returnresult;

    }

    public static void main(String args[]){

    String[] s =splitStringByComma("5,8,7,4,3,9,1");

    int[] ii = new int[s.length];

    for(int i = 0;i ii[i] =Integer.parseInt(s[i]);

    }

       Arrays.sort(ii);

        //asc

        for(inti=0;i    System.out.println(ii[i]);

        }

        //desc

        for(inti=(s.length-1);i>=0;i--){

       System.out.println(ii[i]);

        }

    }

    }[/hidden]

    2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

    [hidden]package test.format;

    import java.text.NumberFormat;

    import java.util.HashMap;

    public class SimpleMoneyFormat {

      public staticfinal String EMPTY = "";

      public staticfinal String ZERO = "零";

      public staticfinal String ONE = "壹";

      public staticfinal String TWO = "贰";

      public staticfinal String THREE = "叁";

      public staticfinal String FOUR = "肆";

      public staticfinal String FIVE = "伍";

      public staticfinal String SIX = "陆";

      public staticfinal String SEVEN = "柒";

      public staticfinal String EIGHT = "捌";

      public staticfinal String NINE = "玖";

      public staticfinal String TEN = "拾";

      public staticfinal String HUNDRED = "佰";

      public staticfinal String THOUSAND = "仟";

      public staticfinal String TEN_THOUSAND = "万";

      public staticfinal String HUNDRED_MILLION = "亿";

      public staticfinal String YUAN = "元";

      public staticfinal String JIAO = "角";

      public staticfinal String FEN = "分";

      public staticfinal String DOT = ".";

     

      private staticSimpleMoneyFormat formatter = null;

      privateHashMap chineseNumberMap = new HashMap();

      privateHashMap chineseMoneyPattern = new HashMap();

      privateNumberFormat numberFormat = NumberFormat.getInstance();

     

      privateSimpleMoneyFormat() {

        numberFormat.setMaximumFractionDigits(4);

       numberFormat.setMinimumFractionDigits(2);

       numberFormat.setGroupingUsed(false);

     

       chineseNumberMap.put("0", ZERO);

       chineseNumberMap.put("1", ONE);

       chineseNumberMap.put("2", TWO);

       chineseNumberMap.put("3", THREE);

       chineseNumberMap.put("4", FOUR);

       chineseNumberMap.put("5", FIVE);

       chineseNumberMap.put("6", SIX);

       chineseNumberMap.put("7", SEVEN);

       chineseNumberMap.put("8", EIGHT);

       chineseNumberMap.put("9", NINE);

       chineseNumberMap.put(DOT, DOT);

     

       chineseMoneyPattern.put("1", TEN);

       chineseMoneyPattern.put("2", HUNDRED);

       chineseMoneyPattern.put("3", THOUSAND);

       chineseMoneyPattern.put("4", TEN_THOUSAND);

       chineseMoneyPattern.put("5", TEN);

       chineseMoneyPattern.put("6", HUNDRED);

       chineseMoneyPattern.put("7", THOUSAND);

       chineseMoneyPattern.put("8", HUNDRED_MILLION);

      }

     

      public staticSimpleMoneyFormat getInstance() {

        if(formatter == null)

          formatter= new SimpleMoneyFormat();

        returnformatter;

      }

     

      public Stringformat(String moneyStr) {

       checkPrecision(moneyStr);

        Stringresult;

        result =convertToChineseNumber(moneyStr);

        result =addUnitsToChineseMoneyString(result);

        returnresult;

      }

     

      public Stringformat(double moneyDouble) {

        returnformat(numberFormat.format(moneyDouble));

      }

     

      public Stringformat(int moneyInt) {

        returnformat(numberFormat.format(moneyInt));

      }

     

      public Stringformat(long moneyLong) {

        returnformat(numberFormat.format(moneyLong));

      }

     

      public Stringformat(Number moneyNum) {

        returnformat(numberFormat.format(moneyNum));

      }

     

      private StringconvertToChineseNumber(String moneyStr) {

        Stringresult;

        StringBuffercMoneyStringBuffer = new StringBuffer();

        for (int i =0; i < moneyStr.length(); i++) {

         cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i +1)));

        }

        //拾佰仟万亿等都是汉字里面才有的单位,加上它们

        intindexOfDot = cMoneyStringBuffer.indexOf(DOT);

        intmoneyPatternCursor = 1;

        for (int i =indexOfDot - 1; i > 0; i--) {

         cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY +moneyPatternCursor));

         moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor +1;

        }

     

        StringfractionPart = cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."));

       cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."),cMoneyStringBuffer.length());

        while(cMoneyStringBuffer.indexOf("零拾") != -1) {

         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"),cMoneyStringBuffer.indexOf("零拾") + 2, ZERO);

        }

        while(cMoneyStringBuffer.indexOf("零佰") != -1) {

         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"),cMoneyStringBuffer.indexOf("零佰") + 2, ZERO);

        }

        while(cMoneyStringBuffer.indexOf("零仟") != -1) {

         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"),cMoneyStringBuffer.indexOf("零仟") + 2, ZERO);

        }

        while(cMoneyStringBuffer.indexOf("零万") != -1) {

         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"),cMoneyStringBuffer.indexOf("零万") + 2,TEN_THOUSAND);

        }

        while(cMoneyStringBuffer.indexOf("零亿") != -1) {

         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"),cMoneyStringBuffer.indexOf("零亿") + 2,HUNDRED_MILLION);

        }

        while(cMoneyStringBuffer.indexOf("零零") != -1) {

         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"),cMoneyStringBuffer.indexOf("零零") + 2, ZERO);

        }

        if(cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1)

         cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1,cMoneyStringBuffer.length());

       cMoneyStringBuffer.append(fractionPart);

     

        result =cMoneyStringBuffer.toString();

        returnresult;

      }

     

     

      private StringaddUnitsToChineseMoneyString(String moneyStr) {

        Stringresult;

        StringBuffercMoneyStringBuffer = new StringBuffer(moneyStr);

        intindexOfDot = cMoneyStringBuffer.indexOf(DOT);

       cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN);[/hidden]

     

     

    欢迎加入更多J2EE面试题……

     

    更多相关面试题请参阅这里:

    一道有趣的C#考试题目

    某公司招收.net高级程序员的试卷

    .Net面试题集(最全最新)(欢迎加入更多.Net 面试题)

    Google:21道能力倾向测试面试题

    GOOGLE面试题

    Google的面试题,你能做出多少?

    据说是阿尔卡特(中国)的面试题目(C)

    世界大公司面试题——微软的面试题

    世界大公司面试题——微软的面试题(答案)

    成为编程高手的基础素养

    微软面试题——微软的智力题——三个灯泡

    Java面试题汇总及c/c++面试题(最新最全)

    J2EE面试题集(附答案)

    Java常见面试题集--面试题全面综合(一)

    Java常见面试题集--面试题全面综合(二)

    Java面试题集(欢迎大家踊跃提供)

    .Net面试题集(最全最新)(欢迎加入更多.Net 面试题)

     

    更多相关面试试题

    更多面试题请点击左侧的相关内容主题……

     

    J2EE面试题集(附答案)  J2EE认证试题集

    Tags: J2EE面试题集锦(附答案), J2EE面试题 , JAVA面试题 , J2EE常见面试题

    上一篇: Java面试题集(欢迎提供更多Java面试题)

    下一篇: Java面试题(最新最全Java面试题汇总)

    评论(12) | 引用(0) | 阅读(32204)

    引用地址:

    注意: 该地址仅在今日23:59:59之前有效

    travel Says:

    2008/03/19 00:13

    2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

    测试过了,数字自己再转换吧。(小数还没处理,看个想法吧 )

    public class NumToChinese {

        publicstatic void main(String[] args) {

        //StringnumberString = args[1];//args[0] is the class name "NumToChinese"

        StringnumberString = "123400567089";

       System.out.println("original number is :"+numberString); 

        char[] numberChar= numberString.toCharArray();

        int length =numberString.length();

        String[]chineseChar = new String[length];

       chineseChar[0]="";

        for (int i =1;i<length; i++){

           switch(i%8)  {

            case 1:chineseChar[i]="十";break;

            case 2: chineseChar[i]="百";break;

            case 3:chineseChar[i]="千";break;

            case 4:chineseChar[i]="万";break;

            case 5:chineseChar[i]="十";break;

            case 6:chineseChar[i]="百";break;

            case 7:chineseChar[i]="千";break;

            case 0:chineseChar[i]="亿";

        }

    }

       StringBufferresult = new StringBuffer();

        for (intj=0;j<length;j++){

            charfirst = numberChar[j];

            Stringsecond = chineseChar[length-1-j];

            if(first!='0')     

               result.append(first).append(second);

           else {

                if(((length-1-j)%4)==0)

                   result.append(second);

                else{

                   String temp = result.substring(result.length()-1);

                   if(!temp.equals("零")) result.append("零");

                }

            }

        }

       System.out.println("the reversed chinese number is :"+result.toString());

      }

     

    }

    牛发癫 Says:

    2008/03/10 11:29

    好东西,不顶就对不住你了

    不 Says: 

    2007/11/02 16:09

    谢谢

    skyfire82 Says: 

    2007/08/27 13:46

    好东西  顶

    dfdsfdsf Says: 

    2007/08/26 19:09

    dcffd

    acici Says: 

    2007/08/12 09:57

    查看详情

    chenzhengrong Says: 

    2007/08/10 10:43

    太叼了!!!

    网魂工作室 Says: 

    2006/04/04 10:14

    11.

    interface Playable {

        void play();

    }

    interface Bounceable {

        void play();

    }

    interface Rollable extends Playable, Bounceable {

        Ball ball =new Ball(\"PingPang\");

    }

    class Ball implements Rollable {

        privateString name;

        publicString getName() {

            returnname;

        }

        publicBall(String name) {

           this.name = name;       

        }

       public voidplay() {

            ball =new Ball(\"Football\");

           System.out.println(ball.getName());

        }

    }

    这个错误不容易发现。

    答案: 错。\"interface Rollableextends Playable, Bounceable\"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的\"Ball ball = new Ball(\"PingPang\");\"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说\"Ball ball = new Ball(\"PingPang\");\"实际上是\"public static final Ball ball = newBall(\"PingPang\");\"。在Ball类的Play()方法中,\"ball = newBall(\"Football\");\"改变了ball的reference,而这里的ball来自Rollableinterface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在\"ball = new Ball(\"Football\");\"这里显示有错。

    网魂工作室 Says: 

    2006/04/04 10:14

    8.

    public class Something {

         publicstatic void main(String[] args) {

           Something s = new Something();

           System.out.println(\"s.doSomething() returns \" +doSomething());

        }

        publicString doSomething() {

            return\"Do something ...\";

        }

    }

    看上去很完美。

    答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成\"System.out.println(\"s.doSomething() returns \" +s.doSomething());\"。同理,static method不能访问non-static instant variable。

    9.

    此处,Something类的文件名叫OtherThing.java

    class Something {

        privatestatic void main(String[] something_to_do) {       

           System.out.println(\"Do something ...\");

        }

    }

    这个好像很明显。

    答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。

    10.

    interface  A{

       int x = 0;

    }

    class B{

       int x =1;

    }

    class C extends B implements A {

       public voidpX(){

         System.out.println(x);

       }

       public staticvoid main(String[] args) {

          newC().pX();

       }

    }

    答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时importjava.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。

     

    网魂工作室 Says: 

    2006/04/04 10:13

     

    6.

    class Something {

        int i;

        public voiddoSomething() {

           System.out.println(\"i = \" + i);

        }

    }

    有什么错呢? 看不出来啊。

    答案: 正确。输出的是\"i = 0\"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有defaultvalue。int的default value是0。

    7.

    class Something {

        final int i;

        public voiddoSomething() {

           System.out.println(\"i = \" + i);

        }

    }

    和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?

    答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instantvariable没有default value,必须在constructor(构造器)结束之前被赋予一个明确的值。可以修改为\"finalint i = 0;\"。

    展开全文
  • 牛客网java刷题02

    2021-01-07 09:31:01
    1、下面哪段程序能够正确的实现GBK编码字节流到UTF-8编码字节流...2、下面哪些类可以被继承? 3、List、set、Map都继承自继承Collection接口 4、下面哪个选项正确创建socket连接 5、以下说法中正确的有? ...
  • Java基础地的题目.doc

    2020-11-21 08:55:01
    实用标准文案 下面哪些类可以被继承? java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T) 面向对象的特征有...
  • 下面哪些类可以被继承? &lt;!----&gt; Java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader ...
  • 外界所访问到,有一种权限的控制功能,OC中有四种访问权限修饰符:public,default,protected,private,访问权限一次递减的,这样我们在定义的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,...
  • J2EE面试题之二

    2017-08-11 18:18:00
    一、基础问答 ...下面哪些类可以被继承?  java.lang.Thread (T)  java.lang.Number (T)  java.lang.Double (F)  java.lang.Math (F)  java.lang.Void (F)  java.lang.Class (F)  java.lang.Cla...
  • java 面试题

    2011-09-09 22:35:56
    、基础问答  1.下面哪些类可以被继承?  java.lang.Thread (T)  java.lang.Number (T)  java.lang.Double (F)  java.lang.Math (F)  java.lang.Void
  • 2.20Java专项测试复盘

    2020-02-20 14:26:33
    对于非运行时异常,程序中一般可不做处理,由java虚拟机自动进行处理。...下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader...
  • java面试题1

    2017-11-13 00:04:00
    下面哪些类可以被继承?  java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T)  2.抽...
  • 前因: 记录在牛客上刷题的错题记事本 1. 下面关于volatile的功能说法正确的是哪个 A : 原子性 B : 有序性 C : 可见性 ...2. 下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lan...
  • JAVA EE 面试题

    2016-07-23 11:05:33
     JAVAEE面试题集锦(附答案) ...下面哪些类可以被继承?  java.lang.Thread (T)  java.lang.Number (T)  java.lang.Double (F)  java.lang.Math(F)  java.lang.Void(F)  java.lang.Class(F)  java.l
  • j2ee 面试

    2013-12-19 16:44:16
    J2EE面试题集锦(附答案) 分类: J2EE2008-05-08 20:34 274人阅读 评论(1) 收藏 举报 ...面试...下面哪些类可以被继承?   Java.lang.Thread (T)  java.lang.Number (T)  java.lan
  • javaee面试题(一)

    2012-09-07 21:27:13
    1.下面哪些类可以被继承?  java.lang.Thread (T)  java.lang.Number (T)  java.lang.Double (F)  java.lang.Math (F)  java.lang.Void (F)  java.lang.Class (F)  java.lang.ClassLoader (T) 2....
  • java基础

    2011-12-02 13:08:54
    下面哪些类可以被继承?  java.lang.Thread (T)  java.lang.Number (T)  java.lang.Double (F)  java.lang.Math (F)  java.lang.Void (F)  java.lang.Class (F)  java.lang.ClassLoader (T)  2.抽象...
  • 下面哪些类可以被继承?  java.lang.Thread (T)  java.lang.Number (T)  java.lang.Double (F)  java.lang.Math (F)  java.lang.Void (F)  java.lang.Class (F)  java.lang.ClassLoader (T
  • JAVA面试题

    2011-11-09 19:06:16
    1.下面哪些类可以被继承? java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T) 2....
  • 下面哪些类可以被继承?  java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T)  2.抽象类和接...
  • Java EE面试题

    2010-08-09 23:52:00
    1.下面哪些类可以被继承?  Java.lang.Thread (T)  java.lang.Number (T)  java.lang.Double (F)  java.lang.Math (F)  java.lang.Void (F)  java.lang.Class (F)  ...
  • J2EE面试常见试题

    2013-10-09 18:54:00
    下面哪些类可以被继承? java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T)  2.抽...
  • 最全面的j2ee面试题

    2009-03-12 22:49:00
    下面哪些类可以被继承?java.lang.Thread (T)java.lang.Number (T)java.lang.Double (F)java.lang.Math (F)java.lang.Void (F)java.lang.Class (F)java.lang.ClassLoader (T)2.抽象类和接口的区别(1)接口可以被多重...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 250
精华内容 100
关键字:

下面哪些类可以被继承